diff --git a/README.md b/README.md
index 1ba2c7a4c..e5ba6617b 100644
--- a/README.md
+++ b/README.md
@@ -1,116 +1,38 @@
-Assignment 3 - Persistence: Two-tier Web Application with Database, Express server, and CSS template
-===
+## Chore Logger
-Due: September 22nd, by 11:59 AM.
+https://a3-yasmine-aoua.glitch.me
-This assignnment continues where we left off, extending it to use the most popular Node.js server framework (express),
-a database (mongodb), and a CSS application framework / template of your choice (Boostrap, Material Design, Semantic UI, Pure etc.)
+This application is a chore logging application that allows a user to select the chore they completed and enter the number of hours they took to complete it. I faced a variety of
+challenges when making this application. The first problem I ran into was getting the authentication working and learning the CSS framework I chose. I just used a basic authentication
+method of creating a unique username and a password in my database and checking that when a user enters login information that it matches an entry in the table. I chose this because I
+did not have the time to try to figure out a more complex, secure method such as OAuth. I used the Fomatic-UI CSS framework becuase its description says it makes beautiful websites
+fast. I editted the spacing and color scheme of the elements I used to match the following colors:
+
-Baseline Requirements
----
-
-Your application is required to implement the following functionalities:
-
-- a `Server`, created using Express (no alternatives will be accepted for this assignment)
-- a `Results` functionality which shows all data associated with a logged in user (except passwords)
-- a `Form/Entry` functionality which allows users to add, modify, and delete data items (must be all three!) associated with their user name / account.
-- Use of at least five [Express middleware packages](https://expressjs.com/en/resources/middleware.html). Explore! One of these five middleware
-can be a custom function that you write yourself; if you choose to do this, make sure to describe what this function is in your README.
-- Persistent data storage in between server sessions using [mongodb](https://www.mongodb.com/cloud/atlas)
-- Use of a [CSS framework or template](https://github.com/troxler/awesome-css-frameworks).
-This should do the bulk of your styling/CSS for you and be appropriate to your application.
-For example, don't use [NES.css](https://nostalgic-css.github.io/NES.css/) (which is awesome!) unless you're creating a game or some type of retro 80s site.
-
-Your application is required to demonstrate the use of the following concepts:
-
-HTML:
-- HTML input tags and form fields of various flavors (`
';
+ }
+ return {
+ title : args.title,
+ content: args.content,
+ actions: [{
+ text: settings.text.ok,
+ class: settings.className.ok,
+ click: function(){
+ var settings = $this.get.settings(),
+ inputField = $this.get.element().find(settings.selector.prompt)[0]
+ ;
+ args.handler($(inputField).val());
+ }
+ },{
+ text: settings.text.cancel,
+ class: settings.className.cancel,
+ click: function(){args.handler(null)}
+ }]
+ }
+ }
+}
+
+})( jQuery, window, document );
diff --git a/public/dist/components/modal.min.css b/public/dist/components/modal.min.css
new file mode 100644
index 000000000..3a4aaa413
--- /dev/null
+++ b/public/dist/components/modal.min.css
@@ -0,0 +1,9 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Modal
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */.ui.modal{position:absolute;display:none;z-index:1001;text-align:left;background:#fff;border:none;-webkit-box-shadow:1px 3px 3px 0 rgba(0,0,0,.2),1px 3px 15px 2px rgba(0,0,0,.2);box-shadow:1px 3px 3px 0 rgba(0,0,0,.2),1px 3px 15px 2px rgba(0,0,0,.2);-webkit-transform-origin:50% 25%;transform-origin:50% 25%;-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;border-radius:.28571429rem;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text;will-change:top,left,margin,transform,opacity}.ui.modal>.dimmer:first-child+:not(.close),.ui.modal>.dimmer:first-child+i.icon+*,.ui.modal>:first-child:not(.close):not(.dimmer),.ui.modal>i.icon:first-child+*{border-top-left-radius:.28571429rem;border-top-right-radius:.28571429rem}.ui.modal>:last-child{border-bottom-left-radius:.28571429rem;border-bottom-right-radius:.28571429rem}.ui.modal>.ui.dimmer{border-radius:inherit}.ui.modal>.close{cursor:pointer;position:absolute;top:-2.5rem;right:-2.5rem;z-index:1;opacity:.8;font-size:1.25em;color:#fff;width:2.25rem;height:2.25rem;padding:.625rem 0 0 0}.ui.modal>.close:hover{opacity:1}.ui.modal>.header{display:block;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;background:#fff;margin:0;padding:1.25rem 1.5rem;-webkit-box-shadow:none;box-shadow:none;color:rgba(0,0,0,.85);border-bottom:1px solid rgba(34,36,38,.15)}.ui.modal>.header:not(.ui){font-size:1.42857143rem;line-height:1.28571429em;font-weight:700}.ui.modal>.content{display:block;width:100%;font-size:1em;line-height:1.4;padding:1.5rem;background:#fff}.ui.modal>.image.content{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.ui.modal>.content>.image{display:block;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;width:'';-ms-flex-item-align:start;align-self:start;max-width:100%}.ui.modal>[class*="top aligned"]{-ms-flex-item-align:start;align-self:start}.ui.modal>[class*="middle aligned"]{-ms-flex-item-align:center;align-self:center}.ui.modal>[class*=stretched]{-ms-flex-item-align:stretch;align-self:stretch}.ui.modal>.content>.description{display:block;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;min-width:0;-ms-flex-item-align:start;align-self:start}.ui.modal>.content>.image+.description,.ui.modal>.content>i.icon+.description{-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;min-width:'';width:auto;padding-left:2em}.ui.modal>.content>.image>i.icon{margin:0;opacity:1;width:auto;line-height:1;font-size:8rem}.ui.modal>.actions{background:#f9fafb;padding:1rem 1rem;border-top:1px solid rgba(34,36,38,.15);text-align:right}.ui.modal .actions>.button:not(.fluid){margin-left:.75em}.ui.basic.modal>.actions{border-top:none}.ui.modal>.center.aligned,.ui.modal>.centered{text-align:center}.ui.modal>.center.aligned.actions>.button:not(.fluid),.ui.modal>.centered.actions>.button:not(.fluid){margin-left:.5em;margin-right:.5em}@media only screen and (max-width:767.98px){.ui.modal:not(.fullscreen){width:95%;margin:0}}@media only screen and (min-width:768px){.ui.modal:not(.fullscreen){width:88%;margin:0}}@media only screen and (min-width:992px){.ui.modal:not(.fullscreen){width:850px;margin:0}}@media only screen and (min-width:1200px){.ui.modal:not(.fullscreen){width:900px;margin:0}}@media only screen and (min-width:1920px){.ui.modal:not(.fullscreen){width:950px;margin:0}}@media only screen and (max-width:991.98px){.ui.modal>.close+.header{padding-right:2.25rem}.ui.modal>.close{top:1.0535rem;right:1rem;color:rgba(0,0,0,.87)}}@media only screen and (max-width:767.98px){.ui.modal>.header{padding:.75rem 1rem}.ui.modal>.close+.header{padding-right:2.25rem}.ui.overlay.fullscreen.modal>.content.content.content{min-height:calc(100vh - 8.1rem)}.ui.overlay.fullscreen.modal>.scrolling.content.content.content{max-height:calc(100vh - 8.1rem)}.ui.modal>.content{display:block;padding:1rem!important}.ui.modal>.close{top:.5rem!important;right:.5rem!important}.ui.modal .image.content{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.ui.modal>.content>.image{display:block;max-width:100%;margin:0 auto!important;text-align:center;padding:0 0 1rem!important}.ui.modal>.content>.image>i.icon{font-size:5rem;text-align:center}.ui.modal>.content>.description{display:block;width:100%!important;margin:0!important;padding:1rem 0!important;-webkit-box-shadow:none;box-shadow:none}.ui.modal>.actions{padding:1rem 1rem 0!important}.ui.modal .actions>.button,.ui.modal .actions>.buttons{margin-bottom:1rem}}.ui.inverted.dimmer>.ui.modal{-webkit-box-shadow:1px 3px 10px 2px rgba(0,0,0,.2);box-shadow:1px 3px 10px 2px rgba(0,0,0,.2)}.ui.basic.modal{background-color:transparent;border:none;border-radius:0;-webkit-box-shadow:none!important;box-shadow:none!important;color:#fff}.ui.basic.modal>.actions,.ui.basic.modal>.content,.ui.basic.modal>.header{background-color:transparent}.ui.basic.modal>.header{color:#fff;border-bottom:none}.ui.basic.modal>.close{top:1rem;right:1.5rem;color:#fff}.ui.inverted.dimmer>.basic.modal{color:rgba(0,0,0,.87)}.ui.inverted.dimmer>.ui.basic.modal>.header{color:rgba(0,0,0,.85)}.ui.legacy.legacy.modal,.ui.legacy.legacy.page.dimmer>.ui.modal{left:50%!important}.ui.legacy.legacy.modal:not(.aligned),.ui.legacy.legacy.page.dimmer>.ui.modal:not(.aligned){top:50%}.ui.legacy.legacy.page.dimmer>.ui.scrolling.modal:not(.aligned),.ui.page.dimmer>.ui.scrolling.legacy.legacy.modal:not(.aligned),.ui.top.aligned.dimmer>.ui.legacy.legacy.modal:not(.aligned),.ui.top.aligned.legacy.legacy.page.dimmer>.ui.modal:not(.aligned){top:auto}.ui.legacy.overlay.fullscreen.modal{margin-top:-2rem!important}.ui.loading.modal{display:block;visibility:hidden;z-index:-1}.ui.active.modal{display:block}.modals.dimmer .ui.top.aligned.modal{top:5vh}.modals.dimmer .ui.bottom.aligned.modal{bottom:5vh}@media only screen and (max-width:767.98px){.modals.dimmer .ui.top.aligned.modal{top:1rem}.modals.dimmer .ui.bottom.aligned.modal{bottom:1rem}}.scrolling.dimmable.dimmed{overflow:hidden}.scrolling.dimmable>.dimmer{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;position:fixed}.scrolling.dimmable.dimmed>.dimmer{overflow:auto;-webkit-overflow-scrolling:touch}.modals.dimmer .ui.scrolling.modal:not(.fullscreen){margin:2rem auto}.modals.dimmer .ui.scrolling.modal:not([class*="overlay fullscreen"])::after{content:'\00A0';position:absolute;height:2rem}.scrolling.undetached.dimmable.dimmed{overflow:auto;-webkit-overflow-scrolling:touch}.scrolling.undetached.dimmable.dimmed>.dimmer{overflow:hidden}.scrolling.undetached.dimmable .ui.scrolling.modal:not(.fullscreen){position:absolute;left:50%}.ui.modal>.scrolling.content{max-height:calc(80vh - 10rem);overflow:auto}.ui.overlay.fullscreen.modal>.content{min-height:calc(100vh - 9.1rem)}.ui.overlay.fullscreen.modal>.scrolling.content{max-height:calc(100vh - 9.1rem)}.ui.fullscreen.modal{width:95%;left:2.5%;margin:1em auto}.ui.overlay.fullscreen.modal{width:100%;left:0;margin:0 auto;top:0;border-radius:0}.ui.fullscreen.modal>.close+.header:not(.centered):not(.center):not(.icon),.ui.modal>.close.inside+.header:not(.centered):not(.center):not(.icon){padding-right:2.25rem}.ui.fullscreen.modal>.close,.ui.modal>.close.inside{top:1.0535rem;right:1rem;color:rgba(0,0,0,.87)}.ui.basic.fullscreen.modal>.close{color:#fff}.ui.modal{font-size:1rem}.ui.mini.modal>.header:not(.ui){font-size:1.3em}@media only screen and (max-width:767.98px){.ui.mini.modal{width:95%;margin:0}}@media only screen and (min-width:768px){.ui.mini.modal{width:35.2%;margin:0}}@media only screen and (min-width:992px){.ui.mini.modal{width:340px;margin:0}}@media only screen and (min-width:1200px){.ui.mini.modal{width:360px;margin:0}}@media only screen and (min-width:1920px){.ui.mini.modal{width:380px;margin:0}}.ui.tiny.modal>.header:not(.ui){font-size:1.3em}@media only screen and (max-width:767.98px){.ui.tiny.modal{width:95%;margin:0}}@media only screen and (min-width:768px){.ui.tiny.modal{width:52.8%;margin:0}}@media only screen and (min-width:992px){.ui.tiny.modal{width:510px;margin:0}}@media only screen and (min-width:1200px){.ui.tiny.modal{width:540px;margin:0}}@media only screen and (min-width:1920px){.ui.tiny.modal{width:570px;margin:0}}.ui.small.modal>.header:not(.ui){font-size:1.3em}@media only screen and (max-width:767.98px){.ui.small.modal{width:95%;margin:0}}@media only screen and (min-width:768px){.ui.small.modal{width:70.4%;margin:0}}@media only screen and (min-width:992px){.ui.small.modal{width:680px;margin:0}}@media only screen and (min-width:1200px){.ui.small.modal{width:720px;margin:0}}@media only screen and (min-width:1920px){.ui.small.modal{width:760px;margin:0}}.ui.large.modal>.header:not(.ui){font-size:1.6em}@media only screen and (max-width:767.98px){.ui.large.modal{width:95%;margin:0}}@media only screen and (min-width:768px){.ui.large.modal{width:88%;margin:0}}@media only screen and (min-width:992px){.ui.large.modal{width:1020px;margin:0}}@media only screen and (min-width:1200px){.ui.large.modal{width:1080px;margin:0}}@media only screen and (min-width:1920px){.ui.large.modal{width:1140px;margin:0}}.ui.big.modal>.header:not(.ui){font-size:1.6em}@media only screen and (max-width:767.98px){.ui.big.modal{width:95%;margin:0}}@media only screen and (min-width:768px){.ui.big.modal{width:88%;margin:0}}@media only screen and (min-width:992px){.ui.big.modal{width:1190px;margin:0}}@media only screen and (min-width:1200px){.ui.big.modal{width:1260px;margin:0}}@media only screen and (min-width:1920px){.ui.big.modal{width:1330px;margin:0}}.ui.huge.modal>.header:not(.ui){font-size:1.6em}@media only screen and (max-width:767.98px){.ui.huge.modal{width:95%;margin:0}}@media only screen and (min-width:768px){.ui.huge.modal{width:88%;margin:0}}@media only screen and (min-width:992px){.ui.huge.modal{width:1360px;margin:0}}@media only screen and (min-width:1200px){.ui.huge.modal{width:1440px;margin:0}}@media only screen and (min-width:1920px){.ui.huge.modal{width:1520px;margin:0}}.ui.massive.modal>.header:not(.ui){font-size:1.8em}@media only screen and (max-width:767.98px){.ui.massive.modal{width:95%;margin:0}}@media only screen and (min-width:768px){.ui.massive.modal{width:88%;margin:0}}@media only screen and (min-width:992px){.ui.massive.modal{width:1530px;margin:0}}@media only screen and (min-width:1200px){.ui.massive.modal{width:1620px;margin:0}}@media only screen and (min-width:1920px){.ui.massive.modal{width:1710px;margin:0}}.ui.inverted.modal{background:rgba(0,0,0,.9)}.ui.inverted.modal>.content,.ui.inverted.modal>.header{background:rgba(0,0,0,.9);color:#fff}.ui.inverted.modal>.actions{background:#191a1b;border-top:1px solid rgba(34,36,38,.85);color:#fff}.ui.inverted.dimmer>.modal>.close{color:rgba(0,0,0,.85)}@media only screen and (max-width:991.98px){.ui.dimmer .inverted.modal>.close{color:#fff}}.ui.inverted.fullscreen.modal>.close,.ui.inverted.modal>.close.inside{color:#fff}
\ No newline at end of file
diff --git a/public/dist/components/modal.min.js b/public/dist/components/modal.min.js
new file mode 100644
index 000000000..ae599be8c
--- /dev/null
+++ b/public/dist/components/modal.min.js
@@ -0,0 +1,11 @@
+/*
+ * # Fomantic UI - 2.8.8
+ * https://github.com/fomantic/Fomantic-UI
+ * http://fomantic-ui.com/
+ *
+ * Copyright 2021 Contributors
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+!function(B,R,P,W){"use strict";B.isFunction=B.isFunction||function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},R=void 0!==R&&R.Math==Math?R:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),B.fn.modal=function(T){var A,e=B(this),H=B(R),D=B(P),O=B("body"),E=e.selector||"",L=(new Date).getTime(),N=[],z=T,j="string"==typeof z,q=[].slice.call(arguments,1),I=R.requestAnimationFrame||R.mozRequestAnimationFrame||R.webkitRequestAnimationFrame||R.msRequestAnimationFrame||function(e){setTimeout(e,0)};return e.each(function(){var o,s,e,i,n,a,c,t,r,l,d,u=B.isPlainObject(T)?B.extend(!0,{},B.fn.modal.settings,T):B.extend({},B.fn.modal.settings),m=u.selector,f=u.className,h=u.namespace,g=u.fields,p=u.error,v="."+h,b="module-"+h,y=B(this),x=B(u.context),k=y.find(m.close),w=this,C=y.hasClass("modal")?y.data(b):W,S=!1,F="",M="";d={initialize:function(){if(y.hasClass("modal")||(d.create.modal(),B.isFunction(u.onHidden)||(u.onHidden=function(){d.destroy(),y.remove()})),y.addClass(u.class),""!==u.title&&y.find(m.title).html(d.helpers.escape(u.title,u.preserveHTML)).addClass(u.classTitle),""!==u.content&&y.find(m.content).html(d.helpers.escape(u.content,u.preserveHTML)).addClass(u.classContent),d.has.configActions()){var s=y.find(m.actions).addClass(u.classActions);0===s.length?s=B("
",{class:f.actions+" "+(u.classActions||"")}).appendTo(y):s.empty(),u.actions.forEach(function(e){var t=e[g.icon]?' ':"",n=d.helpers.escape(e[g.text]||"",u.preserveHTML),i=d.helpers.deQuote(e[g.class]||""),o=e[g.click]&&B.isFunction(e[g.click])?e[g.click]:function(){};s.append(B(" ",{html:t+n,class:f.button+" "+i,click:function(){!1!==o.call(w,y)&&d.hide()}}))})}d.cache={},d.verbose("Initializing dimmer",x),d.create.id(),d.create.dimmer(),u.allowMultiple&&d.create.innerDimmer(),u.centered||y.addClass("top aligned"),d.refreshModals(),d.bind.events(),u.observeChanges&&d.observeChanges(),d.instantiate(),u.autoShow&&d.show()},instantiate:function(){d.verbose("Storing instance of modal"),C=d,y.data(b,C)},create:{modal:function(){y=B("
",{class:f.modal}),u.closeIcon&&(k=B(" ",{class:f.close}),y.append(k)),""!==u.title&&B("
",{class:f.title}).appendTo(y),""!==u.content&&B("
",{class:f.content}).appendTo(y),d.has.configActions()&&B("
",{class:f.actions}).appendTo(y),x.append(y)},dimmer:function(){var e={debug:u.debug,dimmerName:"modals"},t=B.extend(!0,e,u.dimmerSettings);B.fn.dimmer!==W?(d.debug("Creating dimmer"),i=x.dimmer(t),u.detachable?(d.verbose("Modal is detachable, moving content into dimmer"),i.dimmer("add content",y)):d.set.undetached(),n=i.dimmer("get dimmer")):d.error(p.dimmer)},id:function(){r=(Math.random().toString(16)+"000000000").substr(2,8),t="."+r,d.verbose("Creating unique id for element",r)},innerDimmer:function(){0==y.find(m.dimmer).length&&y.prepend('
')}},destroy:function(){l&&l.disconnect(),d.verbose("Destroying previous modal"),y.removeData(b).off(v),H.off(t),n.off(t),k.off(v),x.dimmer("destroy")},observeChanges:function(){"MutationObserver"in R&&((l=new MutationObserver(function(e){d.debug("DOM tree modified, refreshing"),d.refresh()})).observe(w,{childList:!0,subtree:!0}),d.debug("Setting up mutation observer",l))},refresh:function(){d.remove.scrolling(),d.cacheSizes(),d.can.useFlex()||d.set.modalOffset(),d.set.screenHeight(),d.set.type()},refreshModals:function(){s=y.siblings(m.modal),o=s.add(y)},attachEvents:function(e,t){var n=B(e);t=B.isFunction(d[t])?d[t]:d.toggle,0=e.clientX))&&d.verbose("Mouse down event registered inside the scrollbar")},mouseup:function(e){if(u.closable)if(a)d.debug("Dimmer clicked but mouse down was initially registered inside the modal");else if(c)d.debug("Dimmer clicked but mouse down was initially registered inside the scrollbar");else{var t=0":">",'"':""","'":"'","`":"`"};return/[&<>"'`]/.test(e)?(e=e.replace(/&(?![a-z0-9#]{1,6};)/,"&")).replace(/[<>"'`]/g,function(e){return n[e]}):e}},can:{leftBodyScrollbar:function(){return d.cache.leftBodyScrollbar===W&&(d.cache.leftBodyScrollbar=d.is.rtl()&&(d.is.iframe&&!d.is.firefox()||d.is.safari()||d.is.edge()||d.is.ie())),d.cache.leftBodyScrollbar},useFlex:function(){return"auto"===u.useFlex?u.detachable&&!d.is.ie():(u.useFlex&&d.is.ie()?d.debug("useFlex true is not supported in IE"):u.useFlex&&!u.detachable&&d.debug("useFlex true in combination with detachable false is not supported"),u.useFlex)},fit:function(){var e=d.cache.contextHeight,t=d.cache.contextHeight/2,n=d.cache.topOffset,i=d.cache.scrollHeight,o=d.cache.height,s=u.padding;return o .header",content:"> .content",actions:"> .actions",close:"> .close",approve:".actions .positive, .actions .approve, .actions .ok",deny:".actions .negative, .actions .deny, .actions .cancel",modal:".ui.modal",dimmer:"> .ui.dimmer",bodyFixed:"> .ui.fixed.menu, > .ui.right.toast-container, > .ui.right.sidebar, > .ui.fixed.nag, > .ui.fixed.nag > .close",prompt:".ui.input > input"},error:{dimmer:"UI Dimmer, a required component is not included in this page",method:"The method you called is not defined.",notFound:"The element you specified could not be found"},className:{active:"active",animating:"animating",blurring:"blurring",inverted:"inverted",legacy:"legacy",loading:"loading",scrolling:"scrolling",undetached:"undetached",front:"front",close:"close icon",button:"ui button",modal:"ui modal",title:"header",content:"content",actions:"actions",template:"ui tiny modal",ok:"positive",cancel:"negative",prompt:"ui fluid input"},text:{ok:"Ok",cancel:"Cancel"}},B.fn.modal.settings.templates={getArguments:function(e){var t=[].slice.call(e);return B.isPlainObject(t[0])?B.extend({handler:function(){},content:"",title:""},t[0]):(B.isFunction(t[t.length-1])||t.push(function(){}),{handler:t.pop(),content:t.pop()||"",title:t.pop()||""})},alert:function(){var e=this.get.settings(),t=e.templates.getArguments(arguments);return{title:t.title,content:t.content,actions:[{text:e.text.ok,class:e.className.ok,click:t.handler}]}},confirm:function(){var e=this.get.settings(),t=e.templates.getArguments(arguments);return{title:t.title,content:t.content,actions:[{text:e.text.ok,class:e.className.ok,click:function(){t.handler(!0)}},{text:e.text.cancel,class:e.className.cancel,click:function(){t.handler(!1)}}]}},prompt:function(){var n=this,e=this.get.settings(),i=e.templates.getArguments(arguments);return 0===B(B.parseHTML(i.content)).filter(".ui.input").length&&(i.content+='
'),{title:i.title,content:i.content,actions:[{text:e.text.ok,class:e.className.ok,click:function(){var e=n.get.settings(),t=n.get.element().find(e.selector.prompt)[0];i.handler(B(t).val())}},{text:e.text.cancel,class:e.className.cancel,click:function(){i.handler(null)}}]}}}}(jQuery,window,document);
\ No newline at end of file
diff --git a/public/dist/components/nag.css b/public/dist/components/nag.css
new file mode 100644
index 000000000..bc0ea8436
--- /dev/null
+++ b/public/dist/components/nag.css
@@ -0,0 +1,300 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Nag
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+
+/*******************************
+ Nag
+*******************************/
+
+.ui.nag {
+ display: none;
+ opacity: 0.95;
+ position: relative;
+ top: 0;
+ left: 0;
+ z-index: 999;
+ min-height: 0;
+ width: 100%;
+ margin: 0;
+ padding: 0.75em 1em;
+ background: #777777;
+ -webkit-box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.2);
+ box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.2);
+ font-size: 1rem;
+ text-align: center;
+ color: rgba(0, 0, 0, 0.87);
+ border-radius: 0 0 0.28571429rem 0.28571429rem;
+ -webkit-transition: 0.2s background ease;
+ transition: 0.2s background ease;
+}
+a.ui.nag {
+ cursor: pointer;
+}
+.ui.nag > .title {
+ display: inline-block;
+ margin: 0 0.5em;
+ color: #FFFFFF;
+}
+.ui.nag > .close.icon {
+ cursor: pointer;
+ opacity: 0.4;
+ position: absolute;
+ top: 50%;
+ right: 1em;
+ font-size: 1em;
+ margin: -0.5em 0 0;
+ color: #FFFFFF;
+ -webkit-transition: opacity 0.2s ease;
+ transition: opacity 0.2s ease;
+}
+.ui.nag:not(.overlay):not(.fixed) {
+ border-radius: 0.28571429rem;
+}
+
+
+/*******************************
+ States
+*******************************/
+
+
+/* Hover */
+.ui.nag:hover {
+ background: #777777;
+ opacity: 1;
+}
+.ui.nag > .close:hover {
+ opacity: 1;
+}
+
+
+/*******************************
+ Variations
+*******************************/
+
+
+/*--------------
+ Static
+ ---------------*/
+
+.ui.overlay.nags,
+.ui.overlay.nag {
+ position: absolute;
+ display: block;
+}
+
+/*--------------
+ Fixed
+---------------*/
+
+.ui.fixed.nags,
+.ui.fixed.nag {
+ position: fixed;
+}
+
+/*--------------
+ Bottom
+---------------*/
+
+.ui.bottom.nags,
+.ui.bottom.nag {
+ border-radius: 0.28571429rem 0.28571429rem 0 0;
+ top: auto;
+ bottom: 0;
+}
+
+/*--------------
+ Inverted
+---------------*/
+
+.ui.inverted.nags .nag,
+.ui.inverted.nag {
+ background-color: #F3F4F5;
+ color: rgba(0, 0, 0, 0.85);
+}
+.ui.inverted.nags .nag > .close,
+.ui.inverted.nag > .close {
+ color: rgba(0, 0, 0, 0.6);
+}
+.ui.inverted.nags .nag > .title,
+.ui.inverted.nag > .title {
+ color: rgba(0, 0, 0, 0.6);
+}
+
+/*-------------------
+ Sizes
+--------------------*/
+
+.ui.mini.nag,
+.ui.mini.nags .nag {
+ font-size: 0.78571429rem;
+}
+.ui.tiny.nag,
+.ui.tiny.nags .nag {
+ font-size: 0.85714286rem;
+}
+.ui.small.nag,
+.ui.small.nags .nag {
+ font-size: 0.92857143rem;
+}
+.ui.large.nag,
+.ui.large.nags .nag {
+ font-size: 1.14285714rem;
+}
+.ui.big.nag,
+.ui.big.nags .nag {
+ font-size: 1.28571429rem;
+}
+.ui.huge.nag,
+.ui.huge.nags .nag {
+ font-size: 1.42857143rem;
+ line-height: 1;
+}
+.ui.massive.nag,
+.ui.massive.nags .nag {
+ font-size: 1.71428571rem;
+ line-height: 1;
+}
+
+/*--------------
+ Colors
+-------------- */
+
+.ui.primary.nag {
+ background-color: #2185D0;
+}
+.ui.inverted.primary.nag {
+ background-color: #54C8FF;
+}
+.ui.secondary.nag {
+ background-color: #1B1C1D;
+}
+.ui.inverted.secondary.nag {
+ background-color: #545454;
+}
+.ui.red.nag {
+ background-color: #DB2828;
+}
+.ui.inverted.red.nag {
+ background-color: #FF695E;
+}
+.ui.orange.nag {
+ background-color: #F2711C;
+}
+.ui.inverted.orange.nag {
+ background-color: #FF851B;
+}
+.ui.yellow.nag {
+ background-color: #FBBD08;
+}
+.ui.inverted.yellow.nag {
+ background-color: #FFE21F;
+}
+.ui.olive.nag {
+ background-color: #B5CC18;
+}
+.ui.inverted.olive.nag {
+ background-color: #D9E778;
+}
+.ui.green.nag {
+ background-color: #21BA45;
+}
+.ui.inverted.green.nag {
+ background-color: #2ECC40;
+}
+.ui.teal.nag {
+ background-color: #00B5AD;
+}
+.ui.inverted.teal.nag {
+ background-color: #6DFFFF;
+}
+.ui.blue.nag {
+ background-color: #2185D0;
+}
+.ui.inverted.blue.nag {
+ background-color: #54C8FF;
+}
+.ui.violet.nag {
+ background-color: #6435C9;
+}
+.ui.inverted.violet.nag {
+ background-color: #A291FB;
+}
+.ui.purple.nag {
+ background-color: #A333C8;
+}
+.ui.inverted.purple.nag {
+ background-color: #DC73FF;
+}
+.ui.pink.nag {
+ background-color: #E03997;
+}
+.ui.inverted.pink.nag {
+ background-color: #FF8EDF;
+}
+.ui.brown.nag {
+ background-color: #A5673F;
+}
+.ui.inverted.brown.nag {
+ background-color: #D67C1C;
+}
+.ui.grey.nag {
+ background-color: #767676;
+}
+.ui.inverted.grey.nag {
+ background-color: #DCDDDE;
+}
+.ui.black.nag {
+ background-color: #1B1C1D;
+ color: rgba(255, 255, 255, 0.9);
+}
+.ui.inverted.black.nag {
+ background-color: #545454;
+}
+.ui.inverted.black.nag .title {
+ color: #FFFFFF;
+}
+
+
+/*******************************
+ Groups
+*******************************/
+
+.ui.nags {
+ top: 0;
+ left: 0;
+ width: 100%;
+}
+.ui.ui.nags .nag {
+ border-radius: 0;
+}
+.ui.nags:not(.bottom) .nag:last-child {
+ border-radius: 0 0 0.28571429rem 0.28571429rem;
+}
+.ui.bottom.nags .nag:first-child {
+ border-radius: 0.28571429rem 0.28571429rem 0 0;
+}
+.ui.nags:not(.fixed):not(.overlay) .nag:first-child {
+ border-radius: 0.28571429rem 0.28571429rem 0 0;
+}
+.ui.nags:not(.fixed):not(.overlay) .nag:only-child {
+ border-radius: 0.28571429rem;
+}
+
+
+/*******************************
+ Theme Overrides
+*******************************/
+
+
+
+/*******************************
+ User Overrides
+*******************************/
+
diff --git a/public/dist/components/nag.js b/public/dist/components/nag.js
new file mode 100644
index 000000000..e835da773
--- /dev/null
+++ b/public/dist/components/nag.js
@@ -0,0 +1,558 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Nag
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+'use strict';
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.nag = function(parameters) {
+ var
+ $allModules = $(this),
+ moduleSelector = $allModules.selector || '',
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+ returnedValue
+ ;
+ $allModules
+ .each(function() {
+ var
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.fn.nag.settings, parameters)
+ : $.extend({}, $.fn.nag.settings),
+
+ selector = settings.selector,
+ error = settings.error,
+ namespace = settings.namespace,
+
+ eventNamespace = '.' + namespace,
+ moduleNamespace = namespace + '-module',
+
+ $module = $(this),
+
+ $context = (settings.context)
+ ? $(settings.context)
+ : $('body'),
+
+ element = this,
+ instance = $module.data(moduleNamespace),
+ storage,
+ module
+ ;
+ module = {
+
+ initialize: function() {
+ module.verbose('Initializing element');
+ storage = module.get.storage();
+ $module
+ .on('click' + eventNamespace, selector.close, module.dismiss)
+ .data(moduleNamespace, module)
+ ;
+
+ if(settings.detachable && $module.parent()[0] !== $context[0]) {
+ $module
+ .detach()
+ .prependTo($context)
+ ;
+ }
+
+ if(settings.displayTime > 0) {
+ setTimeout(module.hide, settings.displayTime);
+ }
+ module.show();
+ },
+
+ destroy: function() {
+ module.verbose('Destroying instance');
+ $module
+ .removeData(moduleNamespace)
+ .off(eventNamespace)
+ ;
+ },
+
+ show: function() {
+ if( module.should.show() && !$module.is(':visible') ) {
+ if(settings.onShow.call(element) === false) {
+ module.debug('onShow callback returned false, cancelling nag animation');
+ return false;
+ }
+ module.debug('Showing nag', settings.animation.show);
+ if(settings.animation.show === 'fade') {
+ $module
+ .fadeIn(settings.duration, settings.easing, settings.onVisible)
+ ;
+ }
+ else {
+ $module
+ .slideDown(settings.duration, settings.easing, settings.onVisible)
+ ;
+ }
+ }
+ },
+
+ hide: function() {
+ if(settings.onHide.call(element) === false) {
+ module.debug('onHide callback returned false, cancelling nag animation');
+ return false;
+ }
+ module.debug('Hiding nag', settings.animation.hide);
+ if(settings.animation.hide === 'fade') {
+ $module
+ .fadeOut(settings.duration, settings.easing, settings.onHidden)
+ ;
+ }
+ else {
+ $module
+ .slideUp(settings.duration, settings.easing, settings.onHidden)
+ ;
+ }
+ },
+
+ dismiss: function(event) {
+ if(module.hide() !== false && settings.storageMethod) {
+ module.debug('Dismissing nag', settings.storageMethod, settings.key, settings.value, settings.expires);
+ module.storage.set(settings.key, settings.value);
+ }
+ event.stopImmediatePropagation();
+ event.preventDefault();
+ },
+
+ should: {
+ show: function() {
+ if(settings.persist) {
+ module.debug('Persistent nag is set, can show nag');
+ return true;
+ }
+ if( module.storage.get(settings.key) != settings.value.toString() ) {
+ module.debug('Stored value is not set, can show nag', module.storage.get(settings.key));
+ return true;
+ }
+ module.debug('Stored value is set, cannot show nag', module.storage.get(settings.key));
+ return false;
+ }
+ },
+
+ get: {
+ expirationDate: function(expires) {
+ if (typeof expires === 'number') {
+ expires = new Date(Date.now() + expires * 864e5);
+ }
+ if(expires instanceof Date && expires.getTime() ){
+ return expires.toUTCString();
+ } else {
+ module.error(error.expiresFormat);
+ }
+ },
+ storage: function(){
+ if(settings.storageMethod === 'localstorage' && window.localStorage !== undefined) {
+ module.debug('Using local storage');
+ return window.localStorage;
+ }
+ else if(settings.storageMethod === 'sessionstorage' && window.sessionStorage !== undefined) {
+ module.debug('Using session storage');
+ return window.sessionStorage;
+ }
+ else if("cookie" in document) {
+ module.debug('Using cookie');
+ return {
+ setItem: function(key, value, options) {
+ // RFC6265 compliant encoding
+ key = encodeURIComponent(key)
+ .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent)
+ .replace(/[()]/g, escape);
+ value = encodeURIComponent(value)
+ .replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g, decodeURIComponent);
+
+ var cookieOptions = '';
+ for (var option in options) {
+ if (options.hasOwnProperty(option)) {
+ cookieOptions += '; ' + option;
+ if (typeof options[option] === 'string') {
+ cookieOptions += '=' + options[option].split(';')[0];
+ }
+ }
+ }
+ document.cookie = key + '=' + value + cookieOptions;
+ },
+ getItem: function(key) {
+ var cookies = document.cookie.split('; ');
+ for (var i = 0, il = cookies.length; i < il; i++) {
+ var parts = cookies[i].split('='),
+ foundKey = parts[0].replace(/(%[\dA-F]{2})+/gi, decodeURIComponent);
+ if (key === foundKey) {
+ return parts[1] || '';
+ }
+ }
+ },
+ removeItem: function(key, options) {
+ storage.setItem(key,'',options);
+ }
+ };
+ } else {
+ module.error(error.noStorage);
+ }
+ },
+ storageOptions: function() {
+ var
+ options = {}
+ ;
+ if(settings.expires) {
+ options.expires = module.get.expirationDate(settings.expires);
+ }
+ if(settings.domain) {
+ options.domain = settings.domain;
+ }
+ if(settings.path) {
+ options.path = settings.path;
+ }
+ if(settings.secure) {
+ options.secure = settings.secure;
+ }
+ if(settings.samesite) {
+ options.samesite = settings.samesite;
+ }
+ return options;
+ }
+ },
+
+ clear: function() {
+ module.storage.remove(settings.key);
+ },
+
+ storage: {
+ set: function(key, value) {
+ var
+ options = module.get.storageOptions()
+ ;
+ if(storage === window.localStorage && options.expires) {
+ module.debug('Storing expiration value in localStorage', key, options.expires);
+ storage.setItem(key + settings.expirationKey, options.expires );
+ }
+ module.debug('Value stored', key, value);
+ try {
+ storage.setItem(key, value, options);
+ }
+ catch(e) {
+ module.error(error.setItem, e);
+ }
+ },
+ get: function(key) {
+ var
+ storedValue
+ ;
+ storedValue = storage.getItem(key);
+ if(storage === window.localStorage) {
+ var expiration = storage.getItem(key + settings.expirationKey);
+ if(expiration !== null && expiration !== undefined && new Date(expiration) < new Date()) {
+ module.debug('Value in localStorage has expired. Deleting key', key);
+ module.storage.remove(key);
+ storedValue = null;
+ }
+ }
+ if(storedValue == 'undefined' || storedValue == 'null' || storedValue === undefined || storedValue === null) {
+ storedValue = undefined;
+ }
+ return storedValue;
+ },
+ remove: function(key) {
+ var
+ options = module.get.storageOptions()
+ ;
+ options.expires = module.get.expirationDate(-1);
+ if(storage === window.localStorage) {
+ storage.removeItem(key + settings.expirationKey);
+ }
+ storage.removeItem(key, options);
+ }
+ },
+
+ setting: function(name, value) {
+ module.debug('Changing setting', name, value);
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ if($.isPlainObject(settings[name])) {
+ $.extend(true, settings[name], value);
+ }
+ else {
+ settings[name] = value;
+ }
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ module.error(error.method, query);
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ }
+ })
+ ;
+
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.fn.nag.settings = {
+
+ name : 'Nag',
+
+ silent : false,
+ debug : false,
+ verbose : false,
+ performance : true,
+
+ namespace : 'Nag',
+
+ // allows cookie to be overridden
+ persist : false,
+
+ // set to zero to require manually dismissal, otherwise hides on its own
+ displayTime : 0,
+
+ animation : {
+ show : 'slide',
+ hide : 'slide'
+ },
+
+ context : false,
+ detachable : false,
+
+ expires : 30,
+
+// cookie storage only options
+ domain : false,
+ path : '/',
+ secure : false,
+ samesite : false,
+
+ // type of storage to use
+ storageMethod : 'cookie',
+
+ // value to store in dismissed localstorage/cookie
+ key : 'nag',
+ value : 'dismiss',
+
+// Key suffix to support expiration in localstorage
+ expirationKey : 'ExpirationDate',
+
+ error: {
+ noStorage : 'Unsupported storage method',
+ method : 'The method you called is not defined.',
+ setItem : 'Unexpected error while setting value',
+ expiresFormat : '"expires" must be a number of days or a Date Object'
+ },
+
+ className : {
+ bottom : 'bottom',
+ fixed : 'fixed'
+ },
+
+ selector : {
+ close : '> .close.icon'
+ },
+
+ duration : 500,
+ easing : 'easeOutQuad',
+
+ // callback before show animation, return false to prevent show
+ onShow : function() {},
+
+ // called after show animation
+ onVisible : function() {},
+
+ // callback before hide animation, return false to prevent hide
+ onHide : function() {},
+
+ // callback after hide animation
+ onHidden : function() {}
+
+};
+
+// Adds easing
+$.extend( $.easing, {
+ easeOutQuad: function (x, t, b, c, d) {
+ return -c *(t/=d)*(t-2) + b;
+ }
+});
+
+})( jQuery, window, document );
diff --git a/public/dist/components/nag.min.css b/public/dist/components/nag.min.css
new file mode 100644
index 000000000..2f4d8ea65
--- /dev/null
+++ b/public/dist/components/nag.min.css
@@ -0,0 +1,9 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Nag
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */.ui.nag{display:none;opacity:.95;position:relative;top:0;left:0;z-index:999;min-height:0;width:100%;margin:0;padding:.75em 1em;background:#777;-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.2);box-shadow:0 1px 2px 0 rgba(0,0,0,.2);font-size:1rem;text-align:center;color:rgba(0,0,0,.87);border-radius:0 0 .28571429rem .28571429rem;-webkit-transition:.2s background ease;transition:.2s background ease}a.ui.nag{cursor:pointer}.ui.nag>.title{display:inline-block;margin:0 .5em;color:#fff}.ui.nag>.close.icon{cursor:pointer;opacity:.4;position:absolute;top:50%;right:1em;font-size:1em;margin:-.5em 0 0;color:#fff;-webkit-transition:opacity .2s ease;transition:opacity .2s ease}.ui.nag:not(.overlay):not(.fixed){border-radius:.28571429rem}.ui.nag:hover{background:#777;opacity:1}.ui.nag>.close:hover{opacity:1}.ui.overlay.nag,.ui.overlay.nags{position:absolute;display:block}.ui.fixed.nag,.ui.fixed.nags{position:fixed}.ui.bottom.nag,.ui.bottom.nags{border-radius:.28571429rem .28571429rem 0 0;top:auto;bottom:0}.ui.inverted.nag,.ui.inverted.nags .nag{background-color:#f3f4f5;color:rgba(0,0,0,.85)}.ui.inverted.nag>.close,.ui.inverted.nags .nag>.close{color:rgba(0,0,0,.6)}.ui.inverted.nag>.title,.ui.inverted.nags .nag>.title{color:rgba(0,0,0,.6)}.ui.mini.nag,.ui.mini.nags .nag{font-size:.78571429rem}.ui.tiny.nag,.ui.tiny.nags .nag{font-size:.85714286rem}.ui.small.nag,.ui.small.nags .nag{font-size:.92857143rem}.ui.large.nag,.ui.large.nags .nag{font-size:1.14285714rem}.ui.big.nag,.ui.big.nags .nag{font-size:1.28571429rem}.ui.huge.nag,.ui.huge.nags .nag{font-size:1.42857143rem;line-height:1}.ui.massive.nag,.ui.massive.nags .nag{font-size:1.71428571rem;line-height:1}.ui.primary.nag{background-color:#2185d0}.ui.inverted.primary.nag{background-color:#54c8ff}.ui.secondary.nag{background-color:#1b1c1d}.ui.inverted.secondary.nag{background-color:#545454}.ui.red.nag{background-color:#db2828}.ui.inverted.red.nag{background-color:#ff695e}.ui.orange.nag{background-color:#f2711c}.ui.inverted.orange.nag{background-color:#ff851b}.ui.yellow.nag{background-color:#fbbd08}.ui.inverted.yellow.nag{background-color:#ffe21f}.ui.olive.nag{background-color:#b5cc18}.ui.inverted.olive.nag{background-color:#d9e778}.ui.green.nag{background-color:#21ba45}.ui.inverted.green.nag{background-color:#2ecc40}.ui.teal.nag{background-color:#00b5ad}.ui.inverted.teal.nag{background-color:#6dffff}.ui.blue.nag{background-color:#2185d0}.ui.inverted.blue.nag{background-color:#54c8ff}.ui.violet.nag{background-color:#6435c9}.ui.inverted.violet.nag{background-color:#a291fb}.ui.purple.nag{background-color:#a333c8}.ui.inverted.purple.nag{background-color:#dc73ff}.ui.pink.nag{background-color:#e03997}.ui.inverted.pink.nag{background-color:#ff8edf}.ui.brown.nag{background-color:#a5673f}.ui.inverted.brown.nag{background-color:#d67c1c}.ui.grey.nag{background-color:#767676}.ui.inverted.grey.nag{background-color:#dcddde}.ui.black.nag{background-color:#1b1c1d;color:rgba(255,255,255,.9)}.ui.inverted.black.nag{background-color:#545454}.ui.inverted.black.nag .title{color:#fff}.ui.nags{top:0;left:0;width:100%}.ui.ui.nags .nag{border-radius:0}.ui.nags:not(.bottom) .nag:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.bottom.nags .nag:first-child{border-radius:.28571429rem .28571429rem 0 0}.ui.nags:not(.fixed):not(.overlay) .nag:first-child{border-radius:.28571429rem .28571429rem 0 0}.ui.nags:not(.fixed):not(.overlay) .nag:only-child{border-radius:.28571429rem}
\ No newline at end of file
diff --git a/public/dist/components/nag.min.js b/public/dist/components/nag.min.js
new file mode 100644
index 000000000..37e754602
--- /dev/null
+++ b/public/dist/components/nag.min.js
@@ -0,0 +1,11 @@
+/*
+ * # Fomantic UI - 2.8.8
+ * https://github.com/fomantic/Fomantic-UI
+ * http://fomantic-ui.com/
+ *
+ * Copyright 2021 Contributors
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+!function(x,w,D,I){"use strict";x.isFunction=x.isFunction||function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},w=void 0!==w&&w.Math==Math?w:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),x.fn.nag=function(d){var p,e=x(this),m=e.selector||"",f=(new Date).getTime(),h=[],b=d,v="string"==typeof b,y=[].slice.call(arguments,1);return e.each(function(){var o,s,i=x.isPlainObject(d)?x.extend(!0,{},x.fn.nag.settings,d):x.extend({},x.fn.nag.settings),e=i.selector,c=i.error,n=i.namespace,t="."+n,a=n+"-module",r=x(this),l=i.context?x(i.context):x("body"),u=this,g=r.data(a);s={initialize:function(){s.verbose("Initializing element"),o=s.get.storage(),r.on("click"+t,e.close,s.dismiss).data(a,s),i.detachable&&r.parent()[0]!==l[0]&&r.detach().prependTo(l),0 .close.icon"},duration:500,easing:"easeOutQuad",onShow:function(){},onVisible:function(){},onHide:function(){},onHidden:function(){}},x.extend(x.easing,{easeOutQuad:function(e,n,t,o,i){return-o*(n/=i)*(n-2)+t}})}(jQuery,window,document);
\ No newline at end of file
diff --git a/public/dist/components/placeholder.css b/public/dist/components/placeholder.css
new file mode 100644
index 000000000..6eb90ee09
--- /dev/null
+++ b/public/dist/components/placeholder.css
@@ -0,0 +1,248 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Loader
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+/*-------------------
+ Content
+--------------------*/
+
+.ui.placeholder {
+ position: static;
+ overflow: hidden;
+ -webkit-animation: placeholderShimmer 2s linear;
+ animation: placeholderShimmer 2s linear;
+ -webkit-animation-iteration-count: infinite;
+ animation-iteration-count: infinite;
+ background-color: #FFFFFF;
+ background-image: -webkit-gradient(linear, left top, right top, color-stop(0, rgba(0, 0, 0, 0.08)), color-stop(15%, rgba(0, 0, 0, 0.15)), color-stop(30%, rgba(0, 0, 0, 0.08)));
+ background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.08) 0, rgba(0, 0, 0, 0.15) 15%, rgba(0, 0, 0, 0.08) 30%);
+ background-image: linear-gradient(to right, rgba(0, 0, 0, 0.08) 0, rgba(0, 0, 0, 0.15) 15%, rgba(0, 0, 0, 0.08) 30%);
+ background-size: 1200px 100%;
+ max-width: 30rem;
+}
+@-webkit-keyframes placeholderShimmer {
+ 0% {
+ background-position: -1200px 0;
+ }
+ 100% {
+ background-position: 1200px 0;
+ }
+}
+@keyframes placeholderShimmer {
+ 0% {
+ background-position: -1200px 0;
+ }
+ 100% {
+ background-position: 1200px 0;
+ }
+}
+.ui.placeholder + .ui.placeholder {
+ margin-top: 2rem;
+}
+.ui.placeholder + .ui.placeholder {
+ -webkit-animation-delay: 0.15s;
+ animation-delay: 0.15s;
+}
+.ui.placeholder + .ui.placeholder + .ui.placeholder {
+ -webkit-animation-delay: 0.3s;
+ animation-delay: 0.3s;
+}
+.ui.placeholder + .ui.placeholder + .ui.placeholder + .ui.placeholder {
+ -webkit-animation-delay: 0.45s;
+ animation-delay: 0.45s;
+}
+.ui.placeholder + .ui.placeholder + .ui.placeholder + .ui.placeholder + .ui.placeholder {
+ -webkit-animation-delay: 0.6s;
+ animation-delay: 0.6s;
+}
+.ui.placeholder,
+.ui.placeholder > :before,
+.ui.placeholder .image.header:after,
+.ui.placeholder .line,
+.ui.placeholder .line:after {
+ background-color: #FFFFFF;
+}
+.ui.placeholder.hidden {
+ display: none;
+}
+
+/* Image */
+.ui.placeholder .image:not(.header):not(.ui):not(.icon) {
+ height: 100px;
+}
+.ui.placeholder .square.image:not(.header) {
+ height: 0;
+ overflow: hidden;
+
+/* 1/1 aspect ratio */
+ padding-top: 100%;
+}
+.ui.placeholder .rectangular.image:not(.header) {
+ height: 0;
+ overflow: hidden;
+
+/* 4/3 aspect ratio */
+ padding-top: 75%;
+}
+
+/* Lines */
+.ui.placeholder .line {
+ position: relative;
+ height: 0.85714286em;
+}
+.ui.placeholder .line:before,
+.ui.placeholder .line:after {
+ top: 100%;
+ position: absolute;
+ content: '';
+ background-color: inherit;
+}
+.ui.placeholder .line:before {
+ left: 0;
+}
+.ui.placeholder .line:after {
+ right: 0;
+}
+
+/* Any Lines */
+.ui.placeholder .line {
+ margin-bottom: 0.5em;
+}
+.ui.placeholder .line:before,
+.ui.placeholder .line:after {
+ height: 0.5em;
+}
+.ui.placeholder .line:not(:first-child) {
+ margin-top: 0.5em;
+}
+
+/* Line Outdent */
+.ui.placeholder .line:nth-child(1):after {
+ width: 0;
+}
+.ui.placeholder .line:nth-child(2):after {
+ width: 50%;
+}
+.ui.placeholder .line:nth-child(3):after {
+ width: 10%;
+}
+.ui.placeholder .line:nth-child(4):after {
+ width: 35%;
+}
+.ui.placeholder .line:nth-child(5):after {
+ width: 65%;
+}
+
+/* Header Image + 2 Lines */
+.ui.placeholder .header {
+ position: relative;
+ overflow: hidden;
+}
+
+/* Header Line 1 & 2*/
+.ui.placeholder .header .line {
+ margin-bottom: 0.64285714em;
+}
+.ui.placeholder .header .line:before,
+.ui.placeholder .header .line:after {
+ height: 0.64285714em;
+}
+.ui.placeholder .header .line:not(:first-child) {
+ margin-top: 0.64285714em;
+}
+.ui.placeholder .header .line:after {
+ width: 20%;
+}
+.ui.placeholder .header .line:nth-child(2):after {
+ width: 60%;
+}
+/* Image Header */
+.ui.placeholder .image.header .line {
+ margin-left: 3em;
+}
+.ui.placeholder .image.header .line:before {
+ width: 0.71428571rem;
+}
+.ui.placeholder .image.header:after {
+ display: block;
+ height: 0.85714286em;
+ content: '';
+ margin-left: 3em;
+}
+
+/* Spacing */
+.ui.placeholder .image .line:first-child,
+.ui.placeholder .paragraph .line:first-child,
+.ui.placeholder .header .line:first-child {
+ height: 0.01px;
+}
+.ui.placeholder .image:not(:first-child):before,
+.ui.placeholder .paragraph:not(:first-child):before,
+.ui.placeholder .header:not(:first-child):before {
+ height: 1.42857143em;
+ content: '';
+ display: block;
+}
+
+/* Inverted Content Loader */
+.ui.inverted.placeholder {
+ background-image: -webkit-gradient(linear, left top, right top, color-stop(0, rgba(255, 255, 255, 0.08)), color-stop(15%, rgba(255, 255, 255, 0.14)), color-stop(30%, rgba(255, 255, 255, 0.08)));
+ background-image: -webkit-linear-gradient(left, rgba(255, 255, 255, 0.08) 0, rgba(255, 255, 255, 0.14) 15%, rgba(255, 255, 255, 0.08) 30%);
+ background-image: linear-gradient(to right, rgba(255, 255, 255, 0.08) 0, rgba(255, 255, 255, 0.14) 15%, rgba(255, 255, 255, 0.08) 30%);
+}
+.ui.inverted.placeholder,
+.ui.inverted.placeholder > :before,
+.ui.inverted.placeholder .image.header:after,
+.ui.inverted.placeholder .line,
+.ui.inverted.placeholder .line:after {
+ background-color: #1B1C1D;
+}
+
+
+/*******************************
+ Variations
+*******************************/
+
+
+/*-------------------
+ Sizes
+--------------------*/
+
+.ui.placeholder .full.line.line.line:after {
+ width: 0;
+}
+.ui.placeholder .very.long.line.line.line:after {
+ width: 10%;
+}
+.ui.placeholder .long.line.line.line:after {
+ width: 35%;
+}
+.ui.placeholder .medium.line.line.line:after {
+ width: 50%;
+}
+.ui.placeholder .short.line.line.line:after {
+ width: 65%;
+}
+.ui.placeholder .very.short.line.line.line:after {
+ width: 80%;
+}
+
+/*-------------------
+ Fluid
+ --------------------*/
+
+.ui.fluid.placeholder {
+ max-width: none;
+}
+
+
+/*******************************
+ Theme Overrides
+*******************************/
+
diff --git a/public/dist/components/placeholder.min.css b/public/dist/components/placeholder.min.css
new file mode 100644
index 000000000..e04153462
--- /dev/null
+++ b/public/dist/components/placeholder.min.css
@@ -0,0 +1,9 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Loader
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */.ui.placeholder{position:static;overflow:hidden;-webkit-animation:placeholderShimmer 2s linear;animation:placeholderShimmer 2s linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;background-color:#fff;background-image:-webkit-gradient(linear,left top,right top,color-stop(0,rgba(0,0,0,.08)),color-stop(15%,rgba(0,0,0,.15)),color-stop(30%,rgba(0,0,0,.08)));background-image:-webkit-linear-gradient(left,rgba(0,0,0,.08) 0,rgba(0,0,0,.15) 15%,rgba(0,0,0,.08) 30%);background-image:linear-gradient(to right,rgba(0,0,0,.08) 0,rgba(0,0,0,.15) 15%,rgba(0,0,0,.08) 30%);background-size:1200px 100%;max-width:30rem}@-webkit-keyframes placeholderShimmer{0%{background-position:-1200px 0}100%{background-position:1200px 0}}@keyframes placeholderShimmer{0%{background-position:-1200px 0}100%{background-position:1200px 0}}.ui.placeholder+.ui.placeholder{margin-top:2rem}.ui.placeholder+.ui.placeholder{-webkit-animation-delay:.15s;animation-delay:.15s}.ui.placeholder+.ui.placeholder+.ui.placeholder{-webkit-animation-delay:.3s;animation-delay:.3s}.ui.placeholder+.ui.placeholder+.ui.placeholder+.ui.placeholder{-webkit-animation-delay:.45s;animation-delay:.45s}.ui.placeholder+.ui.placeholder+.ui.placeholder+.ui.placeholder+.ui.placeholder{-webkit-animation-delay:.6s;animation-delay:.6s}.ui.placeholder,.ui.placeholder .image.header:after,.ui.placeholder .line,.ui.placeholder .line:after,.ui.placeholder>:before{background-color:#fff}.ui.placeholder.hidden{display:none}.ui.placeholder .image:not(.header):not(.ui):not(.icon){height:100px}.ui.placeholder .square.image:not(.header){height:0;overflow:hidden;padding-top:100%}.ui.placeholder .rectangular.image:not(.header){height:0;overflow:hidden;padding-top:75%}.ui.placeholder .line{position:relative;height:.85714286em}.ui.placeholder .line:after,.ui.placeholder .line:before{top:100%;position:absolute;content:'';background-color:inherit}.ui.placeholder .line:before{left:0}.ui.placeholder .line:after{right:0}.ui.placeholder .line{margin-bottom:.5em}.ui.placeholder .line:after,.ui.placeholder .line:before{height:.5em}.ui.placeholder .line:not(:first-child){margin-top:.5em}.ui.placeholder .line:nth-child(1):after{width:0}.ui.placeholder .line:nth-child(2):after{width:50%}.ui.placeholder .line:nth-child(3):after{width:10%}.ui.placeholder .line:nth-child(4):after{width:35%}.ui.placeholder .line:nth-child(5):after{width:65%}.ui.placeholder .header{position:relative;overflow:hidden}.ui.placeholder .header .line{margin-bottom:.64285714em}.ui.placeholder .header .line:after,.ui.placeholder .header .line:before{height:.64285714em}.ui.placeholder .header .line:not(:first-child){margin-top:.64285714em}.ui.placeholder .header .line:after{width:20%}.ui.placeholder .header .line:nth-child(2):after{width:60%}.ui.placeholder .image.header .line{margin-left:3em}.ui.placeholder .image.header .line:before{width:.71428571rem}.ui.placeholder .image.header:after{display:block;height:.85714286em;content:'';margin-left:3em}.ui.placeholder .header .line:first-child,.ui.placeholder .image .line:first-child,.ui.placeholder .paragraph .line:first-child{height:.01px}.ui.placeholder .header:not(:first-child):before,.ui.placeholder .image:not(:first-child):before,.ui.placeholder .paragraph:not(:first-child):before{height:1.42857143em;content:'';display:block}.ui.inverted.placeholder{background-image:-webkit-gradient(linear,left top,right top,color-stop(0,rgba(255,255,255,.08)),color-stop(15%,rgba(255,255,255,.14)),color-stop(30%,rgba(255,255,255,.08)));background-image:-webkit-linear-gradient(left,rgba(255,255,255,.08) 0,rgba(255,255,255,.14) 15%,rgba(255,255,255,.08) 30%);background-image:linear-gradient(to right,rgba(255,255,255,.08) 0,rgba(255,255,255,.14) 15%,rgba(255,255,255,.08) 30%)}.ui.inverted.placeholder,.ui.inverted.placeholder .image.header:after,.ui.inverted.placeholder .line,.ui.inverted.placeholder .line:after,.ui.inverted.placeholder>:before{background-color:#1b1c1d}.ui.placeholder .full.line.line.line:after{width:0}.ui.placeholder .very.long.line.line.line:after{width:10%}.ui.placeholder .long.line.line.line:after{width:35%}.ui.placeholder .medium.line.line.line:after{width:50%}.ui.placeholder .short.line.line.line:after{width:65%}.ui.placeholder .very.short.line.line.line:after{width:80%}.ui.fluid.placeholder{max-width:none}
\ No newline at end of file
diff --git a/public/dist/components/popup.css b/public/dist/components/popup.css
new file mode 100644
index 000000000..8c086d291
--- /dev/null
+++ b/public/dist/components/popup.css
@@ -0,0 +1,819 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Popup
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+
+/*******************************
+ Popup
+*******************************/
+
+.ui.popup {
+ display: none;
+ position: absolute;
+ top: 0;
+ right: 0;
+
+/* Fixes content being squished when inline (moz only) */
+ min-width: -webkit-min-content;
+ min-width: -moz-min-content;
+ min-width: min-content;
+ z-index: 1900;
+ border: 1px solid #D4D4D5;
+ line-height: 1.4285em;
+ max-width: 250px;
+ background: #FFFFFF;
+ padding: 0.833em 1em;
+ font-weight: normal;
+ font-style: normal;
+ color: rgba(0, 0, 0, 0.87);
+ border-radius: 0.28571429rem;
+ -webkit-box-shadow: 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15);
+ box-shadow: 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15);
+}
+.ui.popup > .header {
+ padding: 0;
+ font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
+ font-size: 1.14285714em;
+ line-height: 1.2;
+ font-weight: bold;
+}
+.ui.popup > .header + .content {
+ padding-top: 0.5em;
+}
+.ui.popup:before {
+ position: absolute;
+ content: '';
+ width: 0.71428571em;
+ height: 0.71428571em;
+ background: #FFFFFF;
+ -webkit-transform: rotate(45deg);
+ transform: rotate(45deg);
+ z-index: 1901;
+ -webkit-box-shadow: 1px 1px 0 0 #bababc;
+ box-shadow: 1px 1px 0 0 #bababc;
+}
+
+
+/*******************************
+ Types
+*******************************/
+
+
+/*--------------
+ Tooltip
+ ---------------*/
+
+
+/* Content */
+[data-tooltip] {
+ position: relative;
+}
+
+/* Arrow */
+[data-tooltip]:before {
+ pointer-events: none;
+ position: absolute;
+ content: '';
+ font-size: 1rem;
+ width: 0.71428571em;
+ height: 0.71428571em;
+ background: #FFFFFF;
+ -webkit-transform: rotate(45deg);
+ transform: rotate(45deg);
+ z-index: 1901;
+ -webkit-box-shadow: 1px 1px 0 0 #bababc;
+ box-shadow: 1px 1px 0 0 #bababc;
+}
+
+/* Popup */
+[data-tooltip]:after {
+ pointer-events: none;
+ content: attr(data-tooltip);
+ position: absolute;
+ text-transform: none;
+ text-align: left;
+ text-shadow: none;
+ white-space: nowrap;
+ font-size: 1rem;
+ border: 1px solid #D4D4D5;
+ line-height: 1.4285em;
+ max-width: none;
+ background: #FFFFFF;
+ padding: 0.833em 1em;
+ font-weight: normal;
+ font-style: normal;
+ color: rgba(0, 0, 0, 0.87);
+ border-radius: 0.28571429rem;
+ -webkit-box-shadow: 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15);
+ box-shadow: 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15);
+ z-index: 1900;
+}
+
+/* Default Position (Top Center) */
+[data-tooltip]:not([data-position]):before {
+ top: auto;
+ right: auto;
+ bottom: 100%;
+ left: 50%;
+ background: #FFFFFF;
+ margin-left: -0.07142857rem;
+ margin-bottom: 0.14285714rem;
+}
+[data-tooltip]:not([data-position]):after {
+ left: 50%;
+ -webkit-transform: translateX(-50%);
+ transform: translateX(-50%);
+ bottom: 100%;
+ margin-bottom: 0.5em;
+}
+
+/* Animation */
+[data-tooltip]:before,
+[data-tooltip]:after {
+ pointer-events: none;
+ visibility: hidden;
+ opacity: 0;
+ -webkit-transition: opacity 0.1s ease, -webkit-transform 0.1s ease;
+ transition: opacity 0.1s ease, -webkit-transform 0.1s ease;
+ transition: transform 0.1s ease, opacity 0.1s ease;
+ transition: transform 0.1s ease, opacity 0.1s ease, -webkit-transform 0.1s ease;
+}
+[data-tooltip]:before {
+ -webkit-transform: rotate(45deg) scale(0) !important;
+ transform: rotate(45deg) scale(0) !important;
+ -webkit-transform-origin: center top;
+ transform-origin: center top;
+}
+[data-tooltip]:after {
+ -webkit-transform-origin: center bottom;
+ transform-origin: center bottom;
+}
+[data-tooltip]:hover:before,
+[data-tooltip]:hover:after {
+ visibility: visible;
+ pointer-events: auto;
+ opacity: 1;
+}
+[data-tooltip]:hover:before {
+ -webkit-transform: rotate(45deg) scale(1) !important;
+ transform: rotate(45deg) scale(1) !important;
+}
+
+/* Animation Position */
+[data-tooltip]:after,
+[data-tooltip][data-position="top center"]:after,
+[data-tooltip][data-position="bottom center"]:after {
+ -webkit-transform: translateX(-50%) scale(0) !important;
+ transform: translateX(-50%) scale(0) !important;
+}
+[data-tooltip]:hover:after,
+[data-tooltip][data-position="bottom center"]:hover:after {
+ -webkit-transform: translateX(-50%) scale(1) !important;
+ transform: translateX(-50%) scale(1) !important;
+}
+[data-tooltip][data-position="left center"]:after,
+[data-tooltip][data-position="right center"]:after {
+ -webkit-transform: translateY(-50%) scale(0) !important;
+ transform: translateY(-50%) scale(0) !important;
+}
+[data-tooltip][data-position="left center"]:hover:after,
+[data-tooltip][data-position="right center"]:hover:after {
+ -webkit-transform: translateY(-50%) scale(1) !important;
+ transform: translateY(-50%) scale(1) !important;
+ -moz-transform: translateY(-50%) scale(1.0001) !important;
+}
+[data-tooltip][data-position="top left"]:after,
+[data-tooltip][data-position="top right"]:after,
+[data-tooltip][data-position="bottom left"]:after,
+[data-tooltip][data-position="bottom right"]:after {
+ -webkit-transform: scale(0) !important;
+ transform: scale(0) !important;
+}
+[data-tooltip][data-position="top left"]:hover:after,
+[data-tooltip][data-position="top right"]:hover:after,
+[data-tooltip][data-position="bottom left"]:hover:after,
+[data-tooltip][data-position="bottom right"]:hover:after {
+ -webkit-transform: scale(1) !important;
+ transform: scale(1) !important;
+}
+[data-tooltip][data-variation~="fixed"]:after {
+ white-space: normal;
+ width: 250px;
+}
+[data-tooltip][data-variation*="wide fixed"]:after {
+ width: 350px;
+}
+[data-tooltip][data-variation*="very wide fixed"]:after {
+ width: 550px;
+}
+@media only screen and (max-width: 767.98px) {
+ [data-tooltip][data-variation~="fixed"]:after {
+ width: 250px;
+ }
+}
+
+/*--------------
+ Inverted
+ ---------------*/
+
+
+/* Arrow */
+[data-tooltip][data-inverted]:before {
+ -webkit-box-shadow: none !important;
+ box-shadow: none !important;
+}
+
+/* Arrow Position */
+[data-tooltip][data-inverted]:before {
+ background: #1B1C1D;
+}
+
+/* Popup */
+[data-tooltip][data-inverted]:after {
+ background: #1B1C1D;
+ color: #FFFFFF;
+ border: none;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
+[data-tooltip][data-inverted]:after .header {
+ background: none;
+ color: #FFFFFF;
+}
+
+/*--------------
+ Position
+ ---------------*/
+
+[data-position~="top"][data-tooltip]:before {
+ background: #FFFFFF;
+}
+
+/* Top Center */
+[data-position="top center"][data-tooltip]:after {
+ top: auto;
+ right: auto;
+ left: 50%;
+ bottom: 100%;
+ -webkit-transform: translateX(-50%);
+ transform: translateX(-50%);
+ margin-bottom: 0.5em;
+}
+[data-position="top center"][data-tooltip]:before {
+ top: auto;
+ right: auto;
+ bottom: 100%;
+ left: 50%;
+ background: #FFFFFF;
+ margin-left: -0.07142857rem;
+ margin-bottom: 0.14285714rem;
+}
+
+/* Top Left */
+[data-position="top left"][data-tooltip]:after {
+ top: auto;
+ right: auto;
+ left: 0;
+ bottom: 100%;
+ margin-bottom: 0.5em;
+}
+[data-position="top left"][data-tooltip]:before {
+ top: auto;
+ right: auto;
+ bottom: 100%;
+ left: 1em;
+ margin-left: -0.07142857rem;
+ margin-bottom: 0.14285714rem;
+}
+
+/* Top Right */
+[data-position="top right"][data-tooltip]:after {
+ top: auto;
+ left: auto;
+ right: 0;
+ bottom: 100%;
+ margin-bottom: 0.5em;
+}
+[data-position="top right"][data-tooltip]:before {
+ top: auto;
+ left: auto;
+ bottom: 100%;
+ right: 1em;
+ margin-left: -0.07142857rem;
+ margin-bottom: 0.14285714rem;
+}
+[data-position~="bottom"][data-tooltip]:before {
+ background: #FFFFFF;
+ -webkit-box-shadow: -1px -1px 0 0 #bababc;
+ box-shadow: -1px -1px 0 0 #bababc;
+}
+
+/* Bottom Center */
+[data-position="bottom center"][data-tooltip]:after {
+ bottom: auto;
+ right: auto;
+ left: 50%;
+ top: 100%;
+ -webkit-transform: translateX(-50%);
+ transform: translateX(-50%);
+ margin-top: 0.5em;
+}
+[data-position="bottom center"][data-tooltip]:before {
+ bottom: auto;
+ right: auto;
+ top: 100%;
+ left: 50%;
+ margin-left: -0.07142857rem;
+ margin-top: 0.30714286em;
+ -webkit-transform-origin: center top;
+ transform-origin: center top;
+}
+
+/* Bottom Left */
+[data-position="bottom left"][data-tooltip]:after {
+ left: 0;
+ top: 100%;
+ margin-top: 0.5em;
+}
+[data-position="bottom left"][data-tooltip]:before {
+ bottom: auto;
+ right: auto;
+ top: 100%;
+ left: 1em;
+ margin-left: -0.07142857rem;
+ margin-top: 0.14285714rem;
+}
+
+/* Bottom Right */
+[data-position="bottom right"][data-tooltip]:after {
+ right: 0;
+ top: 100%;
+ margin-top: 0.5em;
+}
+[data-position="bottom right"][data-tooltip]:before {
+ bottom: auto;
+ left: auto;
+ top: 100%;
+ right: 1em;
+ margin-left: -0.14285714rem;
+ margin-top: 0.07142857rem;
+}
+
+/* Left Center */
+[data-position="left center"][data-tooltip]:after {
+ right: 100%;
+ top: 50%;
+ margin-right: 0.5em;
+ -webkit-transform: translateY(-50%);
+ transform: translateY(-50%);
+}
+[data-position="left center"][data-tooltip]:before {
+ right: 100%;
+ top: 50%;
+ margin-top: -0.14285714rem;
+ margin-right: -0.07142857rem;
+ background: #FFFFFF;
+ -webkit-box-shadow: 1px -1px 0 0 #bababc;
+ box-shadow: 1px -1px 0 0 #bababc;
+}
+
+/* Right Center */
+[data-position="right center"][data-tooltip]:after {
+ left: 100%;
+ top: 50%;
+ margin-left: 0.5em;
+ -webkit-transform: translateY(-50%);
+ transform: translateY(-50%);
+}
+[data-position="right center"][data-tooltip]:before {
+ left: 100%;
+ top: 50%;
+ margin-top: -0.07142857rem;
+ margin-left: 0.14285714rem;
+ background: #FFFFFF;
+ -webkit-box-shadow: -1px 1px 0 0 #bababc;
+ box-shadow: -1px 1px 0 0 #bababc;
+}
+
+/* Inverted Arrow Color */
+[data-inverted][data-position~="bottom"][data-tooltip]:before {
+ background: #1B1C1D;
+ -webkit-box-shadow: -1px -1px 0 0 #bababc;
+ box-shadow: -1px -1px 0 0 #bababc;
+}
+[data-inverted][data-position="left center"][data-tooltip]:before {
+ background: #1B1C1D;
+ -webkit-box-shadow: 1px -1px 0 0 #bababc;
+ box-shadow: 1px -1px 0 0 #bababc;
+}
+[data-inverted][data-position="right center"][data-tooltip]:before {
+ background: #1B1C1D;
+ -webkit-box-shadow: -1px 1px 0 0 #bababc;
+ box-shadow: -1px 1px 0 0 #bababc;
+}
+[data-inverted][data-position~="top"][data-tooltip]:before {
+ background: #1B1C1D;
+}
+[data-position~="bottom"][data-tooltip]:before {
+ -webkit-transform-origin: center bottom;
+ transform-origin: center bottom;
+}
+[data-position~="bottom"][data-tooltip]:after {
+ -webkit-transform-origin: center top;
+ transform-origin: center top;
+}
+[data-position="left center"][data-tooltip]:before {
+ -webkit-transform-origin: top center;
+ transform-origin: top center;
+}
+[data-position="left center"][data-tooltip]:after {
+ -webkit-transform-origin: right center;
+ transform-origin: right center;
+}
+[data-position="right center"][data-tooltip]:before {
+ -webkit-transform-origin: right center;
+ transform-origin: right center;
+}
+[data-position="right center"][data-tooltip]:after {
+ -webkit-transform-origin: left center;
+ transform-origin: left center;
+}
+
+/*--------------
+ Basic
+ ---------------*/
+
+[data-tooltip][data-variation~="basic"]:before {
+ display: none;
+}
+
+/*--------------
+ Spacing
+---------------*/
+
+.ui.popup {
+ margin: 0;
+}
+
+/* Extending from Top */
+.ui.top.popup {
+ margin: 0 0 0.71428571em;
+}
+.ui.top.left.popup {
+ -webkit-transform-origin: left bottom;
+ transform-origin: left bottom;
+}
+.ui.top.center.popup {
+ -webkit-transform-origin: center bottom;
+ transform-origin: center bottom;
+}
+.ui.top.right.popup {
+ -webkit-transform-origin: right bottom;
+ transform-origin: right bottom;
+}
+
+/* Extending from Vertical Center */
+.ui.left.center.popup {
+ margin: 0 0.71428571em 0 0;
+ -webkit-transform-origin: right 50%;
+ transform-origin: right 50%;
+}
+.ui.right.center.popup {
+ margin: 0 0 0 0.71428571em;
+ -webkit-transform-origin: left 50%;
+ transform-origin: left 50%;
+}
+
+/* Extending from Bottom */
+.ui.bottom.popup {
+ margin: 0.71428571em 0 0;
+}
+.ui.bottom.left.popup {
+ -webkit-transform-origin: left top;
+ transform-origin: left top;
+}
+.ui.bottom.center.popup {
+ -webkit-transform-origin: center top;
+ transform-origin: center top;
+}
+.ui.bottom.right.popup {
+ -webkit-transform-origin: right top;
+ transform-origin: right top;
+}
+
+/*--------------
+ Pointer
+ ---------------*/
+
+
+/*--- Below ---*/
+
+.ui.bottom.center.popup:before {
+ margin-left: -0.30714286em;
+ top: -0.30714286em;
+ left: 50%;
+ right: auto;
+ bottom: auto;
+ -webkit-box-shadow: -1px -1px 0 0 #bababc;
+ box-shadow: -1px -1px 0 0 #bababc;
+}
+.ui.bottom.left.popup {
+ margin-left: 0;
+}
+/*rtl:rename*/
+.ui.bottom.left.popup:before {
+ top: -0.30714286em;
+ left: 1em;
+ right: auto;
+ bottom: auto;
+ margin-left: 0;
+ -webkit-box-shadow: -1px -1px 0 0 #bababc;
+ box-shadow: -1px -1px 0 0 #bababc;
+}
+.ui.bottom.right.popup {
+ margin-right: 0;
+}
+/*rtl:rename*/
+.ui.bottom.right.popup:before {
+ top: -0.30714286em;
+ right: 1em;
+ bottom: auto;
+ left: auto;
+ margin-left: 0;
+ -webkit-box-shadow: -1px -1px 0 0 #bababc;
+ box-shadow: -1px -1px 0 0 #bababc;
+}
+
+/*--- Above ---*/
+
+.ui.top.center.popup:before {
+ top: auto;
+ right: auto;
+ bottom: -0.30714286em;
+ left: 50%;
+ margin-left: -0.30714286em;
+}
+.ui.top.left.popup {
+ margin-left: 0;
+}
+/*rtl:rename*/
+.ui.top.left.popup:before {
+ bottom: -0.30714286em;
+ left: 1em;
+ top: auto;
+ right: auto;
+ margin-left: 0;
+}
+.ui.top.right.popup {
+ margin-right: 0;
+}
+/*rtl:rename*/
+.ui.top.right.popup:before {
+ bottom: -0.30714286em;
+ right: 1em;
+ top: auto;
+ left: auto;
+ margin-left: 0;
+}
+
+/*--- Left Center ---*/
+
+/*rtl:rename*/
+.ui.left.center.popup:before {
+ top: 50%;
+ right: -0.30714286em;
+ bottom: auto;
+ left: auto;
+ margin-top: -0.30714286em;
+ -webkit-box-shadow: 1px -1px 0 0 #bababc;
+ box-shadow: 1px -1px 0 0 #bababc;
+}
+
+/*--- Right Center ---*/
+
+/*rtl:rename*/
+.ui.right.center.popup:before {
+ top: 50%;
+ left: -0.30714286em;
+ bottom: auto;
+ right: auto;
+ margin-top: -0.30714286em;
+ -webkit-box-shadow: -1px 1px 0 0 #bababc;
+ box-shadow: -1px 1px 0 0 #bababc;
+}
+.ui.right.center.popup:before,
+.ui.left.center.popup:before {
+ background: #FFFFFF;
+}
+
+/* Arrow Color By Location */
+.ui.bottom.popup:before {
+ background: #FFFFFF;
+}
+.ui.top.popup:before {
+ background: #FFFFFF;
+}
+
+/* Inverted Arrow Color */
+.ui.inverted.bottom.popup:before {
+ background: #1B1C1D;
+}
+.ui.inverted.right.center.popup:before,
+.ui.inverted.left.center.popup:before {
+ background: #1B1C1D;
+}
+.ui.inverted.top.popup:before {
+ background: #1B1C1D;
+}
+
+
+/*******************************
+ Coupling
+*******************************/
+
+
+/* Immediate Nested Grid */
+.ui.popup > .ui.grid:not(.padded) {
+ width: calc(100% + 1.75rem);
+ margin: -0.7rem -0.875rem;
+}
+
+
+/*******************************
+ States
+*******************************/
+
+.ui.loading.popup {
+ display: block;
+ visibility: hidden;
+ z-index: -1;
+}
+.ui.animating.popup,
+.ui.visible.popup {
+ display: block;
+}
+.ui.visible.popup {
+ -webkit-transform: translateZ(0);
+ transform: translateZ(0);
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+}
+
+
+/*******************************
+ Variations
+*******************************/
+
+
+/*--------------
+ Basic
+ ---------------*/
+
+.ui.basic.popup:before {
+ display: none;
+}
+.ui.fixed.popup {
+ width: 250px;
+}
+
+/*--------------
+ Wide
+ ---------------*/
+
+.ui.wide.popup {
+ max-width: 350px;
+}
+.ui.wide.popup.fixed {
+ width: 350px;
+}
+.ui[class*="very wide"].popup {
+ max-width: 550px;
+}
+.ui[class*="very wide"].popup.fixed {
+ width: 550px;
+}
+@media only screen and (max-width: 767.98px) {
+ .ui.wide.popup,
+ .ui[class*="very wide"].popup {
+ max-width: 250px;
+ }
+ .ui.wide.popup.fixed,
+ .ui[class*="very wide"].popup.fixed {
+ width: 250px;
+ }
+}
+
+/*--------------
+ Fluid
+ ---------------*/
+
+.ui.fluid.popup {
+ width: 100%;
+ max-width: none;
+}
+
+/*--------------
+ Colors
+ ---------------*/
+
+
+/* Inverted colors */
+.ui.inverted.popup {
+ background: #1B1C1D;
+ color: #FFFFFF;
+ border: none;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
+.ui.inverted.popup .header {
+ background-color: none;
+ color: #FFFFFF;
+}
+.ui.inverted.popup:before {
+ background-color: #1B1C1D;
+ -webkit-box-shadow: none !important;
+ box-shadow: none !important;
+}
+
+/*--------------
+ Flowing
+ ---------------*/
+
+.ui.flowing.popup {
+ max-width: none;
+}
+
+/*--------------
+ Sizes
+---------------*/
+
+.ui.popup {
+ font-size: 1rem;
+}
+.ui.mini.popup {
+ font-size: 0.78571429rem;
+}
+[data-tooltip][data-variation~="mini"]:before,
+[data-tooltip][data-variation~="mini"]:after {
+ font-size: 0.78571429rem;
+}
+.ui.tiny.popup {
+ font-size: 0.85714286rem;
+}
+[data-tooltip][data-variation~="tiny"]:before,
+[data-tooltip][data-variation~="tiny"]:after {
+ font-size: 0.85714286rem;
+}
+.ui.small.popup {
+ font-size: 0.92857143rem;
+}
+[data-tooltip][data-variation~="small"]:before,
+[data-tooltip][data-variation~="small"]:after {
+ font-size: 0.92857143rem;
+}
+.ui.large.popup {
+ font-size: 1.14285714rem;
+}
+[data-tooltip][data-variation~="large"]:before,
+[data-tooltip][data-variation~="large"]:after {
+ font-size: 1.14285714rem;
+}
+.ui.big.popup {
+ font-size: 1.28571429rem;
+}
+[data-tooltip][data-variation~="big"]:before,
+[data-tooltip][data-variation~="big"]:after {
+ font-size: 1.28571429rem;
+}
+.ui.huge.popup {
+ font-size: 1.42857143rem;
+}
+[data-tooltip][data-variation~="huge"]:before,
+[data-tooltip][data-variation~="huge"]:after {
+ font-size: 1.42857143rem;
+}
+.ui.massive.popup {
+ font-size: 1.71428571rem;
+}
+[data-tooltip][data-variation~="massive"]:before,
+[data-tooltip][data-variation~="massive"]:after {
+ font-size: 1.71428571rem;
+}
+
+
+/*******************************
+ Theme Overrides
+*******************************/
+
+
+
+/*******************************
+ User Overrides
+*******************************/
+
diff --git a/public/dist/components/popup.js b/public/dist/components/popup.js
new file mode 100644
index 000000000..9ca8ba283
--- /dev/null
+++ b/public/dist/components/popup.js
@@ -0,0 +1,1541 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Popup
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+'use strict';
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.popup = function(parameters) {
+ var
+ $allModules = $(this),
+ $document = $(document),
+ $window = $(window),
+ $body = $('body'),
+
+ moduleSelector = $allModules.selector || '',
+
+ clickEvent = ('ontouchstart' in document.documentElement)
+ ? 'touchstart'
+ : 'click',
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+
+ returnedValue
+ ;
+ $allModules
+ .each(function() {
+ var
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.fn.popup.settings, parameters)
+ : $.extend({}, $.fn.popup.settings),
+
+ selector = settings.selector,
+ className = settings.className,
+ error = settings.error,
+ metadata = settings.metadata,
+ namespace = settings.namespace,
+
+ eventNamespace = '.' + settings.namespace,
+ moduleNamespace = 'module-' + namespace,
+
+ $module = $(this),
+ $context = $(settings.context),
+ $scrollContext = $(settings.scrollContext),
+ $boundary = $(settings.boundary),
+ $target = (settings.target)
+ ? $(settings.target)
+ : $module,
+
+ $popup,
+ $offsetParent,
+
+ searchDepth = 0,
+ triedPositions = false,
+ openedWithTouch = false,
+
+ element = this,
+ instance = $module.data(moduleNamespace),
+
+ documentObserver,
+ elementNamespace,
+ id,
+ module
+ ;
+
+ module = {
+
+ // binds events
+ initialize: function() {
+ module.debug('Initializing', $module);
+ module.createID();
+ module.bind.events();
+ if(!module.exists() && settings.preserve) {
+ module.create();
+ }
+ if(settings.observeChanges) {
+ module.observeChanges();
+ }
+ module.instantiate();
+ },
+
+ instantiate: function() {
+ module.verbose('Storing instance', module);
+ instance = module;
+ $module
+ .data(moduleNamespace, instance)
+ ;
+ },
+
+ observeChanges: function() {
+ if('MutationObserver' in window) {
+ documentObserver = new MutationObserver(module.event.documentChanged);
+ documentObserver.observe(document, {
+ childList : true,
+ subtree : true
+ });
+ module.debug('Setting up mutation observer', documentObserver);
+ }
+ },
+
+ refresh: function() {
+ if(settings.popup) {
+ $popup = $(settings.popup).eq(0);
+ }
+ else {
+ if(settings.inline) {
+ $popup = $target.nextAll(selector.popup).eq(0);
+ settings.popup = $popup;
+ }
+ }
+ if(settings.popup) {
+ $popup.addClass(className.loading);
+ $offsetParent = module.get.offsetParent();
+ $popup.removeClass(className.loading);
+ if(settings.movePopup && module.has.popup() && module.get.offsetParent($popup)[0] !== $offsetParent[0]) {
+ module.debug('Moving popup to the same offset parent as target');
+ $popup
+ .detach()
+ .appendTo($offsetParent)
+ ;
+ }
+ }
+ else {
+ $offsetParent = (settings.inline)
+ ? module.get.offsetParent($target)
+ : module.has.popup()
+ ? module.get.offsetParent($popup)
+ : $body
+ ;
+ }
+ if( $offsetParent.is('html') && $offsetParent[0] !== $body[0] ) {
+ module.debug('Setting page as offset parent');
+ $offsetParent = $body;
+ }
+ if( module.get.variation() ) {
+ module.set.variation();
+ }
+ },
+
+ reposition: function() {
+ module.refresh();
+ module.set.position();
+ },
+
+ destroy: function() {
+ module.debug('Destroying previous module');
+ if(documentObserver) {
+ documentObserver.disconnect();
+ }
+ // remove element only if was created dynamically
+ if($popup && !settings.preserve) {
+ module.removePopup();
+ }
+ // clear all timeouts
+ clearTimeout(module.hideTimer);
+ clearTimeout(module.showTimer);
+ // remove events
+ module.unbind.close();
+ module.unbind.events();
+ $module
+ .removeData(moduleNamespace)
+ ;
+ },
+
+ event: {
+ start: function(event) {
+ var
+ delay = ($.isPlainObject(settings.delay))
+ ? settings.delay.show
+ : settings.delay
+ ;
+ clearTimeout(module.hideTimer);
+ if(!openedWithTouch || (openedWithTouch && settings.addTouchEvents) ) {
+ module.showTimer = setTimeout(module.show, delay);
+ }
+ },
+ end: function() {
+ var
+ delay = ($.isPlainObject(settings.delay))
+ ? settings.delay.hide
+ : settings.delay
+ ;
+ clearTimeout(module.showTimer);
+ module.hideTimer = setTimeout(module.hide, delay);
+ },
+ touchstart: function(event) {
+ openedWithTouch = true;
+ if(settings.addTouchEvents) {
+ module.show();
+ }
+ },
+ resize: function() {
+ if( module.is.visible() ) {
+ module.set.position();
+ }
+ },
+ documentChanged: function(mutations) {
+ [].forEach.call(mutations, function(mutation) {
+ if(mutation.removedNodes) {
+ [].forEach.call(mutation.removedNodes, function(node) {
+ if(node == element || $(node).find(element).length > 0) {
+ module.debug('Element removed from DOM, tearing down events');
+ module.destroy();
+ }
+ });
+ }
+ });
+ },
+ hideGracefully: function(event) {
+ var
+ $target = $(event.target),
+ isInDOM = $.contains(document.documentElement, event.target),
+ inPopup = ($target.closest(selector.popup).length > 0)
+ ;
+ // don't close on clicks inside popup
+ if(event && !inPopup && isInDOM) {
+ module.debug('Click occurred outside popup hiding popup');
+ module.hide();
+ }
+ else {
+ module.debug('Click was inside popup, keeping popup open');
+ }
+ }
+ },
+
+ // generates popup html from metadata
+ create: function() {
+ var
+ html = module.get.html(),
+ title = module.get.title(),
+ content = module.get.content()
+ ;
+
+ if(html || content || title) {
+ module.debug('Creating pop-up html');
+ if(!html) {
+ html = settings.templates.popup({
+ title : title,
+ content : content
+ });
+ }
+ $popup = $('
')
+ .addClass(className.popup)
+ .data(metadata.activator, $module)
+ .html(html)
+ ;
+ if(settings.inline) {
+ module.verbose('Inserting popup element inline', $popup);
+ $popup
+ .insertAfter($module)
+ ;
+ }
+ else {
+ module.verbose('Appending popup element to body', $popup);
+ $popup
+ .appendTo( $context )
+ ;
+ }
+ module.refresh();
+ module.set.variation();
+
+ if(settings.hoverable) {
+ module.bind.popup();
+ }
+ settings.onCreate.call($popup, element);
+ }
+ else if(settings.popup) {
+ $(settings.popup).data(metadata.activator, $module);
+ module.verbose('Used popup specified in settings');
+ module.refresh();
+ if(settings.hoverable) {
+ module.bind.popup();
+ }
+ }
+ else if($target.next(selector.popup).length !== 0) {
+ module.verbose('Pre-existing popup found');
+ settings.inline = true;
+ settings.popup = $target.next(selector.popup).data(metadata.activator, $module);
+ module.refresh();
+ if(settings.hoverable) {
+ module.bind.popup();
+ }
+ }
+ else {
+ module.debug('No content specified skipping display', element);
+ }
+ },
+
+ createID: function() {
+ id = (Math.random().toString(16) + '000000000').substr(2, 8);
+ elementNamespace = '.' + id;
+ module.verbose('Creating unique id for element', id);
+ },
+
+ // determines popup state
+ toggle: function() {
+ module.debug('Toggling pop-up');
+ if( module.is.hidden() ) {
+ module.debug('Popup is hidden, showing pop-up');
+ module.unbind.close();
+ module.show();
+ }
+ else {
+ module.debug('Popup is visible, hiding pop-up');
+ module.hide();
+ }
+ },
+
+ show: function(callback) {
+ callback = callback || function(){};
+ module.debug('Showing pop-up', settings.transition);
+ if(module.is.hidden() && !( module.is.active() && module.is.dropdown()) ) {
+ if( !module.exists() ) {
+ module.create();
+ }
+ if(settings.onShow.call($popup, element) === false) {
+ module.debug('onShow callback returned false, cancelling popup animation');
+ return;
+ }
+ else if(!settings.preserve && !settings.popup) {
+ module.refresh();
+ }
+ if( $popup && module.set.position() ) {
+ module.save.conditions();
+ if(settings.exclusive) {
+ module.hideAll();
+ }
+ module.animate.show(callback);
+ }
+ }
+ },
+
+
+ hide: function(callback) {
+ callback = callback || function(){};
+ if( module.is.visible() || module.is.animating() ) {
+ if(settings.onHide.call($popup, element) === false) {
+ module.debug('onHide callback returned false, cancelling popup animation');
+ return;
+ }
+ module.remove.visible();
+ module.unbind.close();
+ module.restore.conditions();
+ module.animate.hide(callback);
+ }
+ },
+
+ hideAll: function() {
+ $(selector.popup)
+ .filter('.' + className.popupVisible)
+ .each(function() {
+ $(this)
+ .data(metadata.activator)
+ .popup('hide')
+ ;
+ })
+ ;
+ },
+ exists: function() {
+ if(!$popup) {
+ return false;
+ }
+ if(settings.inline || settings.popup) {
+ return ( module.has.popup() );
+ }
+ else {
+ return ( $popup.closest($context).length >= 1 )
+ ? true
+ : false
+ ;
+ }
+ },
+
+ removePopup: function() {
+ if( module.has.popup() && !settings.popup) {
+ module.debug('Removing popup', $popup);
+ $popup.remove();
+ $popup = undefined;
+ settings.onRemove.call($popup, element);
+ }
+ },
+
+ save: {
+ conditions: function() {
+ module.cache = {
+ title: $module.attr('title')
+ };
+ if (module.cache.title) {
+ $module.removeAttr('title');
+ }
+ module.verbose('Saving original attributes', module.cache.title);
+ }
+ },
+ restore: {
+ conditions: function() {
+ if(module.cache && module.cache.title) {
+ $module.attr('title', module.cache.title);
+ module.verbose('Restoring original attributes', module.cache.title);
+ }
+ return true;
+ }
+ },
+ supports: {
+ svg: function() {
+ return (typeof SVGGraphicsElement !== 'undefined');
+ }
+ },
+ animate: {
+ show: function(callback) {
+ callback = $.isFunction(callback) ? callback : function(){};
+ if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
+ module.set.visible();
+ $popup
+ .transition({
+ animation : (settings.transition.showMethod || settings.transition) + ' in',
+ queue : false,
+ debug : settings.debug,
+ verbose : settings.verbose,
+ duration : settings.transition.showDuration || settings.duration,
+ onComplete : function() {
+ module.bind.close();
+ callback.call($popup, element);
+ settings.onVisible.call($popup, element);
+ }
+ })
+ ;
+ }
+ else {
+ module.error(error.noTransition);
+ }
+ },
+ hide: function(callback) {
+ callback = $.isFunction(callback) ? callback : function(){};
+ module.debug('Hiding pop-up');
+ if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
+ $popup
+ .transition({
+ animation : (settings.transition.hideMethod || settings.transition) + ' out',
+ queue : false,
+ duration : settings.transition.hideDuration || settings.duration,
+ debug : settings.debug,
+ verbose : settings.verbose,
+ onComplete : function() {
+ module.reset();
+ callback.call($popup, element);
+ settings.onHidden.call($popup, element);
+ }
+ })
+ ;
+ }
+ else {
+ module.error(error.noTransition);
+ }
+ }
+ },
+
+ change: {
+ content: function(html) {
+ $popup.html(html);
+ }
+ },
+
+ get: {
+ html: function() {
+ $module.removeData(metadata.html);
+ return $module.data(metadata.html) || settings.html;
+ },
+ title: function() {
+ $module.removeData(metadata.title);
+ return $module.data(metadata.title) || settings.title;
+ },
+ content: function() {
+ $module.removeData(metadata.content);
+ return $module.data(metadata.content) || settings.content || $module.attr('title');
+ },
+ variation: function() {
+ $module.removeData(metadata.variation);
+ return $module.data(metadata.variation) || settings.variation;
+ },
+ popup: function() {
+ return $popup;
+ },
+ popupOffset: function() {
+ return $popup.offset();
+ },
+ calculations: function() {
+ var
+ $popupOffsetParent = module.get.offsetParent($popup),
+ targetElement = $target[0],
+ isWindow = ($boundary[0] == window),
+ targetOffset = $target.offset(),
+ parentOffset = settings.inline || (settings.popup && settings.movePopup)
+ ? $target.offsetParent().offset()
+ : { top: 0, left: 0 },
+ screenPosition = (isWindow)
+ ? { top: 0, left: 0 }
+ : $boundary.offset(),
+ calculations = {},
+ scroll = (isWindow)
+ ? { top: $window.scrollTop(), left: $window.scrollLeft() }
+ : { top: 0, left: 0},
+ screen
+ ;
+ calculations = {
+ // element which is launching popup
+ target : {
+ element : $target[0],
+ width : $target.outerWidth(),
+ height : $target.outerHeight(),
+ top : targetOffset.top - parentOffset.top,
+ left : targetOffset.left - parentOffset.left,
+ margin : {}
+ },
+ // popup itself
+ popup : {
+ width : $popup.outerWidth(),
+ height : $popup.outerHeight()
+ },
+ // offset container (or 3d context)
+ parent : {
+ width : $offsetParent.outerWidth(),
+ height : $offsetParent.outerHeight()
+ },
+ // screen boundaries
+ screen : {
+ top : screenPosition.top,
+ left : screenPosition.left,
+ scroll: {
+ top : scroll.top,
+ left : scroll.left
+ },
+ width : $boundary.width(),
+ height : $boundary.height()
+ }
+ };
+
+ // if popup offset context is not same as target, then adjust calculations
+ if($popupOffsetParent.get(0) !== $offsetParent.get(0)) {
+ var
+ popupOffset = $popupOffsetParent.offset()
+ ;
+ calculations.target.top -= popupOffset.top;
+ calculations.target.left -= popupOffset.left;
+ calculations.parent.width = $popupOffsetParent.outerWidth();
+ calculations.parent.height = $popupOffsetParent.outerHeight();
+ }
+
+ // add in container calcs if fluid
+ if( settings.setFluidWidth && module.is.fluid() ) {
+ calculations.container = {
+ width: $popup.parent().outerWidth()
+ };
+ calculations.popup.width = calculations.container.width;
+ }
+
+ // add in margins if inline
+ calculations.target.margin.top = (settings.inline)
+ ? parseInt( window.getComputedStyle(targetElement).getPropertyValue('margin-top'), 10)
+ : 0
+ ;
+ calculations.target.margin.left = (settings.inline)
+ ? module.is.rtl()
+ ? parseInt( window.getComputedStyle(targetElement).getPropertyValue('margin-right'), 10)
+ : parseInt( window.getComputedStyle(targetElement).getPropertyValue('margin-left'), 10)
+ : 0
+ ;
+ // calculate screen boundaries
+ screen = calculations.screen;
+ calculations.boundary = {
+ top : screen.top + screen.scroll.top,
+ bottom : screen.top + screen.scroll.top + screen.height,
+ left : screen.left + screen.scroll.left,
+ right : screen.left + screen.scroll.left + screen.width
+ };
+ return calculations;
+ },
+ id: function() {
+ return id;
+ },
+ startEvent: function() {
+ if(settings.on == 'hover') {
+ return 'mouseenter';
+ }
+ else if(settings.on == 'focus') {
+ return 'focus';
+ }
+ return false;
+ },
+ scrollEvent: function() {
+ return 'scroll';
+ },
+ endEvent: function() {
+ if(settings.on == 'hover') {
+ return 'mouseleave';
+ }
+ else if(settings.on == 'focus') {
+ return 'blur';
+ }
+ return false;
+ },
+ distanceFromBoundary: function(offset, calculations) {
+ var
+ distanceFromBoundary = {},
+ popup,
+ boundary
+ ;
+ calculations = calculations || module.get.calculations();
+
+ // shorthand
+ popup = calculations.popup;
+ boundary = calculations.boundary;
+
+ if(offset) {
+ distanceFromBoundary = {
+ top : (offset.top - boundary.top),
+ left : (offset.left - boundary.left),
+ right : (boundary.right - (offset.left + popup.width) ),
+ bottom : (boundary.bottom - (offset.top + popup.height) )
+ };
+ module.verbose('Distance from boundaries determined', offset, distanceFromBoundary);
+ }
+ return distanceFromBoundary;
+ },
+ offsetParent: function($element) {
+ var
+ element = ($element !== undefined)
+ ? $element[0]
+ : $target[0],
+ parentNode = element.parentNode,
+ $node = $(parentNode)
+ ;
+ if(parentNode) {
+ var
+ is2D = ($node.css('transform') === 'none'),
+ isStatic = ($node.css('position') === 'static'),
+ isBody = $node.is('body')
+ ;
+ while(parentNode && !isBody && isStatic && is2D) {
+ parentNode = parentNode.parentNode;
+ $node = $(parentNode);
+ is2D = ($node.css('transform') === 'none');
+ isStatic = ($node.css('position') === 'static');
+ isBody = $node.is('body');
+ }
+ }
+ return ($node && $node.length > 0)
+ ? $node
+ : $()
+ ;
+ },
+ positions: function() {
+ return {
+ 'top left' : false,
+ 'top center' : false,
+ 'top right' : false,
+ 'bottom left' : false,
+ 'bottom center' : false,
+ 'bottom right' : false,
+ 'left center' : false,
+ 'right center' : false
+ };
+ },
+ nextPosition: function(position) {
+ var
+ positions = position.split(' '),
+ verticalPosition = positions[0],
+ horizontalPosition = positions[1],
+ opposite = {
+ top : 'bottom',
+ bottom : 'top',
+ left : 'right',
+ right : 'left'
+ },
+ adjacent = {
+ left : 'center',
+ center : 'right',
+ right : 'left'
+ },
+ backup = {
+ 'top left' : 'top center',
+ 'top center' : 'top right',
+ 'top right' : 'right center',
+ 'right center' : 'bottom right',
+ 'bottom right' : 'bottom center',
+ 'bottom center' : 'bottom left',
+ 'bottom left' : 'left center',
+ 'left center' : 'top left'
+ },
+ adjacentsAvailable = (verticalPosition == 'top' || verticalPosition == 'bottom'),
+ oppositeTried = false,
+ adjacentTried = false,
+ nextPosition = false
+ ;
+ if(!triedPositions) {
+ module.verbose('All available positions available');
+ triedPositions = module.get.positions();
+ }
+
+ module.debug('Recording last position tried', position);
+ triedPositions[position] = true;
+
+ if(settings.prefer === 'opposite') {
+ nextPosition = [opposite[verticalPosition], horizontalPosition];
+ nextPosition = nextPosition.join(' ');
+ oppositeTried = (triedPositions[nextPosition] === true);
+ module.debug('Trying opposite strategy', nextPosition);
+ }
+ if((settings.prefer === 'adjacent') && adjacentsAvailable ) {
+ nextPosition = [verticalPosition, adjacent[horizontalPosition]];
+ nextPosition = nextPosition.join(' ');
+ adjacentTried = (triedPositions[nextPosition] === true);
+ module.debug('Trying adjacent strategy', nextPosition);
+ }
+ if(adjacentTried || oppositeTried) {
+ module.debug('Using backup position', nextPosition);
+ nextPosition = backup[position];
+ }
+ return nextPosition;
+ }
+ },
+
+ set: {
+ position: function(position, calculations) {
+
+ // exit conditions
+ if($target.length === 0 || $popup.length === 0) {
+ module.error(error.notFound);
+ return;
+ }
+ var
+ offset,
+ distanceAway,
+ target,
+ popup,
+ parent,
+ positioning,
+ popupOffset,
+ distanceFromBoundary
+ ;
+
+ calculations = calculations || module.get.calculations();
+ position = position || $module.data(metadata.position) || settings.position;
+
+ offset = $module.data(metadata.offset) || settings.offset;
+ distanceAway = settings.distanceAway;
+
+ // shorthand
+ target = calculations.target;
+ popup = calculations.popup;
+ parent = calculations.parent;
+
+ if(module.should.centerArrow(calculations)) {
+ module.verbose('Adjusting offset to center arrow on small target element');
+ if(position == 'top left' || position == 'bottom left') {
+ offset += (target.width / 2);
+ offset -= settings.arrowPixelsFromEdge;
+ }
+ if(position == 'top right' || position == 'bottom right') {
+ offset -= (target.width / 2);
+ offset += settings.arrowPixelsFromEdge;
+ }
+ }
+
+ if(target.width === 0 && target.height === 0 && !module.is.svg(target.element)) {
+ module.debug('Popup target is hidden, no action taken');
+ return false;
+ }
+
+ if(settings.inline) {
+ module.debug('Adding margin to calculation', target.margin);
+ if(position == 'left center' || position == 'right center') {
+ offset += target.margin.top;
+ distanceAway += -target.margin.left;
+ }
+ else if (position == 'top left' || position == 'top center' || position == 'top right') {
+ offset += target.margin.left;
+ distanceAway -= target.margin.top;
+ }
+ else {
+ offset += target.margin.left;
+ distanceAway += target.margin.top;
+ }
+ }
+
+ module.debug('Determining popup position from calculations', position, calculations);
+
+ if (module.is.rtl()) {
+ position = position.replace(/left|right/g, function (match) {
+ return (match == 'left')
+ ? 'right'
+ : 'left'
+ ;
+ });
+ module.debug('RTL: Popup position updated', position);
+ }
+
+ // if last attempt use specified last resort position
+ if(searchDepth == settings.maxSearchDepth && typeof settings.lastResort === 'string') {
+ position = settings.lastResort;
+ }
+
+ switch (position) {
+ case 'top left':
+ positioning = {
+ top : 'auto',
+ bottom : parent.height - target.top + distanceAway,
+ left : target.left + offset,
+ right : 'auto'
+ };
+ break;
+ case 'top center':
+ positioning = {
+ bottom : parent.height - target.top + distanceAway,
+ left : target.left + (target.width / 2) - (popup.width / 2) + offset,
+ top : 'auto',
+ right : 'auto'
+ };
+ break;
+ case 'top right':
+ positioning = {
+ bottom : parent.height - target.top + distanceAway,
+ right : parent.width - target.left - target.width - offset,
+ top : 'auto',
+ left : 'auto'
+ };
+ break;
+ case 'left center':
+ positioning = {
+ top : target.top + (target.height / 2) - (popup.height / 2) + offset,
+ right : parent.width - target.left + distanceAway,
+ left : 'auto',
+ bottom : 'auto'
+ };
+ break;
+ case 'right center':
+ positioning = {
+ top : target.top + (target.height / 2) - (popup.height / 2) + offset,
+ left : target.left + target.width + distanceAway,
+ bottom : 'auto',
+ right : 'auto'
+ };
+ break;
+ case 'bottom left':
+ positioning = {
+ top : target.top + target.height + distanceAway,
+ left : target.left + offset,
+ bottom : 'auto',
+ right : 'auto'
+ };
+ break;
+ case 'bottom center':
+ positioning = {
+ top : target.top + target.height + distanceAway,
+ left : target.left + (target.width / 2) - (popup.width / 2) + offset,
+ bottom : 'auto',
+ right : 'auto'
+ };
+ break;
+ case 'bottom right':
+ positioning = {
+ top : target.top + target.height + distanceAway,
+ right : parent.width - target.left - target.width - offset,
+ left : 'auto',
+ bottom : 'auto'
+ };
+ break;
+ }
+ if(positioning === undefined) {
+ module.error(error.invalidPosition, position);
+ }
+
+ module.debug('Calculated popup positioning values', positioning);
+
+ // tentatively place on stage
+ $popup
+ .css(positioning)
+ .removeClass(className.position)
+ .addClass(position)
+ .addClass(className.loading)
+ ;
+
+ popupOffset = module.get.popupOffset();
+
+ // see if any boundaries are surpassed with this tentative position
+ distanceFromBoundary = module.get.distanceFromBoundary(popupOffset, calculations);
+
+ if(!settings.forcePosition && module.is.offstage(distanceFromBoundary, position) ) {
+ module.debug('Position is outside viewport', position);
+ if(searchDepth < settings.maxSearchDepth) {
+ searchDepth++;
+ position = module.get.nextPosition(position);
+ module.debug('Trying new position', position);
+ return ($popup)
+ ? module.set.position(position, calculations)
+ : false
+ ;
+ }
+ else {
+ if(settings.lastResort) {
+ module.debug('No position found, showing with last position');
+ }
+ else {
+ module.debug('Popup could not find a position to display', $popup);
+ module.error(error.cannotPlace, element);
+ module.remove.attempts();
+ module.remove.loading();
+ module.reset();
+ settings.onUnplaceable.call($popup, element);
+ return false;
+ }
+ }
+ }
+ module.debug('Position is on stage', position);
+ module.remove.attempts();
+ module.remove.loading();
+ if( settings.setFluidWidth && module.is.fluid() ) {
+ module.set.fluidWidth(calculations);
+ }
+ return true;
+ },
+
+ fluidWidth: function(calculations) {
+ calculations = calculations || module.get.calculations();
+ module.debug('Automatically setting element width to parent width', calculations.parent.width);
+ $popup.css('width', calculations.container.width);
+ },
+
+ variation: function(variation) {
+ variation = variation || module.get.variation();
+ if(variation && module.has.popup() ) {
+ module.verbose('Adding variation to popup', variation);
+ $popup.addClass(variation);
+ }
+ },
+
+ visible: function() {
+ $module.addClass(className.visible);
+ }
+ },
+
+ remove: {
+ loading: function() {
+ $popup.removeClass(className.loading);
+ },
+ variation: function(variation) {
+ variation = variation || module.get.variation();
+ if(variation) {
+ module.verbose('Removing variation', variation);
+ $popup.removeClass(variation);
+ }
+ },
+ visible: function() {
+ $module.removeClass(className.visible);
+ },
+ attempts: function() {
+ module.verbose('Resetting all searched positions');
+ searchDepth = 0;
+ triedPositions = false;
+ }
+ },
+
+ bind: {
+ events: function() {
+ module.debug('Binding popup events to module');
+ if(settings.on == 'click') {
+ $module
+ .on(clickEvent + eventNamespace, module.toggle)
+ ;
+ }
+ if(settings.on == 'hover') {
+ $module
+ .on('touchstart' + eventNamespace, module.event.touchstart)
+ ;
+ }
+ if( module.get.startEvent() ) {
+ $module
+ .on(module.get.startEvent() + eventNamespace, module.event.start)
+ .on(module.get.endEvent() + eventNamespace, module.event.end)
+ ;
+ }
+ if(settings.target) {
+ module.debug('Target set to element', $target);
+ }
+ $window.on('resize' + elementNamespace, module.event.resize);
+ },
+ popup: function() {
+ module.verbose('Allowing hover events on popup to prevent closing');
+ if( $popup && module.has.popup() ) {
+ $popup
+ .on('mouseenter' + eventNamespace, module.event.start)
+ .on('mouseleave' + eventNamespace, module.event.end)
+ ;
+ }
+ },
+ close: function() {
+ if(settings.hideOnScroll === true || (settings.hideOnScroll == 'auto' && settings.on != 'click')) {
+ module.bind.closeOnScroll();
+ }
+ if(module.is.closable()) {
+ module.bind.clickaway();
+ }
+ else if(settings.on == 'hover' && openedWithTouch) {
+ module.bind.touchClose();
+ }
+ },
+ closeOnScroll: function() {
+ module.verbose('Binding scroll close event to document');
+ $scrollContext
+ .one(module.get.scrollEvent() + elementNamespace, module.event.hideGracefully)
+ ;
+ },
+ touchClose: function() {
+ module.verbose('Binding popup touchclose event to document');
+ $document
+ .on('touchstart' + elementNamespace, function(event) {
+ module.verbose('Touched away from popup');
+ module.event.hideGracefully.call(element, event);
+ })
+ ;
+ },
+ clickaway: function() {
+ module.verbose('Binding popup close event to document');
+ $document
+ .on(clickEvent + elementNamespace, function(event) {
+ module.verbose('Clicked away from popup');
+ module.event.hideGracefully.call(element, event);
+ })
+ ;
+ }
+ },
+
+ unbind: {
+ events: function() {
+ $window
+ .off(elementNamespace)
+ ;
+ $module
+ .off(eventNamespace)
+ ;
+ },
+ close: function() {
+ $document
+ .off(elementNamespace)
+ ;
+ $scrollContext
+ .off(elementNamespace)
+ ;
+ },
+ },
+
+ has: {
+ popup: function() {
+ return ($popup && $popup.length > 0);
+ }
+ },
+
+ should: {
+ centerArrow: function(calculations) {
+ return !module.is.basic() && calculations.target.width <= (settings.arrowPixelsFromEdge * 2);
+ },
+ },
+
+ is: {
+ closable: function() {
+ if(settings.closable == 'auto') {
+ if(settings.on == 'hover') {
+ return false;
+ }
+ return true;
+ }
+ return settings.closable;
+ },
+ offstage: function(distanceFromBoundary, position) {
+ var
+ offstage = []
+ ;
+ // return boundaries that have been surpassed
+ $.each(distanceFromBoundary, function(direction, distance) {
+ if(distance < -settings.jitter) {
+ module.debug('Position exceeds allowable distance from edge', direction, distance, position);
+ offstage.push(direction);
+ }
+ });
+ if(offstage.length > 0) {
+ return true;
+ }
+ else {
+ return false;
+ }
+ },
+ svg: function(element) {
+ return module.supports.svg() && (element instanceof SVGGraphicsElement);
+ },
+ basic: function() {
+ return $module.hasClass(className.basic);
+ },
+ active: function() {
+ return $module.hasClass(className.active);
+ },
+ animating: function() {
+ return ($popup !== undefined && $popup.hasClass(className.animating) );
+ },
+ fluid: function() {
+ return ($popup !== undefined && $popup.hasClass(className.fluid));
+ },
+ visible: function() {
+ return ($popup !== undefined && $popup.hasClass(className.popupVisible));
+ },
+ dropdown: function() {
+ return $module.hasClass(className.dropdown);
+ },
+ hidden: function() {
+ return !module.is.visible();
+ },
+ rtl: function () {
+ return $module.attr('dir') === 'rtl' || $module.css('direction') === 'rtl';
+ }
+ },
+
+ reset: function() {
+ module.remove.visible();
+ if(settings.preserve) {
+ if($.fn.transition !== undefined) {
+ $popup
+ .transition('remove transition')
+ ;
+ }
+ }
+ else {
+ module.removePopup();
+ }
+ },
+
+ setting: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ settings[name] = value;
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ }
+ })
+ ;
+
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.fn.popup.settings = {
+
+ name : 'Popup',
+
+ // module settings
+ silent : false,
+ debug : false,
+ verbose : false,
+ performance : true,
+ namespace : 'popup',
+
+ // whether it should use dom mutation observers
+ observeChanges : true,
+
+ // callback only when element added to dom
+ onCreate : function(){},
+
+ // callback before element removed from dom
+ onRemove : function(){},
+
+ // callback before show animation
+ onShow : function(){},
+
+ // callback after show animation
+ onVisible : function(){},
+
+ // callback before hide animation
+ onHide : function(){},
+
+ // callback when popup cannot be positioned in visible screen
+ onUnplaceable : function(){},
+
+ // callback after hide animation
+ onHidden : function(){},
+
+ // when to show popup
+ on : 'hover',
+
+ // element to use to determine if popup is out of boundary
+ boundary : window,
+
+ // whether to add touchstart events when using hover
+ addTouchEvents : true,
+
+ // default position relative to element
+ position : 'top left',
+
+ // if given position should be used regardless if popup fits
+ forcePosition : false,
+
+ // name of variation to use
+ variation : '',
+
+ // whether popup should be moved to context
+ movePopup : true,
+
+ // element which popup should be relative to
+ target : false,
+
+ // jq selector or element that should be used as popup
+ popup : false,
+
+ // popup should remain inline next to activator
+ inline : false,
+
+ // popup should be removed from page on hide
+ preserve : false,
+
+ // popup should not close when being hovered on
+ hoverable : false,
+
+ // explicitly set content
+ content : false,
+
+ // explicitly set html
+ html : false,
+
+ // explicitly set title
+ title : false,
+
+ // whether automatically close on clickaway when on click
+ closable : true,
+
+ // automatically hide on scroll
+ hideOnScroll : 'auto',
+
+ // hide other popups on show
+ exclusive : false,
+
+ // context to attach popups
+ context : 'body',
+
+ // context for binding scroll events
+ scrollContext : window,
+
+ // position to prefer when calculating new position
+ prefer : 'opposite',
+
+ // specify position to appear even if it doesn't fit
+ lastResort : false,
+
+ // number of pixels from edge of popup to pointing arrow center (used from centering)
+ arrowPixelsFromEdge: 20,
+
+ // delay used to prevent accidental refiring of animations due to user error
+ delay : {
+ show : 50,
+ hide : 70
+ },
+
+ // whether fluid variation should assign width explicitly
+ setFluidWidth : true,
+
+ // transition settings
+ duration : 200,
+ transition : 'scale',
+
+ // distance away from activating element in px
+ distanceAway : 0,
+
+ // number of pixels an element is allowed to be "offstage" for a position to be chosen (allows for rounding)
+ jitter : 2,
+
+ // offset on aligning axis from calculated position
+ offset : 0,
+
+ // maximum times to look for a position before failing (9 positions total)
+ maxSearchDepth : 15,
+
+ error: {
+ invalidPosition : 'The position you specified is not a valid position',
+ cannotPlace : 'Popup does not fit within the boundaries of the viewport',
+ method : 'The method you called is not defined.',
+ noTransition : 'This module requires ui transitions ',
+ notFound : 'The target or popup you specified does not exist on the page'
+ },
+
+ metadata: {
+ activator : 'activator',
+ content : 'content',
+ html : 'html',
+ offset : 'offset',
+ position : 'position',
+ title : 'title',
+ variation : 'variation'
+ },
+
+ className : {
+ active : 'active',
+ basic : 'basic',
+ animating : 'animating',
+ dropdown : 'dropdown',
+ fluid : 'fluid',
+ loading : 'loading',
+ popup : 'ui popup',
+ position : 'top left center bottom right',
+ visible : 'visible',
+ popupVisible : 'visible'
+ },
+
+ selector : {
+ popup : '.ui.popup'
+ },
+
+ templates: {
+ escape: function(string) {
+ var
+ badChars = /[<>"'`]/g,
+ shouldEscape = /[&<>"'`]/,
+ escape = {
+ "<": "<",
+ ">": ">",
+ '"': """,
+ "'": "'",
+ "`": "`"
+ },
+ escapedChar = function(chr) {
+ return escape[chr];
+ }
+ ;
+ if(shouldEscape.test(string)) {
+ string = string.replace(/&(?![a-z0-9#]{1,6};)/, "&");
+ return string.replace(badChars, escapedChar);
+ }
+ return string;
+ },
+ popup: function(text) {
+ var
+ html = '',
+ escape = $.fn.popup.settings.templates.escape
+ ;
+ if(typeof text !== undefined) {
+ if(typeof text.title !== undefined && text.title) {
+ text.title = escape(text.title);
+ html += '';
+ }
+ if(typeof text.content !== undefined && text.content) {
+ text.content = escape(text.content);
+ html += '' + text.content + '
';
+ }
+ }
+ return html;
+ }
+ }
+
+};
+
+
+})( jQuery, window, document );
diff --git a/public/dist/components/popup.min.css b/public/dist/components/popup.min.css
new file mode 100644
index 000000000..24a4f84dd
--- /dev/null
+++ b/public/dist/components/popup.min.css
@@ -0,0 +1,9 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Popup
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */.ui.popup{display:none;position:absolute;top:0;right:0;min-width:-webkit-min-content;min-width:-moz-min-content;min-width:min-content;z-index:1900;border:1px solid #d4d4d5;line-height:1.4285em;max-width:250px;background:#fff;padding:.833em 1em;font-weight:400;font-style:normal;color:rgba(0,0,0,.87);border-radius:.28571429rem;-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.popup>.header{padding:0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1.14285714em;line-height:1.2;font-weight:700}.ui.popup>.header+.content{padding-top:.5em}.ui.popup:before{position:absolute;content:'';width:.71428571em;height:.71428571em;background:#fff;-webkit-transform:rotate(45deg);transform:rotate(45deg);z-index:1901;-webkit-box-shadow:1px 1px 0 0 #bababc;box-shadow:1px 1px 0 0 #bababc}[data-tooltip]{position:relative}[data-tooltip]:before{pointer-events:none;position:absolute;content:'';font-size:1rem;width:.71428571em;height:.71428571em;background:#fff;-webkit-transform:rotate(45deg);transform:rotate(45deg);z-index:1901;-webkit-box-shadow:1px 1px 0 0 #bababc;box-shadow:1px 1px 0 0 #bababc}[data-tooltip]:after{pointer-events:none;content:attr(data-tooltip);position:absolute;text-transform:none;text-align:left;text-shadow:none;white-space:nowrap;font-size:1rem;border:1px solid #d4d4d5;line-height:1.4285em;max-width:none;background:#fff;padding:.833em 1em;font-weight:400;font-style:normal;color:rgba(0,0,0,.87);border-radius:.28571429rem;-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);z-index:1900}[data-tooltip]:not([data-position]):before{top:auto;right:auto;bottom:100%;left:50%;background:#fff;margin-left:-.07142857rem;margin-bottom:.14285714rem}[data-tooltip]:not([data-position]):after{left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);bottom:100%;margin-bottom:.5em}[data-tooltip]:after,[data-tooltip]:before{pointer-events:none;visibility:hidden;opacity:0;-webkit-transition:opacity .1s ease,-webkit-transform .1s ease;transition:opacity .1s ease,-webkit-transform .1s ease;transition:transform .1s ease,opacity .1s ease;transition:transform .1s ease,opacity .1s ease,-webkit-transform .1s ease}[data-tooltip]:before{-webkit-transform:rotate(45deg) scale(0)!important;transform:rotate(45deg) scale(0)!important;-webkit-transform-origin:center top;transform-origin:center top}[data-tooltip]:after{-webkit-transform-origin:center bottom;transform-origin:center bottom}[data-tooltip]:hover:after,[data-tooltip]:hover:before{visibility:visible;pointer-events:auto;opacity:1}[data-tooltip]:hover:before{-webkit-transform:rotate(45deg) scale(1)!important;transform:rotate(45deg) scale(1)!important}[data-tooltip]:after,[data-tooltip][data-position="bottom center"]:after,[data-tooltip][data-position="top center"]:after{-webkit-transform:translateX(-50%) scale(0)!important;transform:translateX(-50%) scale(0)!important}[data-tooltip]:hover:after,[data-tooltip][data-position="bottom center"]:hover:after{-webkit-transform:translateX(-50%) scale(1)!important;transform:translateX(-50%) scale(1)!important}[data-tooltip][data-position="left center"]:after,[data-tooltip][data-position="right center"]:after{-webkit-transform:translateY(-50%) scale(0)!important;transform:translateY(-50%) scale(0)!important}[data-tooltip][data-position="left center"]:hover:after,[data-tooltip][data-position="right center"]:hover:after{-webkit-transform:translateY(-50%) scale(1)!important;transform:translateY(-50%) scale(1)!important;-moz-transform:translateY(-50%) scale(1.0001)!important}[data-tooltip][data-position="bottom left"]:after,[data-tooltip][data-position="bottom right"]:after,[data-tooltip][data-position="top left"]:after,[data-tooltip][data-position="top right"]:after{-webkit-transform:scale(0)!important;transform:scale(0)!important}[data-tooltip][data-position="bottom left"]:hover:after,[data-tooltip][data-position="bottom right"]:hover:after,[data-tooltip][data-position="top left"]:hover:after,[data-tooltip][data-position="top right"]:hover:after{-webkit-transform:scale(1)!important;transform:scale(1)!important}[data-tooltip][data-variation~=fixed]:after{white-space:normal;width:250px}[data-tooltip][data-variation*="wide fixed"]:after{width:350px}[data-tooltip][data-variation*="very wide fixed"]:after{width:550px}@media only screen and (max-width:767.98px){[data-tooltip][data-variation~=fixed]:after{width:250px}}[data-tooltip][data-inverted]:before{-webkit-box-shadow:none!important;box-shadow:none!important}[data-tooltip][data-inverted]:before{background:#1b1c1d}[data-tooltip][data-inverted]:after{background:#1b1c1d;color:#fff;border:none;-webkit-box-shadow:none;box-shadow:none}[data-tooltip][data-inverted]:after .header{background:0 0;color:#fff}[data-position~=top][data-tooltip]:before{background:#fff}[data-position="top center"][data-tooltip]:after{top:auto;right:auto;left:50%;bottom:100%;-webkit-transform:translateX(-50%);transform:translateX(-50%);margin-bottom:.5em}[data-position="top center"][data-tooltip]:before{top:auto;right:auto;bottom:100%;left:50%;background:#fff;margin-left:-.07142857rem;margin-bottom:.14285714rem}[data-position="top left"][data-tooltip]:after{top:auto;right:auto;left:0;bottom:100%;margin-bottom:.5em}[data-position="top left"][data-tooltip]:before{top:auto;right:auto;bottom:100%;left:1em;margin-left:-.07142857rem;margin-bottom:.14285714rem}[data-position="top right"][data-tooltip]:after{top:auto;left:auto;right:0;bottom:100%;margin-bottom:.5em}[data-position="top right"][data-tooltip]:before{top:auto;left:auto;bottom:100%;right:1em;margin-left:-.07142857rem;margin-bottom:.14285714rem}[data-position~=bottom][data-tooltip]:before{background:#fff;-webkit-box-shadow:-1px -1px 0 0 #bababc;box-shadow:-1px -1px 0 0 #bababc}[data-position="bottom center"][data-tooltip]:after{bottom:auto;right:auto;left:50%;top:100%;-webkit-transform:translateX(-50%);transform:translateX(-50%);margin-top:.5em}[data-position="bottom center"][data-tooltip]:before{bottom:auto;right:auto;top:100%;left:50%;margin-left:-.07142857rem;margin-top:.30714286em;-webkit-transform-origin:center top;transform-origin:center top}[data-position="bottom left"][data-tooltip]:after{left:0;top:100%;margin-top:.5em}[data-position="bottom left"][data-tooltip]:before{bottom:auto;right:auto;top:100%;left:1em;margin-left:-.07142857rem;margin-top:.14285714rem}[data-position="bottom right"][data-tooltip]:after{right:0;top:100%;margin-top:.5em}[data-position="bottom right"][data-tooltip]:before{bottom:auto;left:auto;top:100%;right:1em;margin-left:-.14285714rem;margin-top:.07142857rem}[data-position="left center"][data-tooltip]:after{right:100%;top:50%;margin-right:.5em;-webkit-transform:translateY(-50%);transform:translateY(-50%)}[data-position="left center"][data-tooltip]:before{right:100%;top:50%;margin-top:-.14285714rem;margin-right:-.07142857rem;background:#fff;-webkit-box-shadow:1px -1px 0 0 #bababc;box-shadow:1px -1px 0 0 #bababc}[data-position="right center"][data-tooltip]:after{left:100%;top:50%;margin-left:.5em;-webkit-transform:translateY(-50%);transform:translateY(-50%)}[data-position="right center"][data-tooltip]:before{left:100%;top:50%;margin-top:-.07142857rem;margin-left:.14285714rem;background:#fff;-webkit-box-shadow:-1px 1px 0 0 #bababc;box-shadow:-1px 1px 0 0 #bababc}[data-inverted][data-position~=bottom][data-tooltip]:before{background:#1b1c1d;-webkit-box-shadow:-1px -1px 0 0 #bababc;box-shadow:-1px -1px 0 0 #bababc}[data-inverted][data-position="left center"][data-tooltip]:before{background:#1b1c1d;-webkit-box-shadow:1px -1px 0 0 #bababc;box-shadow:1px -1px 0 0 #bababc}[data-inverted][data-position="right center"][data-tooltip]:before{background:#1b1c1d;-webkit-box-shadow:-1px 1px 0 0 #bababc;box-shadow:-1px 1px 0 0 #bababc}[data-inverted][data-position~=top][data-tooltip]:before{background:#1b1c1d}[data-position~=bottom][data-tooltip]:before{-webkit-transform-origin:center bottom;transform-origin:center bottom}[data-position~=bottom][data-tooltip]:after{-webkit-transform-origin:center top;transform-origin:center top}[data-position="left center"][data-tooltip]:before{-webkit-transform-origin:top center;transform-origin:top center}[data-position="left center"][data-tooltip]:after{-webkit-transform-origin:right center;transform-origin:right center}[data-position="right center"][data-tooltip]:before{-webkit-transform-origin:right center;transform-origin:right center}[data-position="right center"][data-tooltip]:after{-webkit-transform-origin:left center;transform-origin:left center}[data-tooltip][data-variation~=basic]:before{display:none}.ui.popup{margin:0}.ui.top.popup{margin:0 0 .71428571em}.ui.top.left.popup{-webkit-transform-origin:left bottom;transform-origin:left bottom}.ui.top.center.popup{-webkit-transform-origin:center bottom;transform-origin:center bottom}.ui.top.right.popup{-webkit-transform-origin:right bottom;transform-origin:right bottom}.ui.left.center.popup{margin:0 .71428571em 0 0;-webkit-transform-origin:right 50%;transform-origin:right 50%}.ui.right.center.popup{margin:0 0 0 .71428571em;-webkit-transform-origin:left 50%;transform-origin:left 50%}.ui.bottom.popup{margin:.71428571em 0 0}.ui.bottom.left.popup{-webkit-transform-origin:left top;transform-origin:left top}.ui.bottom.center.popup{-webkit-transform-origin:center top;transform-origin:center top}.ui.bottom.right.popup{-webkit-transform-origin:right top;transform-origin:right top}.ui.bottom.center.popup:before{margin-left:-.30714286em;top:-.30714286em;left:50%;right:auto;bottom:auto;-webkit-box-shadow:-1px -1px 0 0 #bababc;box-shadow:-1px -1px 0 0 #bababc}.ui.bottom.left.popup{margin-left:0}.ui.bottom.left.popup:before{top:-.30714286em;left:1em;right:auto;bottom:auto;margin-left:0;-webkit-box-shadow:-1px -1px 0 0 #bababc;box-shadow:-1px -1px 0 0 #bababc}.ui.bottom.right.popup{margin-right:0}.ui.bottom.right.popup:before{top:-.30714286em;right:1em;bottom:auto;left:auto;margin-left:0;-webkit-box-shadow:-1px -1px 0 0 #bababc;box-shadow:-1px -1px 0 0 #bababc}.ui.top.center.popup:before{top:auto;right:auto;bottom:-.30714286em;left:50%;margin-left:-.30714286em}.ui.top.left.popup{margin-left:0}.ui.top.left.popup:before{bottom:-.30714286em;left:1em;top:auto;right:auto;margin-left:0}.ui.top.right.popup{margin-right:0}.ui.top.right.popup:before{bottom:-.30714286em;right:1em;top:auto;left:auto;margin-left:0}.ui.left.center.popup:before{top:50%;right:-.30714286em;bottom:auto;left:auto;margin-top:-.30714286em;-webkit-box-shadow:1px -1px 0 0 #bababc;box-shadow:1px -1px 0 0 #bababc}.ui.right.center.popup:before{top:50%;left:-.30714286em;bottom:auto;right:auto;margin-top:-.30714286em;-webkit-box-shadow:-1px 1px 0 0 #bababc;box-shadow:-1px 1px 0 0 #bababc}.ui.left.center.popup:before,.ui.right.center.popup:before{background:#fff}.ui.bottom.popup:before{background:#fff}.ui.top.popup:before{background:#fff}.ui.inverted.bottom.popup:before{background:#1b1c1d}.ui.inverted.left.center.popup:before,.ui.inverted.right.center.popup:before{background:#1b1c1d}.ui.inverted.top.popup:before{background:#1b1c1d}.ui.popup>.ui.grid:not(.padded){width:calc(100% + 1.75rem);margin:-.7rem -.875rem}.ui.loading.popup{display:block;visibility:hidden;z-index:-1}.ui.animating.popup,.ui.visible.popup{display:block}.ui.visible.popup{-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden}.ui.basic.popup:before{display:none}.ui.fixed.popup{width:250px}.ui.wide.popup{max-width:350px}.ui.wide.popup.fixed{width:350px}.ui[class*="very wide"].popup{max-width:550px}.ui[class*="very wide"].popup.fixed{width:550px}@media only screen and (max-width:767.98px){.ui.wide.popup,.ui[class*="very wide"].popup{max-width:250px}.ui.wide.popup.fixed,.ui[class*="very wide"].popup.fixed{width:250px}}.ui.fluid.popup{width:100%;max-width:none}.ui.inverted.popup{background:#1b1c1d;color:#fff;border:none;-webkit-box-shadow:none;box-shadow:none}.ui.inverted.popup .header{background-color:none;color:#fff}.ui.inverted.popup:before{background-color:#1b1c1d;-webkit-box-shadow:none!important;box-shadow:none!important}.ui.flowing.popup{max-width:none}.ui.popup{font-size:1rem}.ui.mini.popup{font-size:.78571429rem}[data-tooltip][data-variation~=mini]:after,[data-tooltip][data-variation~=mini]:before{font-size:.78571429rem}.ui.tiny.popup{font-size:.85714286rem}[data-tooltip][data-variation~=tiny]:after,[data-tooltip][data-variation~=tiny]:before{font-size:.85714286rem}.ui.small.popup{font-size:.92857143rem}[data-tooltip][data-variation~=small]:after,[data-tooltip][data-variation~=small]:before{font-size:.92857143rem}.ui.large.popup{font-size:1.14285714rem}[data-tooltip][data-variation~=large]:after,[data-tooltip][data-variation~=large]:before{font-size:1.14285714rem}.ui.big.popup{font-size:1.28571429rem}[data-tooltip][data-variation~=big]:after,[data-tooltip][data-variation~=big]:before{font-size:1.28571429rem}.ui.huge.popup{font-size:1.42857143rem}[data-tooltip][data-variation~=huge]:after,[data-tooltip][data-variation~=huge]:before{font-size:1.42857143rem}.ui.massive.popup{font-size:1.71428571rem}[data-tooltip][data-variation~=massive]:after,[data-tooltip][data-variation~=massive]:before{font-size:1.71428571rem}
\ No newline at end of file
diff --git a/public/dist/components/popup.min.js b/public/dist/components/popup.min.js
new file mode 100644
index 000000000..08596f18c
--- /dev/null
+++ b/public/dist/components/popup.min.js
@@ -0,0 +1,11 @@
+/*
+ * # Fomantic UI - 2.8.8
+ * https://github.com/fomantic/Fomantic-UI
+ * http://fomantic-ui.com/
+ *
+ * Copyright 2021 Contributors
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+!function(N,V,W,z){"use strict";N.isFunction=N.isFunction||function(t){return"function"==typeof t&&"number"!=typeof t.nodeType},V=void 0!==V&&V.Math==Math?V:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),N.fn.popup=function(x){var E,t=N(this),k=N(W),S=N(V),A=N("body"),F=t.selector||"",D="ontouchstart"in W.documentElement?"touchstart":"click",O=(new Date).getTime(),j=[],R=x,M="string"==typeof R,H=[].slice.call(arguments,1);return t.each(function(){var u,c,t,e,o,d,f=N.isPlainObject(x)?N.extend(!0,{},N.fn.popup.settings,x):N.extend({},N.fn.popup.settings),i=f.selector,h=f.className,g=f.error,m=f.metadata,n=f.namespace,r="."+f.namespace,a="module-"+n,v=N(this),s=N(f.context),p=N(f.scrollContext),b=N(f.boundary),w=f.target?N(f.target):v,y=0,l=!1,P=!1,C=this,T=v.data(a);d={initialize:function(){d.debug("Initializing",v),d.createID(),d.bind.events(),!d.exists()&&f.preserve&&d.create(),f.observeChanges&&d.observeChanges(),d.instantiate()},instantiate:function(){d.verbose("Storing instance",d),T=d,v.data(a,T)},observeChanges:function(){"MutationObserver"in V&&((t=new MutationObserver(d.event.documentChanged)).observe(W,{childList:!0,subtree:!0}),d.debug("Setting up mutation observer",t))},refresh:function(){f.popup?u=N(f.popup).eq(0):f.inline&&(u=w.nextAll(i.popup).eq(0),f.popup=u),f.popup?(u.addClass(h.loading),c=d.get.offsetParent(),u.removeClass(h.loading),f.movePopup&&d.has.popup()&&d.get.offsetParent(u)[0]!==c[0]&&(d.debug("Moving popup to the same offset parent as target"),u.detach().appendTo(c))):c=f.inline?d.get.offsetParent(w):d.has.popup()?d.get.offsetParent(u):A,c.is("html")&&c[0]!==A[0]&&(d.debug("Setting page as offset parent"),c=A),d.get.variation()&&d.set.variation()},reposition:function(){d.refresh(),d.set.position()},destroy:function(){d.debug("Destroying previous module"),t&&t.disconnect(),u&&!f.preserve&&d.removePopup(),clearTimeout(d.hideTimer),clearTimeout(d.showTimer),d.unbind.close(),d.unbind.events(),v.removeData(a)},event:{start:function(t){var e=N.isPlainObject(f.delay)?f.delay.show:f.delay;clearTimeout(d.hideTimer),(!P||P&&f.addTouchEvents)&&(d.showTimer=setTimeout(d.show,e))},end:function(){var t=N.isPlainObject(f.delay)?f.delay.hide:f.delay;clearTimeout(d.showTimer),d.hideTimer=setTimeout(d.hide,t)},touchstart:function(t){P=!0,f.addTouchEvents&&d.show()},resize:function(){d.is.visible()&&d.set.position()},documentChanged:function(t){[].forEach.call(t,function(t){t.removedNodes&&[].forEach.call(t.removedNodes,function(t){(t==C||0 ").addClass(h.popup).data(m.activator,v).html(t),f.inline?(d.verbose("Inserting popup element inline",u),u.insertAfter(v)):(d.verbose("Appending popup element to body",u),u.appendTo(s)),d.refresh(),d.set.variation(),f.hoverable&&d.bind.popup(),f.onCreate.call(u,C)):f.popup?(N(f.popup).data(m.activator,v),d.verbose("Used popup specified in settings"),d.refresh(),f.hoverable&&d.bind.popup()):0!==w.next(i.popup).length?(d.verbose("Pre-existing popup found"),f.inline=!0,f.popup=w.next(i.popup).data(m.activator,v),d.refresh(),f.hoverable&&d.bind.popup()):d.debug("No content specified skipping display",C)},createID:function(){o=(Math.random().toString(16)+"000000000").substr(2,8),e="."+o,d.verbose("Creating unique id for element",o)},toggle:function(){d.debug("Toggling pop-up"),d.is.hidden()?(d.debug("Popup is hidden, showing pop-up"),d.unbind.close(),d.show()):(d.debug("Popup is visible, hiding pop-up"),d.hide())},show:function(t){if(t=t||function(){},d.debug("Showing pop-up",f.transition),d.is.hidden()&&(!d.is.active()||!d.is.dropdown())){if(d.exists()||d.create(),!1===f.onShow.call(u,C))return void d.debug("onShow callback returned false, cancelling popup animation");f.preserve||f.popup||d.refresh(),u&&d.set.position()&&(d.save.conditions(),f.exclusive&&d.hideAll(),d.animate.show(t))}},hide:function(t){if(t=t||function(){},d.is.visible()||d.is.animating()){if(!1===f.onHide.call(u,C))return void d.debug("onHide callback returned false, cancelling popup animation");d.remove.visible(),d.unbind.close(),d.restore.conditions(),d.animate.hide(t)}},hideAll:function(){N(i.popup).filter("."+h.popupVisible).each(function(){N(this).data(m.activator).popup("hide")})},exists:function(){return!!u&&(f.inline||f.popup?d.has.popup():1<=u.closest(s).length)},removePopup:function(){d.has.popup()&&!f.popup&&(d.debug("Removing popup",u),u.remove(),u=z,f.onRemove.call(u,C))},save:{conditions:function(){d.cache={title:v.attr("title")},d.cache.title&&v.removeAttr("title"),d.verbose("Saving original attributes",d.cache.title)}},restore:{conditions:function(){return d.cache&&d.cache.title&&(v.attr("title",d.cache.title),d.verbose("Restoring original attributes",d.cache.title)),!0}},supports:{svg:function(){return"undefined"!=typeof SVGGraphicsElement}},animate:{show:function(t){t=N.isFunction(t)?t:function(){},f.transition&&N.fn.transition!==z&&v.transition("is supported")?(d.set.visible(),u.transition({animation:(f.transition.showMethod||f.transition)+" in",queue:!1,debug:f.debug,verbose:f.verbose,duration:f.transition.showDuration||f.duration,onComplete:function(){d.bind.close(),t.call(u,C),f.onVisible.call(u,C)}})):d.error(g.noTransition)},hide:function(t){t=N.isFunction(t)?t:function(){},d.debug("Hiding pop-up"),f.transition&&N.fn.transition!==z&&v.transition("is supported")?u.transition({animation:(f.transition.hideMethod||f.transition)+" out",queue:!1,duration:f.transition.hideDuration||f.duration,debug:f.debug,verbose:f.verbose,onComplete:function(){d.reset(),t.call(u,C),f.onHidden.call(u,C)}}):d.error(g.noTransition)}},change:{content:function(t){u.html(t)}},get:{html:function(){return v.removeData(m.html),v.data(m.html)||f.html},title:function(){return v.removeData(m.title),v.data(m.title)||f.title},content:function(){return v.removeData(m.content),v.data(m.content)||f.content||v.attr("title")},variation:function(){return v.removeData(m.variation),v.data(m.variation)||f.variation},popup:function(){return u},popupOffset:function(){return u.offset()},calculations:function(){var t,e=d.get.offsetParent(u),o=w[0],n=b[0]==V,i=w.offset(),r=f.inline||f.popup&&f.movePopup?w.offsetParent().offset():{top:0,left:0},a=n?{top:0,left:0}:b.offset(),s={},p=n?{top:S.scrollTop(),left:S.scrollLeft()}:{top:0,left:0};if(s={target:{element:w[0],width:w.outerWidth(),height:w.outerHeight(),top:i.top-r.top,left:i.left-r.left,margin:{}},popup:{width:u.outerWidth(),height:u.outerHeight()},parent:{width:c.outerWidth(),height:c.outerHeight()},screen:{top:a.top,left:a.left,scroll:{top:p.top,left:p.left},width:b.width(),height:b.height()}},e.get(0)!==c.get(0)){var l=e.offset();s.target.top-=l.top,s.target.left-=l.left,s.parent.width=e.outerWidth(),s.parent.height=e.outerHeight()}return f.setFluidWidth&&d.is.fluid()&&(s.container={width:u.parent().outerWidth()},s.popup.width=s.container.width),s.target.margin.top=f.inline?parseInt(V.getComputedStyle(o).getPropertyValue("margin-top"),10):0,s.target.margin.left=f.inline?d.is.rtl()?parseInt(V.getComputedStyle(o).getPropertyValue("margin-right"),10):parseInt(V.getComputedStyle(o).getPropertyValue("margin-left"),10):0,t=s.screen,s.boundary={top:t.top+t.scroll.top,bottom:t.top+t.scroll.top+t.height,left:t.left+t.scroll.left,right:t.left+t.scroll.left+t.width},s},id:function(){return o},startEvent:function(){return"hover"==f.on?"mouseenter":"focus"==f.on&&"focus"},scrollEvent:function(){return"scroll"},endEvent:function(){return"hover"==f.on?"mouseleave":"focus"==f.on&&"blur"},distanceFromBoundary:function(t,e){var o,n,i={};return o=(e=e||d.get.calculations()).popup,n=e.boundary,t&&(i={top:t.top-n.top,left:t.left-n.left,right:n.right-(t.left+o.width),bottom:n.bottom-(t.top+o.height)},d.verbose("Distance from boundaries determined",t,i)),i},offsetParent:function(t){var e=(t!==z?t[0]:w[0]).parentNode,o=N(e);if(e)for(var n="none"===o.css("transform"),i="static"===o.css("position"),r=o.is("body");e&&!r&&i&&n;)e=e.parentNode,n="none"===(o=N(e)).css("transform"),i="static"===o.css("position"),r=o.is("body");return o&&0",notFound:"The target or popup you specified does not exist on the page"},metadata:{activator:"activator",content:"content",html:"html",offset:"offset",position:"position",title:"title",variation:"variation"},className:{active:"active",basic:"basic",animating:"animating",dropdown:"dropdown",fluid:"fluid",loading:"loading",popup:"ui popup",position:"top left center bottom right",visible:"visible",popupVisible:"visible"},selector:{popup:".ui.popup"},templates:{escape:function(t){var e={"<":"<",">":">",'"':""","'":"'","`":"`"};return/[&<>"'`]/.test(t)?(t=t.replace(/&(?![a-z0-9#]{1,6};)/,"&")).replace(/[<>"'`]/g,function(t){return e[t]}):t},popup:function(t){var e="",o=N.fn.popup.settings.templates.escape;return typeof t!==z&&(typeof t.title!==z&&t.title&&(t.title=o(t.title),e+='"),typeof t.content!==z&&t.content&&(t.content=o(t.content),e+=''+t.content+"
")),e}}}}(jQuery,window,document);
\ No newline at end of file
diff --git a/public/dist/components/progress.css b/public/dist/components/progress.css
new file mode 100644
index 000000000..490a99d12
--- /dev/null
+++ b/public/dist/components/progress.css
@@ -0,0 +1,857 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Progress Bar
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+
+/*******************************
+ Progress
+*******************************/
+
+.ui.progress {
+ position: relative;
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ max-width: 100%;
+ border: none;
+ margin: 1em 0 2.5em;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ background: rgba(0, 0, 0, 0.1);
+ padding: 0;
+ border-radius: 0.28571429rem;
+}
+.ui.progress:first-child {
+ margin: 0 0 2.5em;
+}
+.ui.progress:last-child {
+ margin: 0 0 1.5em;
+}
+
+
+/*******************************
+ Content
+*******************************/
+
+
+/* Activity Bar */
+.ui.progress .bar {
+ display: block;
+ line-height: 1;
+ position: relative;
+ width: 0;
+ min-width: 2em;
+ background: #888888;
+ border-radius: 0.28571429rem;
+ -webkit-transition: width 0.1s ease, background-color 0.1s ease;
+ transition: width 0.1s ease, background-color 0.1s ease;
+ overflow: hidden;
+}
+.ui.ui.ui.progress:not([data-percent]):not(.indeterminate) .bar,
+.ui.ui.ui.progress[data-percent="0"]:not(.indeterminate) .bar {
+ background: transparent;
+}
+.ui.progress[data-percent="0"] .bar .progress {
+ color: rgba(0, 0, 0, 0.87);
+}
+.ui.inverted.progress[data-percent="0"] .bar .progress {
+ color: rgba(255, 255, 255, 0.9);
+}
+
+/* Percent Complete */
+.ui.progress .bar > .progress {
+ white-space: nowrap;
+ position: absolute;
+ width: auto;
+ font-size: 0.92857143em;
+ top: 50%;
+ right: 0.5em;
+ left: auto;
+ bottom: auto;
+ color: rgba(255, 255, 255, 0.7);
+ text-shadow: none;
+ margin-top: -0.5em;
+ font-weight: bold;
+ text-align: left;
+}
+.ui.right.aligned.progress {
+ -webkit-box-pack: end;
+ -ms-flex-pack: end;
+ justify-content: flex-end;
+}
+.ui.right.aligned.progress .bar > .progress {
+ left: 0.5em;
+ right: auto;
+}
+
+/* Label */
+.ui.progress > .label {
+ position: absolute;
+ width: 100%;
+ font-size: 1em;
+ top: 100%;
+ right: auto;
+ left: 0;
+ bottom: auto;
+ color: rgba(0, 0, 0, 0.87);
+ font-weight: bold;
+ text-shadow: none;
+ margin-top: 0.2em;
+ text-align: center;
+ -webkit-transition: color 0.4s ease;
+ transition: color 0.4s ease;
+}
+
+
+/*******************************
+ Types
+*******************************/
+
+
+/* Indicating */
+.ui.indicating.progress[data-percent^="1"] .bar,
+.ui.indicating.progress[data-percent^="2"] .bar {
+ background-color: #D95C5C;
+}
+.ui.indicating.progress[data-percent^="3"] .bar {
+ background-color: #EFBC72;
+}
+.ui.indicating.progress[data-percent^="4"] .bar,
+.ui.indicating.progress[data-percent^="5"] .bar {
+ background-color: #E6BB48;
+}
+.ui.indicating.progress[data-percent^="6"] .bar {
+ background-color: #DDC928;
+}
+.ui.indicating.progress[data-percent^="7"] .bar,
+.ui.indicating.progress[data-percent^="8"] .bar {
+ background-color: #B4D95C;
+}
+.ui.indicating.progress[data-percent^="9"] .bar,
+.ui.indicating.progress[data-percent^="100"] .bar {
+ background-color: #66DA81;
+}
+
+/* Indicating Label */
+.ui.indicating.progress[data-percent^="1"] .label,
+.ui.indicating.progress[data-percent^="2"] .label {
+ color: rgba(0, 0, 0, 0.87);
+}
+.ui.indicating.progress[data-percent^="3"] .label {
+ color: rgba(0, 0, 0, 0.87);
+}
+.ui.indicating.progress[data-percent^="4"] .label,
+.ui.indicating.progress[data-percent^="5"] .label {
+ color: rgba(0, 0, 0, 0.87);
+}
+.ui.indicating.progress[data-percent^="6"] .label {
+ color: rgba(0, 0, 0, 0.87);
+}
+.ui.indicating.progress[data-percent^="7"] .label,
+.ui.indicating.progress[data-percent^="8"] .label {
+ color: rgba(0, 0, 0, 0.87);
+}
+.ui.indicating.progress[data-percent^="9"] .label,
+.ui.indicating.progress[data-percent^="100"] .label {
+ color: rgba(0, 0, 0, 0.87);
+}
+
+/* Inverted Indicating Label */
+.ui.inverted.indicating.progress[data-percent^="1"] .label,
+.ui.inverted.indicating.progress[data-percent^="2"] .label {
+ color: rgba(255, 255, 255, 0.9);
+}
+.ui.inverted.indicating.progress[data-percent^="3"] .label {
+ color: rgba(255, 255, 255, 0.9);
+}
+.ui.inverted.indicating.progress[data-percent^="4"] .label,
+.ui.inverted.indicating.progress[data-percent^="5"] .label {
+ color: rgba(255, 255, 255, 0.9);
+}
+.ui.inverted.indicating.progress[data-percent^="6"] .label {
+ color: rgba(255, 255, 255, 0.9);
+}
+.ui.inverted.indicating.progress[data-percent^="7"] .label,
+.ui.inverted.indicating.progress[data-percent^="8"] .label {
+ color: rgba(255, 255, 255, 0.9);
+}
+.ui.inverted.indicating.progress[data-percent^="9"] .label,
+.ui.inverted.indicating.progress[data-percent^="100"] .label {
+ color: rgba(255, 255, 255, 0.9);
+}
+
+/* Single Digits */
+.ui.indicating.progress[data-percent="1"] .bar,
+.ui.indicating.progress[data-percent^="1."] .bar,
+.ui.indicating.progress[data-percent="2"] .bar,
+.ui.indicating.progress[data-percent^="2."] .bar,
+.ui.indicating.progress[data-percent="3"] .bar,
+.ui.indicating.progress[data-percent^="3."] .bar,
+.ui.indicating.progress[data-percent="4"] .bar,
+.ui.indicating.progress[data-percent^="4."] .bar,
+.ui.indicating.progress[data-percent="5"] .bar,
+.ui.indicating.progress[data-percent^="5."] .bar,
+.ui.indicating.progress[data-percent="6"] .bar,
+.ui.indicating.progress[data-percent^="6."] .bar,
+.ui.indicating.progress[data-percent="7"] .bar,
+.ui.indicating.progress[data-percent^="7."] .bar,
+.ui.indicating.progress[data-percent="8"] .bar,
+.ui.indicating.progress[data-percent^="8."] .bar,
+.ui.indicating.progress[data-percent="9"] .bar,
+.ui.indicating.progress[data-percent^="9."] .bar {
+ background-color: #D95C5C;
+}
+.ui.indicating.progress[data-percent="0"] .label,
+.ui.indicating.progress[data-percent^="0."] .label,
+.ui.indicating.progress[data-percent="1"] .label,
+.ui.indicating.progress[data-percent^="1."] .label,
+.ui.indicating.progress[data-percent="2"] .label,
+.ui.indicating.progress[data-percent^="2."] .label,
+.ui.indicating.progress[data-percent="3"] .label,
+.ui.indicating.progress[data-percent^="3."] .label,
+.ui.indicating.progress[data-percent="4"] .label,
+.ui.indicating.progress[data-percent^="4."] .label,
+.ui.indicating.progress[data-percent="5"] .label,
+.ui.indicating.progress[data-percent^="5."] .label,
+.ui.indicating.progress[data-percent="6"] .label,
+.ui.indicating.progress[data-percent^="6."] .label,
+.ui.indicating.progress[data-percent="7"] .label,
+.ui.indicating.progress[data-percent^="7."] .label,
+.ui.indicating.progress[data-percent="8"] .label,
+.ui.indicating.progress[data-percent^="8."] .label,
+.ui.indicating.progress[data-percent="9"] .label,
+.ui.indicating.progress[data-percent^="9."] .label {
+ color: rgba(0, 0, 0, 0.87);
+}
+.ui.inverted.indicating.progress[data-percent="0"] .label,
+.ui.inverted.indicating.progress[data-percent^="0."] .label,
+.ui.inverted.indicating.progress[data-percent="1"] .label,
+.ui.inverted.indicating.progress[data-percent^="1."] .label,
+.ui.inverted.indicating.progress[data-percent="2"] .label,
+.ui.inverted.indicating.progress[data-percent^="2."] .label,
+.ui.inverted.indicating.progress[data-percent="3"] .label,
+.ui.inverted.indicating.progress[data-percent^="3."] .label,
+.ui.inverted.indicating.progress[data-percent="4"] .label,
+.ui.inverted.indicating.progress[data-percent^="4."] .label,
+.ui.inverted.indicating.progress[data-percent="5"] .label,
+.ui.inverted.indicating.progress[data-percent^="5."] .label,
+.ui.inverted.indicating.progress[data-percent="6"] .label,
+.ui.inverted.indicating.progress[data-percent^="6."] .label,
+.ui.inverted.indicating.progress[data-percent="7"] .label,
+.ui.inverted.indicating.progress[data-percent^="7."] .label,
+.ui.inverted.indicating.progress[data-percent="8"] .label,
+.ui.inverted.indicating.progress[data-percent^="8."] .label,
+.ui.inverted.indicating.progress[data-percent="9"] .label,
+.ui.inverted.indicating.progress[data-percent^="9."] .label {
+ color: rgba(255, 255, 255, 0.9);
+}
+
+/* Indicating Success */
+.ui.ui.indicating.progress.success .label {
+ color: #1A531B;
+}
+
+
+/*******************************
+ States
+*******************************/
+
+
+/*--------------
+ Success
+ ---------------*/
+
+.ui.ui.progress.success .bar {
+ background-color: #21BA45;
+}
+.ui.ui.progress.success .bar,
+.ui.ui.progress.success .bar::after {
+ -webkit-animation: none;
+ animation: none;
+}
+.ui.progress.success > .label {
+ color: #1A531B;
+}
+
+/*--------------
+ Warning
+ ---------------*/
+
+.ui.ui.progress.warning .bar {
+ background-color: #F2C037;
+}
+.ui.ui.progress.warning .bar,
+.ui.ui.progress.warning .bar::after {
+ -webkit-animation: none;
+ animation: none;
+}
+.ui.progress.warning > .label {
+ color: #794B02;
+}
+
+/*--------------
+ Error
+ ---------------*/
+
+.ui.ui.progress.error .bar {
+ background-color: #DB2828;
+}
+.ui.ui.progress.error .bar,
+.ui.ui.progress.error .bar::after {
+ -webkit-animation: none;
+ animation: none;
+}
+.ui.progress.error > .label {
+ color: #912D2B;
+}
+
+/*--------------
+ Active
+ ---------------*/
+
+.ui.active.progress .bar {
+ position: relative;
+ min-width: 2em;
+}
+.ui.active.progress .bar::after {
+ content: '';
+ opacity: 0;
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: #FFFFFF;
+ border-radius: 0.28571429rem;
+ -webkit-animation: progress-active 2s ease infinite;
+ animation: progress-active 2s ease infinite;
+ -webkit-transform-origin: left;
+ transform-origin: left;
+}
+.ui.active.right.aligned.progress .bar::after {
+ -webkit-transform-origin: right;
+ transform-origin: right;
+}
+@-webkit-keyframes progress-active {
+ 0% {
+ opacity: 0.3;
+ -webkit-transform: scale(0, 1);
+ transform: scale(0, 1);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+}
+@keyframes progress-active {
+ 0% {
+ opacity: 0.3;
+ -webkit-transform: scale(0, 1);
+ transform: scale(0, 1);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+}
+
+/*--------------
+ Disabled
+ ---------------*/
+
+.ui.disabled.progress {
+ opacity: 0.35;
+}
+.ui.ui.disabled.progress .bar,
+.ui.ui.disabled.progress .bar::after {
+ -webkit-animation: none;
+ animation: none;
+}
+
+
+/*******************************
+ Variations
+*******************************/
+
+
+/*--------------
+ Inverted
+ ---------------*/
+
+.ui.inverted.progress {
+ background: rgba(255, 255, 255, 0.08);
+ border: none;
+}
+.ui.inverted.progress .bar {
+ background: #888888;
+}
+.ui.inverted.progress .bar > .progress {
+ color: #1B1C1D;
+}
+.ui.inverted.progress > .label {
+ color: #FFFFFF;
+}
+.ui.inverted.progress.success > .label {
+ color: #21BA45;
+}
+.ui.inverted.progress.warning > .label {
+ color: #F2C037;
+}
+.ui.inverted.progress.error > .label {
+ color: #DB2828;
+}
+
+/*--------------
+ Attached
+ ---------------*/
+
+
+/* bottom attached */
+.ui.progress.attached {
+ background: transparent;
+ position: relative;
+ border: none;
+ margin: 0;
+}
+.ui.progress.attached,
+.ui.progress.attached .bar {
+ height: 0.2rem;
+ padding: 0;
+ overflow: hidden;
+ border-radius: 0 0 0.28571429rem 0.28571429rem;
+}
+.ui.progress.attached .bar {
+ border-radius: 0;
+}
+
+/* top attached */
+.ui.progress.top.attached,
+.ui.progress.top.attached .bar {
+ top: 0;
+ border-radius: 0.28571429rem 0.28571429rem 0 0;
+}
+.ui.progress.top.attached .bar {
+ border-radius: 0;
+}
+
+/* Coupling */
+.ui.segment > .ui.attached.progress,
+.ui.card > .ui.attached.progress {
+ position: absolute;
+ top: auto;
+ left: 0;
+ bottom: 100%;
+ width: 100%;
+}
+.ui.segment > .ui.bottom.attached.progress,
+.ui.card > .ui.bottom.attached.progress {
+ top: 100%;
+ bottom: auto;
+}
+
+/*--------------
+ Colors
+---------------*/
+
+.ui.indeterminate.primary.progress .bar::before,
+.ui.primary.progress .bar,
+.ui.progress .primary.bar {
+ background-color: #2185D0;
+}
+.ui.inverted.indeterminate.primary.progress .bar::before,
+.ui.primary.inverted.progress .bar,
+.ui.inverted.progress .primary.bar {
+ background-color: #54C8FF;
+}
+.ui.indeterminate.secondary.progress .bar::before,
+.ui.secondary.progress .bar,
+.ui.progress .secondary.bar {
+ background-color: #1B1C1D;
+}
+.ui.inverted.indeterminate.secondary.progress .bar::before,
+.ui.secondary.inverted.progress .bar,
+.ui.inverted.progress .secondary.bar {
+ background-color: #545454;
+}
+.ui.indeterminate.red.progress .bar::before,
+.ui.red.progress .bar,
+.ui.progress .red.bar {
+ background-color: #DB2828;
+}
+.ui.inverted.indeterminate.red.progress .bar::before,
+.ui.red.inverted.progress .bar,
+.ui.inverted.progress .red.bar {
+ background-color: #FF695E;
+}
+.ui.indeterminate.orange.progress .bar::before,
+.ui.orange.progress .bar,
+.ui.progress .orange.bar {
+ background-color: #F2711C;
+}
+.ui.inverted.indeterminate.orange.progress .bar::before,
+.ui.orange.inverted.progress .bar,
+.ui.inverted.progress .orange.bar {
+ background-color: #FF851B;
+}
+.ui.indeterminate.yellow.progress .bar::before,
+.ui.yellow.progress .bar,
+.ui.progress .yellow.bar {
+ background-color: #FBBD08;
+}
+.ui.inverted.indeterminate.yellow.progress .bar::before,
+.ui.yellow.inverted.progress .bar,
+.ui.inverted.progress .yellow.bar {
+ background-color: #FFE21F;
+}
+.ui.indeterminate.olive.progress .bar::before,
+.ui.olive.progress .bar,
+.ui.progress .olive.bar {
+ background-color: #B5CC18;
+}
+.ui.inverted.indeterminate.olive.progress .bar::before,
+.ui.olive.inverted.progress .bar,
+.ui.inverted.progress .olive.bar {
+ background-color: #D9E778;
+}
+.ui.indeterminate.green.progress .bar::before,
+.ui.green.progress .bar,
+.ui.progress .green.bar {
+ background-color: #21BA45;
+}
+.ui.inverted.indeterminate.green.progress .bar::before,
+.ui.green.inverted.progress .bar,
+.ui.inverted.progress .green.bar {
+ background-color: #2ECC40;
+}
+.ui.indeterminate.teal.progress .bar::before,
+.ui.teal.progress .bar,
+.ui.progress .teal.bar {
+ background-color: #00B5AD;
+}
+.ui.inverted.indeterminate.teal.progress .bar::before,
+.ui.teal.inverted.progress .bar,
+.ui.inverted.progress .teal.bar {
+ background-color: #6DFFFF;
+}
+.ui.indeterminate.blue.progress .bar::before,
+.ui.blue.progress .bar,
+.ui.progress .blue.bar {
+ background-color: #2185D0;
+}
+.ui.inverted.indeterminate.blue.progress .bar::before,
+.ui.blue.inverted.progress .bar,
+.ui.inverted.progress .blue.bar {
+ background-color: #54C8FF;
+}
+.ui.indeterminate.violet.progress .bar::before,
+.ui.violet.progress .bar,
+.ui.progress .violet.bar {
+ background-color: #6435C9;
+}
+.ui.inverted.indeterminate.violet.progress .bar::before,
+.ui.violet.inverted.progress .bar,
+.ui.inverted.progress .violet.bar {
+ background-color: #A291FB;
+}
+.ui.indeterminate.purple.progress .bar::before,
+.ui.purple.progress .bar,
+.ui.progress .purple.bar {
+ background-color: #A333C8;
+}
+.ui.inverted.indeterminate.purple.progress .bar::before,
+.ui.purple.inverted.progress .bar,
+.ui.inverted.progress .purple.bar {
+ background-color: #DC73FF;
+}
+.ui.indeterminate.pink.progress .bar::before,
+.ui.pink.progress .bar,
+.ui.progress .pink.bar {
+ background-color: #E03997;
+}
+.ui.inverted.indeterminate.pink.progress .bar::before,
+.ui.pink.inverted.progress .bar,
+.ui.inverted.progress .pink.bar {
+ background-color: #FF8EDF;
+}
+.ui.indeterminate.brown.progress .bar::before,
+.ui.brown.progress .bar,
+.ui.progress .brown.bar {
+ background-color: #A5673F;
+}
+.ui.inverted.indeterminate.brown.progress .bar::before,
+.ui.brown.inverted.progress .bar,
+.ui.inverted.progress .brown.bar {
+ background-color: #D67C1C;
+}
+.ui.indeterminate.grey.progress .bar::before,
+.ui.grey.progress .bar,
+.ui.progress .grey.bar {
+ background-color: #767676;
+}
+.ui.inverted.indeterminate.grey.progress .bar::before,
+.ui.grey.inverted.progress .bar,
+.ui.inverted.progress .grey.bar {
+ background-color: #DCDDDE;
+}
+.ui.indeterminate.black.progress .bar::before,
+.ui.black.progress .bar,
+.ui.progress .black.bar {
+ background-color: #1B1C1D;
+}
+.ui.inverted.indeterminate.black.progress .bar::before,
+.ui.black.inverted.progress .bar,
+.ui.inverted.progress .black.bar {
+ background-color: #545454;
+}
+
+/*--------------
+ Sizes
+---------------*/
+
+.ui.progress {
+ font-size: 1rem;
+}
+.ui.progress .bar {
+ height: 1.75em;
+}
+.ui.mini.progress {
+ font-size: 0.78571429rem;
+}
+.ui.mini.progress .bar {
+ height: 0.3em;
+}
+.ui.tiny.progress {
+ font-size: 0.85714286rem;
+}
+.ui.tiny.progress .bar {
+ height: 0.5em;
+}
+.ui.small.progress {
+ font-size: 0.92857143rem;
+}
+.ui.small.progress .bar {
+ height: 1em;
+}
+.ui.large.progress {
+ font-size: 1.14285714rem;
+}
+.ui.large.progress .bar {
+ height: 2.5em;
+}
+.ui.big.progress {
+ font-size: 1.28571429rem;
+}
+.ui.big.progress .bar {
+ height: 3.5em;
+}
+.ui.huge.progress {
+ font-size: 1.42857143rem;
+}
+.ui.huge.progress .bar {
+ height: 4em;
+}
+.ui.massive.progress {
+ font-size: 1.71428571rem;
+}
+.ui.massive.progress .bar {
+ height: 5em;
+}
+
+/*---------------
+ Indeterminate
+ ----------------*/
+
+.ui.indeterminate.progress .bar {
+ width: 100%;
+}
+.ui.indeterminate.progress .bar .progress,
+.ui.progress .bar .centered.progress {
+ text-align: center;
+ position: relative;
+ right: 0;
+}
+.ui.indeterminate.progress .bar::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ border-radius: 0.28571429rem;
+ -webkit-animation: progress-pulsating 2s ease infinite;
+ animation: progress-pulsating 2s ease infinite;
+ -webkit-transform-origin: center;
+ transform-origin: center;
+ width: 100%;
+}
+.ui.slow.indeterminate.progress .bar::before {
+ -webkit-animation-duration: 4s;
+ animation-duration: 4s;
+}
+.ui.fast.indeterminate.progress .bar::before {
+ -webkit-animation-duration: 1s;
+ animation-duration: 1s;
+}
+.ui.swinging.indeterminate.progress .bar::before {
+ -webkit-transform-origin: left;
+ transform-origin: left;
+ -webkit-animation-name: progress-swinging;
+ animation-name: progress-swinging;
+}
+.ui.sliding.indeterminate.progress .bar::before {
+ -webkit-transform-origin: left;
+ transform-origin: left;
+ -webkit-animation-name: progress-sliding;
+ animation-name: progress-sliding;
+}
+.ui.filling.indeterminate.progress .bar::before {
+ -webkit-animation-name: progress-filling;
+ animation-name: progress-filling;
+}
+.ui.indeterminate.progress:not(.sliding):not(.filling):not(.swinging) .bar::before {
+ background: #FFFFFF;
+}
+.ui.sliding.indeterminate.progress .bar,
+.ui.swinging.indeterminate.progress .bar,
+.ui.filling.indeterminate.progress .bar {
+ background: rgba(0, 0, 0, 0.1);
+}
+.ui.sliding.indeterminate.progress .bar .progress,
+.ui.swinging.indeterminate.progress .bar .progress {
+ color: #1B1C1D;
+}
+.ui.inverted.sliding.indeterminate.progress .bar,
+.ui.inverted.swinging.indeterminate.progress .bar,
+.ui.inverted.filling.indeterminate.progress .bar {
+ background: rgba(255, 255, 255, 0.08);
+}
+.ui.inverted.sliding.indeterminate.progress .bar .progress,
+.ui.inverted.swinging.indeterminate.progress .bar .progress {
+ color: rgba(255, 255, 255, 0.7);
+}
+@-webkit-keyframes progress-swinging {
+ 0%,
+ 100% {
+ width: 10%;
+ left: -25%;
+ }
+ 25%,
+ 65% {
+ width: 70%;
+ }
+ 50% {
+ width: 10%;
+ left: 100%;
+ }
+}
+@keyframes progress-swinging {
+ 0%,
+ 100% {
+ width: 10%;
+ left: -25%;
+ }
+ 25%,
+ 65% {
+ width: 70%;
+ }
+ 50% {
+ width: 10%;
+ left: 100%;
+ }
+}
+@-webkit-keyframes progress-sliding {
+ 0% {
+ width: 10%;
+ left: -25%;
+ }
+ 50% {
+ width: 70%;
+ }
+ 100% {
+ width: 10%;
+ left: 100%;
+ }
+}
+@keyframes progress-sliding {
+ 0% {
+ width: 10%;
+ left: -25%;
+ }
+ 50% {
+ width: 70%;
+ }
+ 100% {
+ width: 10%;
+ left: 100%;
+ }
+}
+@-webkit-keyframes progress-filling {
+ 0% {
+ -webkit-transform: scale(0, 1);
+ transform: scale(0, 1);
+ }
+ 80% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ opacity: 1;
+ }
+ 100% {
+ opacity: 0;
+ }
+}
+@keyframes progress-filling {
+ 0% {
+ -webkit-transform: scale(0, 1);
+ transform: scale(0, 1);
+ }
+ 80% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ opacity: 1;
+ }
+ 100% {
+ opacity: 0;
+ }
+}
+@-webkit-keyframes progress-pulsating {
+ 0% {
+ -webkit-transform: scale(0, 1);
+ transform: scale(0, 1);
+ opacity: 0.7;
+ }
+ 100% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ opacity: 0;
+ }
+}
+@keyframes progress-pulsating {
+ 0% {
+ -webkit-transform: scale(0, 1);
+ transform: scale(0, 1);
+ opacity: 0.7;
+ }
+ 100% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ opacity: 0;
+ }
+}
+
+
+/*******************************
+ Progress
+*******************************/
+
+
+
+/*******************************
+ Site Overrides
+*******************************/
+
diff --git a/public/dist/components/progress.js b/public/dist/components/progress.js
new file mode 100644
index 000000000..49d80696f
--- /dev/null
+++ b/public/dist/components/progress.js
@@ -0,0 +1,1033 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Progress
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+'use strict';
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.progress = function(parameters) {
+ var
+ $allModules = $(this),
+
+ moduleSelector = $allModules.selector || '',
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+
+ returnedValue
+ ;
+
+ $allModules
+ .each(function() {
+ var
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.fn.progress.settings, parameters)
+ : $.extend({}, $.fn.progress.settings),
+
+ className = settings.className,
+ metadata = settings.metadata,
+ namespace = settings.namespace,
+ selector = settings.selector,
+ error = settings.error,
+
+ eventNamespace = '.' + namespace,
+ moduleNamespace = 'module-' + namespace,
+
+ $module = $(this),
+ $bars = $(this).find(selector.bar),
+ $progresses = $(this).find(selector.progress),
+ $label = $(this).find(selector.label),
+
+ element = this,
+ instance = $module.data(moduleNamespace),
+
+ animating = false,
+ transitionEnd,
+ module
+ ;
+ module = {
+ helper: {
+ sum: function (nums) {
+ return Array.isArray(nums) ? nums.reduce(function (left, right) {
+ return left + Number(right);
+ }, 0) : 0;
+ },
+ /**
+ * Derive precision for multiple progress with total and values.
+ *
+ * This helper dervices a precision that is sufficiently large to show minimum value of multiple progress.
+ *
+ * Example1
+ * - total: 1122
+ * - values: [325, 111, 74, 612]
+ * - min ratio: 74/1122 = 0.0659...
+ * - required precision: 100
+ *
+ * Example2
+ * - total: 10541
+ * - values: [3235, 1111, 74, 6121]
+ * - min ratio: 74/10541 = 0.0070...
+ * - required precision: 1000
+ *
+ * @param min A minimum value within multiple values
+ * @param total A total amount of multiple values
+ * @returns {number} A precison. Could be 1, 10, 100, ... 1e+10.
+ */
+ derivePrecision: function(min, total) {
+ var precisionPower = 0
+ var precision = 1;
+ var ratio = min / total;
+ while (precisionPower < 10) {
+ ratio = ratio * precision;
+ if (ratio > 1) {
+ break;
+ }
+ precision = Math.pow(10, precisionPower++);
+ }
+ return precision;
+ },
+ forceArray: function (element) {
+ return Array.isArray(element)
+ ? element
+ : !isNaN(element)
+ ? [element]
+ : typeof element == 'string'
+ ? element.split(',')
+ : []
+ ;
+ }
+ },
+
+ initialize: function() {
+ module.set.duration();
+ module.set.transitionEvent();
+ module.debug(element);
+
+ module.read.metadata();
+ module.read.settings();
+
+ module.instantiate();
+ },
+
+ instantiate: function() {
+ module.verbose('Storing instance of progress', module);
+ instance = module;
+ $module
+ .data(moduleNamespace, module)
+ ;
+ },
+ destroy: function() {
+ module.verbose('Destroying previous progress for', $module);
+ clearInterval(instance.interval);
+ module.remove.state();
+ $module.removeData(moduleNamespace);
+ instance = undefined;
+ },
+
+ reset: function() {
+ module.remove.nextValue();
+ module.update.progress(0);
+ },
+
+ complete: function(keepState) {
+ if(module.percent === undefined || module.percent < 100) {
+ module.remove.progressPoll();
+ if(keepState !== true){
+ module.set.percent(100);
+ }
+ }
+ },
+
+ read: {
+ metadata: function() {
+ var
+ data = {
+ percent : module.helper.forceArray($module.data(metadata.percent)),
+ total : $module.data(metadata.total),
+ value : module.helper.forceArray($module.data(metadata.value))
+ }
+ ;
+ if(data.total !== undefined) {
+ module.debug('Total value set from metadata', data.total);
+ module.set.total(data.total);
+ }
+ if(data.value.length > 0) {
+ module.debug('Current value set from metadata', data.value);
+ module.set.value(data.value);
+ module.set.progress(data.value);
+ }
+ if(data.percent.length > 0) {
+ module.debug('Current percent value set from metadata', data.percent);
+ module.set.percent(data.percent);
+ }
+ },
+ settings: function() {
+ if(settings.total !== false) {
+ module.debug('Current total set in settings', settings.total);
+ module.set.total(settings.total);
+ }
+ if(settings.value !== false) {
+ module.debug('Current value set in settings', settings.value);
+ module.set.value(settings.value);
+ module.set.progress(module.value);
+ }
+ if(settings.percent !== false) {
+ module.debug('Current percent set in settings', settings.percent);
+ module.set.percent(settings.percent);
+ }
+ }
+ },
+
+ bind: {
+ transitionEnd: function(callback) {
+ var
+ transitionEnd = module.get.transitionEnd()
+ ;
+ $bars
+ .one(transitionEnd + eventNamespace, function(event) {
+ clearTimeout(module.failSafeTimer);
+ callback.call(this, event);
+ })
+ ;
+ module.failSafeTimer = setTimeout(function() {
+ $bars.triggerHandler(transitionEnd);
+ }, settings.duration + settings.failSafeDelay);
+ module.verbose('Adding fail safe timer', module.timer);
+ }
+ },
+
+ increment: function(incrementValue) {
+ var
+ startValue,
+ newValue
+ ;
+ if( module.has.total() ) {
+ startValue = module.get.value();
+ incrementValue = incrementValue || 1;
+ }
+ else {
+ startValue = module.get.percent();
+ incrementValue = incrementValue || module.get.randomValue();
+ }
+ newValue = startValue + incrementValue;
+ module.debug('Incrementing percentage by', startValue, newValue, incrementValue);
+ newValue = module.get.normalizedValue(newValue);
+ module.set.progress(newValue);
+ },
+ decrement: function(decrementValue) {
+ var
+ total = module.get.total(),
+ startValue,
+ newValue
+ ;
+ if(total) {
+ startValue = module.get.value();
+ decrementValue = decrementValue || 1;
+ newValue = startValue - decrementValue;
+ module.debug('Decrementing value by', decrementValue, startValue);
+ }
+ else {
+ startValue = module.get.percent();
+ decrementValue = decrementValue || module.get.randomValue();
+ newValue = startValue - decrementValue;
+ module.debug('Decrementing percentage by', decrementValue, startValue);
+ }
+ newValue = module.get.normalizedValue(newValue);
+ module.set.progress(newValue);
+ },
+
+ has: {
+ progressPoll: function() {
+ return module.progressPoll;
+ },
+ total: function() {
+ return (module.get.total() !== false);
+ }
+ },
+
+ get: {
+ text: function(templateText, index) {
+ var
+ index_ = index || 0,
+ value = module.get.value(index_),
+ total = module.get.total(),
+ percent = (animating)
+ ? module.get.displayPercent(index_)
+ : module.get.percent(index_),
+ left = (total !== false)
+ ? Math.max(0,total - value)
+ : (100 - percent)
+ ;
+ templateText = templateText || '';
+ templateText = templateText
+ .replace('{value}', value)
+ .replace('{total}', total || 0)
+ .replace('{left}', left)
+ .replace('{percent}', percent)
+ .replace('{bar}', settings.text.bars[index_] || '')
+ ;
+ module.verbose('Adding variables to progress bar text', templateText);
+ return templateText;
+ },
+
+ normalizedValue: function(value) {
+ if(value < 0) {
+ module.debug('Value cannot decrement below 0');
+ return 0;
+ }
+ if(module.has.total()) {
+ if(value > module.total) {
+ module.debug('Value cannot increment above total', module.total);
+ return module.total;
+ }
+ }
+ else if(value > 100 ) {
+ module.debug('Value cannot increment above 100 percent');
+ return 100;
+ }
+ return value;
+ },
+
+ updateInterval: function() {
+ if(settings.updateInterval == 'auto') {
+ return settings.duration;
+ }
+ return settings.updateInterval;
+ },
+
+ randomValue: function() {
+ module.debug('Generating random increment percentage');
+ return Math.floor((Math.random() * settings.random.max) + settings.random.min);
+ },
+
+ numericValue: function(value) {
+ return (typeof value === 'string')
+ ? (value.replace(/[^\d.]/g, '') !== '')
+ ? +(value.replace(/[^\d.]/g, ''))
+ : false
+ : value
+ ;
+ },
+
+ transitionEnd: function() {
+ var
+ element = document.createElement('element'),
+ transitions = {
+ 'transition' :'transitionend',
+ 'OTransition' :'oTransitionEnd',
+ 'MozTransition' :'transitionend',
+ 'WebkitTransition' :'webkitTransitionEnd'
+ },
+ transition
+ ;
+ for(transition in transitions){
+ if( element.style[transition] !== undefined ){
+ return transitions[transition];
+ }
+ }
+ },
+
+ // gets current displayed percentage (if animating values this is the intermediary value)
+ displayPercent: function(index) {
+ var
+ $bar = $($bars[index]),
+ barWidth = $bar.width(),
+ totalWidth = $module.width(),
+ minDisplay = parseInt($bar.css('min-width'), 10),
+ displayPercent = (barWidth > minDisplay)
+ ? (barWidth / totalWidth * 100)
+ : module.percent
+ ;
+ return (settings.precision > 0)
+ ? Math.round(displayPercent * (10 * settings.precision)) / (10 * settings.precision)
+ : Math.round(displayPercent)
+ ;
+ },
+
+ percent: function(index) {
+ return module.percent && module.percent[index || 0] || 0;
+ },
+ value: function(index) {
+ return module.nextValue || module.value && module.value[index || 0] || 0;
+ },
+ total: function() {
+ return module.total !== undefined ? module.total : false;
+ }
+ },
+
+ create: {
+ progressPoll: function() {
+ module.progressPoll = setTimeout(function() {
+ module.update.toNextValue();
+ module.remove.progressPoll();
+ }, module.get.updateInterval());
+ },
+ },
+
+ is: {
+ complete: function() {
+ return module.is.success() || module.is.warning() || module.is.error();
+ },
+ success: function() {
+ return $module.hasClass(className.success);
+ },
+ warning: function() {
+ return $module.hasClass(className.warning);
+ },
+ error: function() {
+ return $module.hasClass(className.error);
+ },
+ active: function() {
+ return $module.hasClass(className.active);
+ },
+ visible: function() {
+ return $module.is(':visible');
+ }
+ },
+
+ remove: {
+ progressPoll: function() {
+ module.verbose('Removing progress poll timer');
+ if(module.progressPoll) {
+ clearTimeout(module.progressPoll);
+ delete module.progressPoll;
+ }
+ },
+ nextValue: function() {
+ module.verbose('Removing progress value stored for next update');
+ delete module.nextValue;
+ },
+ state: function() {
+ module.verbose('Removing stored state');
+ delete module.total;
+ delete module.percent;
+ delete module.value;
+ },
+ active: function() {
+ module.verbose('Removing active state');
+ $module.removeClass(className.active);
+ },
+ success: function() {
+ module.verbose('Removing success state');
+ $module.removeClass(className.success);
+ },
+ warning: function() {
+ module.verbose('Removing warning state');
+ $module.removeClass(className.warning);
+ },
+ error: function() {
+ module.verbose('Removing error state');
+ $module.removeClass(className.error);
+ }
+ },
+
+ set: {
+ barWidth: function(values) {
+ module.debug("set bar width with ", values);
+ values = module.helper.forceArray(values);
+ var firstNonZeroIndex = -1;
+ var lastNonZeroIndex = -1;
+ var valuesSum = module.helper.sum(values);
+ var barCounts = $bars.length;
+ var isMultiple = barCounts > 1;
+ var percents = values.map(function(value, index) {
+ var allZero = (index === barCounts - 1 && valuesSum === 0);
+ var $bar = $($bars[index]);
+ if (value === 0 && isMultiple && !allZero) {
+ $bar.css('display', 'none');
+ } else {
+ if (isMultiple && allZero) {
+ $bar.css('background', 'transparent');
+ }
+ if (firstNonZeroIndex == -1) {
+ firstNonZeroIndex = index;
+ }
+ lastNonZeroIndex = index;
+ $bar.css({
+ display: 'block',
+ width: value + '%'
+ });
+ }
+ return parseFloat(value);
+ });
+ values.forEach(function(_, index) {
+ var $bar = $($bars[index]);
+ $bar.css({
+ borderTopLeftRadius: index == firstNonZeroIndex ? '' : 0,
+ borderBottomLeftRadius: index == firstNonZeroIndex ? '' : 0,
+ borderTopRightRadius: index == lastNonZeroIndex ? '' : 0,
+ borderBottomRightRadius: index == lastNonZeroIndex ? '' : 0
+ });
+ });
+ $module
+ .attr('data-percent', percents)
+ ;
+ },
+ duration: function(duration) {
+ duration = duration || settings.duration;
+ duration = (typeof duration == 'number')
+ ? duration + 'ms'
+ : duration
+ ;
+ module.verbose('Setting progress bar transition duration', duration);
+ $bars
+ .css({
+ 'transition-duration': duration
+ })
+ ;
+ },
+ percent: function(percents) {
+ percents = module.helper.forceArray(percents).map(function(percent) {
+ percent = (typeof percent == 'string')
+ ? +(percent.replace('%', ''))
+ : percent
+ ;
+ return (settings.limitValues)
+ ? Math.max(0, Math.min(100, percent))
+ : percent
+ ;
+ });
+ var hasTotal = module.has.total();
+ var totalPercent = module.helper.sum(percents);
+ var isMultipleValues = percents.length > 1 && hasTotal;
+ var sumTotal = module.helper.sum(module.helper.forceArray(module.value));
+ if (isMultipleValues && sumTotal > module.total) {
+ // Sum values instead of pecents to avoid precision issues when summing floats
+ module.error(error.sumExceedsTotal, sumTotal, module.total);
+ } else if (!isMultipleValues && totalPercent > 100) {
+ // Sum before rounding since sum of rounded may have error though sum of actual is fine
+ module.error(error.tooHigh, totalPercent);
+ } else if (totalPercent < 0) {
+ module.error(error.tooLow, totalPercent);
+ } else {
+ var autoPrecision = settings.precision > 0
+ ? settings.precision
+ : isMultipleValues
+ ? module.helper.derivePrecision(Math.min.apply(null, module.value), module.total)
+ : 0;
+
+ // round display percentage
+ var roundedPercents = percents.map(function (percent) {
+ return (autoPrecision > 0)
+ ? Math.round(percent * (10 * autoPrecision)) / (10 * autoPrecision)
+ : Math.round(percent)
+ ;
+ });
+ module.percent = roundedPercents;
+ if (hasTotal) {
+ module.value = percents.map(function (percent) {
+ return (autoPrecision > 0)
+ ? Math.round((percent / 100) * module.total * (10 * autoPrecision)) / (10 * autoPrecision)
+ : Math.round((percent / 100) * module.total * 10) / 10
+ ;
+ });
+ }
+ module.set.barWidth(percents);
+ module.set.labelInterval();
+ }
+ settings.onChange.call(element, percents, module.value, module.total);
+ },
+ labelInterval: function() {
+ var
+ animationCallback = function() {
+ module.verbose('Bar finished animating, removing continuous label updates');
+ clearInterval(module.interval);
+ animating = false;
+ module.set.labels();
+ }
+ ;
+ clearInterval(module.interval);
+ module.bind.transitionEnd(animationCallback);
+ animating = true;
+ module.interval = setInterval(function() {
+ var
+ isInDOM = $.contains(document.documentElement, element)
+ ;
+ if(!isInDOM) {
+ clearInterval(module.interval);
+ animating = false;
+ }
+ module.set.labels();
+ }, settings.framerate);
+ },
+ labels: function() {
+ module.verbose('Setting both bar progress and outer label text');
+ module.set.barLabel();
+ module.set.state();
+ },
+ label: function(text) {
+ text = text || '';
+ if(text) {
+ text = module.get.text(text);
+ module.verbose('Setting label to text', text);
+ $label.text(text);
+ }
+ },
+ state: function(percent) {
+ percent = (percent !== undefined)
+ ? percent
+ : module.helper.sum(module.percent)
+ ;
+ if(percent === 100) {
+ if(settings.autoSuccess && $bars.length === 1 && !(module.is.warning() || module.is.error() || module.is.success())) {
+ module.set.success();
+ module.debug('Automatically triggering success at 100%');
+ }
+ else {
+ module.verbose('Reached 100% removing active state');
+ module.remove.active();
+ module.remove.progressPoll();
+ }
+ }
+ else if(percent > 0) {
+ module.verbose('Adjusting active progress bar label', percent);
+ module.set.active();
+ }
+ else {
+ module.remove.active();
+ module.set.label(settings.text.active);
+ }
+ },
+ barLabel: function(text) {
+ $progresses.map(function(index, element){
+ var $progress = $(element);
+ if (text !== undefined) {
+ $progress.text( module.get.text(text, index) );
+ }
+ else if (settings.label == 'ratio' && module.has.total()) {
+ module.verbose('Adding ratio to bar label');
+ $progress.text( module.get.text(settings.text.ratio, index) );
+ }
+ else if (settings.label == 'percent') {
+ module.verbose('Adding percentage to bar label');
+ $progress.text( module.get.text(settings.text.percent, index) );
+ }
+ });
+ },
+ active: function(text) {
+ text = text || settings.text.active;
+ module.debug('Setting active state');
+ if(settings.showActivity && !module.is.active() ) {
+ $module.addClass(className.active);
+ }
+ module.remove.warning();
+ module.remove.error();
+ module.remove.success();
+ text = settings.onLabelUpdate('active', text, module.value, module.total);
+ if(text) {
+ module.set.label(text);
+ }
+ module.bind.transitionEnd(function() {
+ settings.onActive.call(element, module.value, module.total);
+ });
+ },
+ success : function(text, keepState) {
+ text = text || settings.text.success || settings.text.active;
+ module.debug('Setting success state');
+ $module.addClass(className.success);
+ module.remove.active();
+ module.remove.warning();
+ module.remove.error();
+ module.complete(keepState);
+ if(settings.text.success) {
+ text = settings.onLabelUpdate('success', text, module.value, module.total);
+ module.set.label(text);
+ }
+ else {
+ text = settings.onLabelUpdate('active', text, module.value, module.total);
+ module.set.label(text);
+ }
+ module.bind.transitionEnd(function() {
+ settings.onSuccess.call(element, module.total);
+ });
+ },
+ warning : function(text, keepState) {
+ text = text || settings.text.warning;
+ module.debug('Setting warning state');
+ $module.addClass(className.warning);
+ module.remove.active();
+ module.remove.success();
+ module.remove.error();
+ module.complete(keepState);
+ text = settings.onLabelUpdate('warning', text, module.value, module.total);
+ if(text) {
+ module.set.label(text);
+ }
+ module.bind.transitionEnd(function() {
+ settings.onWarning.call(element, module.value, module.total);
+ });
+ },
+ error : function(text, keepState) {
+ text = text || settings.text.error;
+ module.debug('Setting error state');
+ $module.addClass(className.error);
+ module.remove.active();
+ module.remove.success();
+ module.remove.warning();
+ module.complete(keepState);
+ text = settings.onLabelUpdate('error', text, module.value, module.total);
+ if(text) {
+ module.set.label(text);
+ }
+ module.bind.transitionEnd(function() {
+ settings.onError.call(element, module.value, module.total);
+ });
+ },
+ transitionEvent: function() {
+ transitionEnd = module.get.transitionEnd();
+ },
+ total: function(totalValue) {
+ module.total = totalValue;
+ },
+ value: function(value) {
+ module.value = module.helper.forceArray(value);
+ },
+ progress: function(value) {
+ if(!module.has.progressPoll()) {
+ module.debug('First update in progress update interval, immediately updating', value);
+ module.update.progress(value);
+ module.create.progressPoll();
+ }
+ else {
+ module.debug('Updated within interval, setting next update to use new value', value);
+ module.set.nextValue(value);
+ }
+ },
+ nextValue: function(value) {
+ module.nextValue = value;
+ }
+ },
+
+ update: {
+ toNextValue: function() {
+ var
+ nextValue = module.nextValue
+ ;
+ if(nextValue) {
+ module.debug('Update interval complete using last updated value', nextValue);
+ module.update.progress(nextValue);
+ module.remove.nextValue();
+ }
+ },
+ progress: function(values) {
+ var hasTotal = module.has.total();
+ if (hasTotal) {
+ module.set.value(values);
+ }
+ var percentCompletes = module.helper.forceArray(values).map(function(value) {
+ var
+ percentComplete
+ ;
+ value = module.get.numericValue(value);
+ if (value === false) {
+ module.error(error.nonNumeric, value);
+ }
+ value = module.get.normalizedValue(value);
+ if (hasTotal) {
+ percentComplete = module.total > 0 ? (value / module.total) * 100 : 100;
+ module.debug('Calculating percent complete from total', percentComplete);
+ }
+ else {
+ percentComplete = value;
+ module.debug('Setting value to exact percentage value', percentComplete);
+ }
+ return percentComplete;
+ });
+ module.set.percent( percentCompletes );
+ }
+ },
+
+ setting: function(name, value) {
+ module.debug('Changing setting', name, value);
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ if($.isPlainObject(settings[name])) {
+ $.extend(true, settings[name], value);
+ }
+ else {
+ settings[name] = value;
+ }
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ module.error(error.method, query);
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ }
+ })
+ ;
+
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.fn.progress.settings = {
+
+ name : 'Progress',
+ namespace : 'progress',
+
+ silent : false,
+ debug : false,
+ verbose : false,
+ performance : true,
+
+ random : {
+ min : 2,
+ max : 5
+ },
+
+ duration : 300,
+
+ updateInterval : 'auto',
+
+ autoSuccess : true,
+ showActivity : true,
+ limitValues : true,
+
+ label : 'percent',
+ precision : 0,
+ framerate : (1000 / 30), /// 30 fps
+
+ percent : false,
+ total : false,
+ value : false,
+
+ // delay in ms for fail safe animation callback
+ failSafeDelay : 100,
+
+ onLabelUpdate : function(state, text, value, total){
+ return text;
+ },
+ onChange : function(percent, value, total){},
+ onSuccess : function(total){},
+ onActive : function(value, total){},
+ onError : function(value, total){},
+ onWarning : function(value, total){},
+
+ error : {
+ method : 'The method you called is not defined.',
+ nonNumeric : 'Progress value is non numeric',
+ tooHigh : 'Value specified is above 100%',
+ tooLow : 'Value specified is below 0%',
+ sumExceedsTotal : 'Sum of multple values exceed total',
+ },
+
+ regExp: {
+ variable: /\{\$*[A-z0-9]+\}/g
+ },
+
+ metadata: {
+ percent : 'percent',
+ total : 'total',
+ value : 'value'
+ },
+
+ selector : {
+ bar : '> .bar',
+ label : '> .label',
+ progress : '.bar > .progress'
+ },
+
+ text : {
+ active : false,
+ error : false,
+ success : false,
+ warning : false,
+ percent : '{percent}%',
+ ratio : '{value} of {total}',
+ bars : ['']
+ },
+
+ className : {
+ active : 'active',
+ error : 'error',
+ success : 'success',
+ warning : 'warning'
+ }
+
+};
+
+
+})( jQuery, window, document );
diff --git a/public/dist/components/progress.min.css b/public/dist/components/progress.min.css
new file mode 100644
index 000000000..e69cfecf3
--- /dev/null
+++ b/public/dist/components/progress.min.css
@@ -0,0 +1,9 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Progress Bar
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */.ui.progress{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;max-width:100%;border:none;margin:1em 0 2.5em;-webkit-box-shadow:none;box-shadow:none;background:rgba(0,0,0,.1);padding:0;border-radius:.28571429rem}.ui.progress:first-child{margin:0 0 2.5em}.ui.progress:last-child{margin:0 0 1.5em}.ui.progress .bar{display:block;line-height:1;position:relative;width:0;min-width:2em;background:#888;border-radius:.28571429rem;-webkit-transition:width .1s ease,background-color .1s ease;transition:width .1s ease,background-color .1s ease;overflow:hidden}.ui.ui.ui.progress:not([data-percent]):not(.indeterminate) .bar,.ui.ui.ui.progress[data-percent="0"]:not(.indeterminate) .bar{background:0 0}.ui.progress[data-percent="0"] .bar .progress{color:rgba(0,0,0,.87)}.ui.inverted.progress[data-percent="0"] .bar .progress{color:rgba(255,255,255,.9)}.ui.progress .bar>.progress{white-space:nowrap;position:absolute;width:auto;font-size:.92857143em;top:50%;right:.5em;left:auto;bottom:auto;color:rgba(255,255,255,.7);text-shadow:none;margin-top:-.5em;font-weight:700;text-align:left}.ui.right.aligned.progress{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.ui.right.aligned.progress .bar>.progress{left:.5em;right:auto}.ui.progress>.label{position:absolute;width:100%;font-size:1em;top:100%;right:auto;left:0;bottom:auto;color:rgba(0,0,0,.87);font-weight:700;text-shadow:none;margin-top:.2em;text-align:center;-webkit-transition:color .4s ease;transition:color .4s ease}.ui.indicating.progress[data-percent^="1"] .bar,.ui.indicating.progress[data-percent^="2"] .bar{background-color:#d95c5c}.ui.indicating.progress[data-percent^="3"] .bar{background-color:#efbc72}.ui.indicating.progress[data-percent^="4"] .bar,.ui.indicating.progress[data-percent^="5"] .bar{background-color:#e6bb48}.ui.indicating.progress[data-percent^="6"] .bar{background-color:#ddc928}.ui.indicating.progress[data-percent^="7"] .bar,.ui.indicating.progress[data-percent^="8"] .bar{background-color:#b4d95c}.ui.indicating.progress[data-percent^="100"] .bar,.ui.indicating.progress[data-percent^="9"] .bar{background-color:#66da81}.ui.indicating.progress[data-percent^="1"] .label,.ui.indicating.progress[data-percent^="2"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress[data-percent^="3"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress[data-percent^="4"] .label,.ui.indicating.progress[data-percent^="5"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress[data-percent^="6"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress[data-percent^="7"] .label,.ui.indicating.progress[data-percent^="8"] .label{color:rgba(0,0,0,.87)}.ui.indicating.progress[data-percent^="100"] .label,.ui.indicating.progress[data-percent^="9"] .label{color:rgba(0,0,0,.87)}.ui.inverted.indicating.progress[data-percent^="1"] .label,.ui.inverted.indicating.progress[data-percent^="2"] .label{color:rgba(255,255,255,.9)}.ui.inverted.indicating.progress[data-percent^="3"] .label{color:rgba(255,255,255,.9)}.ui.inverted.indicating.progress[data-percent^="4"] .label,.ui.inverted.indicating.progress[data-percent^="5"] .label{color:rgba(255,255,255,.9)}.ui.inverted.indicating.progress[data-percent^="6"] .label{color:rgba(255,255,255,.9)}.ui.inverted.indicating.progress[data-percent^="7"] .label,.ui.inverted.indicating.progress[data-percent^="8"] .label{color:rgba(255,255,255,.9)}.ui.inverted.indicating.progress[data-percent^="100"] .label,.ui.inverted.indicating.progress[data-percent^="9"] .label{color:rgba(255,255,255,.9)}.ui.indicating.progress[data-percent="1"] .bar,.ui.indicating.progress[data-percent="2"] .bar,.ui.indicating.progress[data-percent="3"] .bar,.ui.indicating.progress[data-percent="4"] .bar,.ui.indicating.progress[data-percent="5"] .bar,.ui.indicating.progress[data-percent="6"] .bar,.ui.indicating.progress[data-percent="7"] .bar,.ui.indicating.progress[data-percent="8"] .bar,.ui.indicating.progress[data-percent="9"] .bar,.ui.indicating.progress[data-percent^="1."] .bar,.ui.indicating.progress[data-percent^="2."] .bar,.ui.indicating.progress[data-percent^="3."] .bar,.ui.indicating.progress[data-percent^="4."] .bar,.ui.indicating.progress[data-percent^="5."] .bar,.ui.indicating.progress[data-percent^="6."] .bar,.ui.indicating.progress[data-percent^="7."] .bar,.ui.indicating.progress[data-percent^="8."] .bar,.ui.indicating.progress[data-percent^="9."] .bar{background-color:#d95c5c}.ui.indicating.progress[data-percent="0"] .label,.ui.indicating.progress[data-percent="1"] .label,.ui.indicating.progress[data-percent="2"] .label,.ui.indicating.progress[data-percent="3"] .label,.ui.indicating.progress[data-percent="4"] .label,.ui.indicating.progress[data-percent="5"] .label,.ui.indicating.progress[data-percent="6"] .label,.ui.indicating.progress[data-percent="7"] .label,.ui.indicating.progress[data-percent="8"] .label,.ui.indicating.progress[data-percent="9"] .label,.ui.indicating.progress[data-percent^="0."] .label,.ui.indicating.progress[data-percent^="1."] .label,.ui.indicating.progress[data-percent^="2."] .label,.ui.indicating.progress[data-percent^="3."] .label,.ui.indicating.progress[data-percent^="4."] .label,.ui.indicating.progress[data-percent^="5."] .label,.ui.indicating.progress[data-percent^="6."] .label,.ui.indicating.progress[data-percent^="7."] .label,.ui.indicating.progress[data-percent^="8."] .label,.ui.indicating.progress[data-percent^="9."] .label{color:rgba(0,0,0,.87)}.ui.inverted.indicating.progress[data-percent="0"] .label,.ui.inverted.indicating.progress[data-percent="1"] .label,.ui.inverted.indicating.progress[data-percent="2"] .label,.ui.inverted.indicating.progress[data-percent="3"] .label,.ui.inverted.indicating.progress[data-percent="4"] .label,.ui.inverted.indicating.progress[data-percent="5"] .label,.ui.inverted.indicating.progress[data-percent="6"] .label,.ui.inverted.indicating.progress[data-percent="7"] .label,.ui.inverted.indicating.progress[data-percent="8"] .label,.ui.inverted.indicating.progress[data-percent="9"] .label,.ui.inverted.indicating.progress[data-percent^="0."] .label,.ui.inverted.indicating.progress[data-percent^="1."] .label,.ui.inverted.indicating.progress[data-percent^="2."] .label,.ui.inverted.indicating.progress[data-percent^="3."] .label,.ui.inverted.indicating.progress[data-percent^="4."] .label,.ui.inverted.indicating.progress[data-percent^="5."] .label,.ui.inverted.indicating.progress[data-percent^="6."] .label,.ui.inverted.indicating.progress[data-percent^="7."] .label,.ui.inverted.indicating.progress[data-percent^="8."] .label,.ui.inverted.indicating.progress[data-percent^="9."] .label{color:rgba(255,255,255,.9)}.ui.ui.indicating.progress.success .label{color:#1a531b}.ui.ui.progress.success .bar{background-color:#21ba45}.ui.ui.progress.success .bar,.ui.ui.progress.success .bar::after{-webkit-animation:none;animation:none}.ui.progress.success>.label{color:#1a531b}.ui.ui.progress.warning .bar{background-color:#f2c037}.ui.ui.progress.warning .bar,.ui.ui.progress.warning .bar::after{-webkit-animation:none;animation:none}.ui.progress.warning>.label{color:#794b02}.ui.ui.progress.error .bar{background-color:#db2828}.ui.ui.progress.error .bar,.ui.ui.progress.error .bar::after{-webkit-animation:none;animation:none}.ui.progress.error>.label{color:#912d2b}.ui.active.progress .bar{position:relative;min-width:2em}.ui.active.progress .bar::after{content:'';opacity:0;position:absolute;top:0;left:0;right:0;bottom:0;background:#fff;border-radius:.28571429rem;-webkit-animation:progress-active 2s ease infinite;animation:progress-active 2s ease infinite;-webkit-transform-origin:left;transform-origin:left}.ui.active.right.aligned.progress .bar::after{-webkit-transform-origin:right;transform-origin:right}@-webkit-keyframes progress-active{0%{opacity:.3;-webkit-transform:scale(0,1);transform:scale(0,1)}100%{opacity:0;-webkit-transform:scale(1);transform:scale(1)}}@keyframes progress-active{0%{opacity:.3;-webkit-transform:scale(0,1);transform:scale(0,1)}100%{opacity:0;-webkit-transform:scale(1);transform:scale(1)}}.ui.disabled.progress{opacity:.35}.ui.ui.disabled.progress .bar,.ui.ui.disabled.progress .bar::after{-webkit-animation:none;animation:none}.ui.inverted.progress{background:rgba(255,255,255,.08);border:none}.ui.inverted.progress .bar{background:#888}.ui.inverted.progress .bar>.progress{color:#1b1c1d}.ui.inverted.progress>.label{color:#fff}.ui.inverted.progress.success>.label{color:#21ba45}.ui.inverted.progress.warning>.label{color:#f2c037}.ui.inverted.progress.error>.label{color:#db2828}.ui.progress.attached{background:0 0;position:relative;border:none;margin:0}.ui.progress.attached,.ui.progress.attached .bar{height:.2rem;padding:0;overflow:hidden;border-radius:0 0 .28571429rem .28571429rem}.ui.progress.attached .bar{border-radius:0}.ui.progress.top.attached,.ui.progress.top.attached .bar{top:0;border-radius:.28571429rem .28571429rem 0 0}.ui.progress.top.attached .bar{border-radius:0}.ui.card>.ui.attached.progress,.ui.segment>.ui.attached.progress{position:absolute;top:auto;left:0;bottom:100%;width:100%}.ui.card>.ui.bottom.attached.progress,.ui.segment>.ui.bottom.attached.progress{top:100%;bottom:auto}.ui.indeterminate.primary.progress .bar::before,.ui.primary.progress .bar,.ui.progress .primary.bar{background-color:#2185d0}.ui.inverted.indeterminate.primary.progress .bar::before,.ui.inverted.progress .primary.bar,.ui.primary.inverted.progress .bar{background-color:#54c8ff}.ui.indeterminate.secondary.progress .bar::before,.ui.progress .secondary.bar,.ui.secondary.progress .bar{background-color:#1b1c1d}.ui.inverted.indeterminate.secondary.progress .bar::before,.ui.inverted.progress .secondary.bar,.ui.secondary.inverted.progress .bar{background-color:#545454}.ui.indeterminate.red.progress .bar::before,.ui.progress .red.bar,.ui.red.progress .bar{background-color:#db2828}.ui.inverted.indeterminate.red.progress .bar::before,.ui.inverted.progress .red.bar,.ui.red.inverted.progress .bar{background-color:#ff695e}.ui.indeterminate.orange.progress .bar::before,.ui.orange.progress .bar,.ui.progress .orange.bar{background-color:#f2711c}.ui.inverted.indeterminate.orange.progress .bar::before,.ui.inverted.progress .orange.bar,.ui.orange.inverted.progress .bar{background-color:#ff851b}.ui.indeterminate.yellow.progress .bar::before,.ui.progress .yellow.bar,.ui.yellow.progress .bar{background-color:#fbbd08}.ui.inverted.indeterminate.yellow.progress .bar::before,.ui.inverted.progress .yellow.bar,.ui.yellow.inverted.progress .bar{background-color:#ffe21f}.ui.indeterminate.olive.progress .bar::before,.ui.olive.progress .bar,.ui.progress .olive.bar{background-color:#b5cc18}.ui.inverted.indeterminate.olive.progress .bar::before,.ui.inverted.progress .olive.bar,.ui.olive.inverted.progress .bar{background-color:#d9e778}.ui.green.progress .bar,.ui.indeterminate.green.progress .bar::before,.ui.progress .green.bar{background-color:#21ba45}.ui.green.inverted.progress .bar,.ui.inverted.indeterminate.green.progress .bar::before,.ui.inverted.progress .green.bar{background-color:#2ecc40}.ui.indeterminate.teal.progress .bar::before,.ui.progress .teal.bar,.ui.teal.progress .bar{background-color:#00b5ad}.ui.inverted.indeterminate.teal.progress .bar::before,.ui.inverted.progress .teal.bar,.ui.teal.inverted.progress .bar{background-color:#6dffff}.ui.blue.progress .bar,.ui.indeterminate.blue.progress .bar::before,.ui.progress .blue.bar{background-color:#2185d0}.ui.blue.inverted.progress .bar,.ui.inverted.indeterminate.blue.progress .bar::before,.ui.inverted.progress .blue.bar{background-color:#54c8ff}.ui.indeterminate.violet.progress .bar::before,.ui.progress .violet.bar,.ui.violet.progress .bar{background-color:#6435c9}.ui.inverted.indeterminate.violet.progress .bar::before,.ui.inverted.progress .violet.bar,.ui.violet.inverted.progress .bar{background-color:#a291fb}.ui.indeterminate.purple.progress .bar::before,.ui.progress .purple.bar,.ui.purple.progress .bar{background-color:#a333c8}.ui.inverted.indeterminate.purple.progress .bar::before,.ui.inverted.progress .purple.bar,.ui.purple.inverted.progress .bar{background-color:#dc73ff}.ui.indeterminate.pink.progress .bar::before,.ui.pink.progress .bar,.ui.progress .pink.bar{background-color:#e03997}.ui.inverted.indeterminate.pink.progress .bar::before,.ui.inverted.progress .pink.bar,.ui.pink.inverted.progress .bar{background-color:#ff8edf}.ui.brown.progress .bar,.ui.indeterminate.brown.progress .bar::before,.ui.progress .brown.bar{background-color:#a5673f}.ui.brown.inverted.progress .bar,.ui.inverted.indeterminate.brown.progress .bar::before,.ui.inverted.progress .brown.bar{background-color:#d67c1c}.ui.grey.progress .bar,.ui.indeterminate.grey.progress .bar::before,.ui.progress .grey.bar{background-color:#767676}.ui.grey.inverted.progress .bar,.ui.inverted.indeterminate.grey.progress .bar::before,.ui.inverted.progress .grey.bar{background-color:#dcddde}.ui.black.progress .bar,.ui.indeterminate.black.progress .bar::before,.ui.progress .black.bar{background-color:#1b1c1d}.ui.black.inverted.progress .bar,.ui.inverted.indeterminate.black.progress .bar::before,.ui.inverted.progress .black.bar{background-color:#545454}.ui.progress{font-size:1rem}.ui.progress .bar{height:1.75em}.ui.mini.progress{font-size:.78571429rem}.ui.mini.progress .bar{height:.3em}.ui.tiny.progress{font-size:.85714286rem}.ui.tiny.progress .bar{height:.5em}.ui.small.progress{font-size:.92857143rem}.ui.small.progress .bar{height:1em}.ui.large.progress{font-size:1.14285714rem}.ui.large.progress .bar{height:2.5em}.ui.big.progress{font-size:1.28571429rem}.ui.big.progress .bar{height:3.5em}.ui.huge.progress{font-size:1.42857143rem}.ui.huge.progress .bar{height:4em}.ui.massive.progress{font-size:1.71428571rem}.ui.massive.progress .bar{height:5em}.ui.indeterminate.progress .bar{width:100%}.ui.indeterminate.progress .bar .progress,.ui.progress .bar .centered.progress{text-align:center;position:relative;right:0}.ui.indeterminate.progress .bar::before{content:'';position:absolute;top:0;bottom:0;border-radius:.28571429rem;-webkit-animation:progress-pulsating 2s ease infinite;animation:progress-pulsating 2s ease infinite;-webkit-transform-origin:center;transform-origin:center;width:100%}.ui.slow.indeterminate.progress .bar::before{-webkit-animation-duration:4s;animation-duration:4s}.ui.fast.indeterminate.progress .bar::before{-webkit-animation-duration:1s;animation-duration:1s}.ui.swinging.indeterminate.progress .bar::before{-webkit-transform-origin:left;transform-origin:left;-webkit-animation-name:progress-swinging;animation-name:progress-swinging}.ui.sliding.indeterminate.progress .bar::before{-webkit-transform-origin:left;transform-origin:left;-webkit-animation-name:progress-sliding;animation-name:progress-sliding}.ui.filling.indeterminate.progress .bar::before{-webkit-animation-name:progress-filling;animation-name:progress-filling}.ui.indeterminate.progress:not(.sliding):not(.filling):not(.swinging) .bar::before{background:#fff}.ui.filling.indeterminate.progress .bar,.ui.sliding.indeterminate.progress .bar,.ui.swinging.indeterminate.progress .bar{background:rgba(0,0,0,.1)}.ui.sliding.indeterminate.progress .bar .progress,.ui.swinging.indeterminate.progress .bar .progress{color:#1b1c1d}.ui.inverted.filling.indeterminate.progress .bar,.ui.inverted.sliding.indeterminate.progress .bar,.ui.inverted.swinging.indeterminate.progress .bar{background:rgba(255,255,255,.08)}.ui.inverted.sliding.indeterminate.progress .bar .progress,.ui.inverted.swinging.indeterminate.progress .bar .progress{color:rgba(255,255,255,.7)}@-webkit-keyframes progress-swinging{0%,100%{width:10%;left:-25%}25%,65%{width:70%}50%{width:10%;left:100%}}@keyframes progress-swinging{0%,100%{width:10%;left:-25%}25%,65%{width:70%}50%{width:10%;left:100%}}@-webkit-keyframes progress-sliding{0%{width:10%;left:-25%}50%{width:70%}100%{width:10%;left:100%}}@keyframes progress-sliding{0%{width:10%;left:-25%}50%{width:70%}100%{width:10%;left:100%}}@-webkit-keyframes progress-filling{0%{-webkit-transform:scale(0,1);transform:scale(0,1)}80%{-webkit-transform:scale(1);transform:scale(1);opacity:1}100%{opacity:0}}@keyframes progress-filling{0%{-webkit-transform:scale(0,1);transform:scale(0,1)}80%{-webkit-transform:scale(1);transform:scale(1);opacity:1}100%{opacity:0}}@-webkit-keyframes progress-pulsating{0%{-webkit-transform:scale(0,1);transform:scale(0,1);opacity:.7}100%{-webkit-transform:scale(1);transform:scale(1);opacity:0}}@keyframes progress-pulsating{0%{-webkit-transform:scale(0,1);transform:scale(0,1);opacity:.7}100%{-webkit-transform:scale(1);transform:scale(1);opacity:0}}
\ No newline at end of file
diff --git a/public/dist/components/progress.min.js b/public/dist/components/progress.min.js
new file mode 100644
index 000000000..e903d6e9e
--- /dev/null
+++ b/public/dist/components/progress.min.js
@@ -0,0 +1,11 @@
+/*
+ * # Fomantic UI - 2.8.8
+ * https://github.com/fomantic/Fomantic-UI
+ * http://fomantic-ui.com/
+ *
+ * Copyright 2021 Contributors
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+!function(E,e,T,P){"use strict";E.isFunction=E.isFunction||function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},e=void 0!==e&&e.Math==Math?e:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),E.fn.progress=function(m){var b,e=E(this),h=e.selector||"",x=(new Date).getTime(),y=[],w=m,A="string"==typeof w,V=[].slice.call(arguments,1);return e.each(function(){var c,s=E.isPlainObject(m)?E.extend(!0,{},E.fn.progress.settings,m):E.extend({},E.fn.progress.settings),n=s.className,t=s.metadata,e=s.namespace,r=s.selector,l=s.error,a="."+e,o="module-"+e,u=E(this),p=E(this).find(r.bar),i=E(this).find(r.progress),d=E(this).find(r.label),g=this,v=u.data(o),f=!1;c={helper:{sum:function(e){return Array.isArray(e)?e.reduce(function(e,t){return e+Number(t)},0):0},derivePrecision:function(e,t){for(var n=0,r=1,a=e/t;n<10&&!(1<(a*=r));)r=Math.pow(10,n++);return r},forceArray:function(e){return Array.isArray(e)?e:isNaN(e)?"string"==typeof e?e.split(","):[]:[e]}},initialize:function(){c.set.duration(),c.set.transitionEvent(),c.debug(g),c.read.metadata(),c.read.settings(),c.instantiate()},instantiate:function(){c.verbose("Storing instance of progress",c),v=c,u.data(o,c)},destroy:function(){c.verbose("Destroying previous progress for",u),clearInterval(v.interval),c.remove.state(),u.removeData(o),v=P},reset:function(){c.remove.nextValue(),c.update.progress(0)},complete:function(e){(c.percent===P||c.percent<100)&&(c.remove.progressPoll(),!0!==e&&c.set.percent(100))},read:{metadata:function(){var e={percent:c.helper.forceArray(u.data(t.percent)),total:u.data(t.total),value:c.helper.forceArray(u.data(t.value))};e.total!==P&&(c.debug("Total value set from metadata",e.total),c.set.total(e.total)),0c.total)return c.debug("Value cannot increment above total",c.total),c.total}else if(100c.total)c.error(l.sumExceedsTotal,a,c.total);else if(!r&&100 .bar",label:"> .label",progress:".bar > .progress"},text:{active:!1,error:!1,success:!1,warning:!1,percent:"{percent}%",ratio:"{value} of {total}",bars:[""]},className:{active:"active",error:"error",success:"success",warning:"warning"}}}(jQuery,window,document);
\ No newline at end of file
diff --git a/public/dist/components/rail.css b/public/dist/components/rail.css
new file mode 100644
index 000000000..4f0446d45
--- /dev/null
+++ b/public/dist/components/rail.css
@@ -0,0 +1,152 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Rail
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+
+/*******************************
+ Rails
+*******************************/
+
+.ui.rail {
+ position: absolute;
+ top: 0;
+ width: 300px;
+ height: 100%;
+}
+.ui.left.rail {
+ left: auto;
+ right: 100%;
+ padding: 0 2rem 0 0;
+ margin: 0 2rem 0 0;
+}
+.ui.right.rail {
+ left: 100%;
+ right: auto;
+ padding: 0 0 0 2rem;
+ margin: 0 0 0 2rem;
+}
+
+
+/*******************************
+ Variations
+*******************************/
+
+
+/*--------------
+ Internal
+ ---------------*/
+
+.ui.left.internal.rail {
+ left: 0;
+ right: auto;
+ padding: 0 0 0 2rem;
+ margin: 0 0 0 2rem;
+}
+.ui.right.internal.rail {
+ left: auto;
+ right: 0;
+ padding: 0 2rem 0 0;
+ margin: 0 2rem 0 0;
+}
+
+/*--------------
+ Dividing
+ ---------------*/
+
+.ui.dividing.rail {
+ width: 302.5px;
+}
+.ui.left.dividing.rail {
+ padding: 0 2.5rem 0 0;
+ margin: 0 2.5rem 0 0;
+ border-right: 1px solid rgba(34, 36, 38, 0.15);
+}
+.ui.right.dividing.rail {
+ border-left: 1px solid rgba(34, 36, 38, 0.15);
+ padding: 0 0 0 2.5rem;
+ margin: 0 0 0 2.5rem;
+}
+
+/*--------------
+ Distance
+ ---------------*/
+
+.ui.close.rail {
+ width: calc(300px + 1em);
+}
+.ui.close.left.rail {
+ padding: 0 1em 0 0;
+ margin: 0 1em 0 0;
+}
+.ui.close.right.rail {
+ padding: 0 0 0 1em;
+ margin: 0 0 0 1em;
+}
+.ui.very.close.rail {
+ width: calc(300px + 0.5em);
+}
+.ui.very.close.left.rail {
+ padding: 0 0.5em 0 0;
+ margin: 0 0.5em 0 0;
+}
+.ui.very.close.right.rail {
+ padding: 0 0 0 0.5em;
+ margin: 0 0 0 0.5em;
+}
+
+/*--------------
+ Attached
+ ---------------*/
+
+.ui.attached.left.rail,
+.ui.attached.right.rail {
+ padding: 0;
+ margin: 0;
+}
+
+/*--------------
+ Sizing
+---------------*/
+
+.ui.rail {
+ font-size: 1rem;
+}
+.ui.mini.rail {
+ font-size: 0.78571429rem;
+}
+.ui.tiny.rail {
+ font-size: 0.85714286rem;
+}
+.ui.small.rail {
+ font-size: 0.92857143rem;
+}
+.ui.large.rail {
+ font-size: 1.14285714rem;
+}
+.ui.big.rail {
+ font-size: 1.28571429rem;
+}
+.ui.huge.rail {
+ font-size: 1.42857143rem;
+}
+.ui.massive.rail {
+ font-size: 1.71428571rem;
+}
+
+
+/*******************************
+ Theme Overrides
+*******************************/
+
+
+
+/*******************************
+ Site Overrides
+*******************************/
+
diff --git a/public/dist/components/rail.min.css b/public/dist/components/rail.min.css
new file mode 100644
index 000000000..c4da8d8ab
--- /dev/null
+++ b/public/dist/components/rail.min.css
@@ -0,0 +1,9 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Rail
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */.ui.rail{position:absolute;top:0;width:300px;height:100%}.ui.left.rail{left:auto;right:100%;padding:0 2rem 0 0;margin:0 2rem 0 0}.ui.right.rail{left:100%;right:auto;padding:0 0 0 2rem;margin:0 0 0 2rem}.ui.left.internal.rail{left:0;right:auto;padding:0 0 0 2rem;margin:0 0 0 2rem}.ui.right.internal.rail{left:auto;right:0;padding:0 2rem 0 0;margin:0 2rem 0 0}.ui.dividing.rail{width:302.5px}.ui.left.dividing.rail{padding:0 2.5rem 0 0;margin:0 2.5rem 0 0;border-right:1px solid rgba(34,36,38,.15)}.ui.right.dividing.rail{border-left:1px solid rgba(34,36,38,.15);padding:0 0 0 2.5rem;margin:0 0 0 2.5rem}.ui.close.rail{width:calc(300px + 1em)}.ui.close.left.rail{padding:0 1em 0 0;margin:0 1em 0 0}.ui.close.right.rail{padding:0 0 0 1em;margin:0 0 0 1em}.ui.very.close.rail{width:calc(300px + .5em)}.ui.very.close.left.rail{padding:0 .5em 0 0;margin:0 .5em 0 0}.ui.very.close.right.rail{padding:0 0 0 .5em;margin:0 0 0 .5em}.ui.attached.left.rail,.ui.attached.right.rail{padding:0;margin:0}.ui.rail{font-size:1rem}.ui.mini.rail{font-size:.78571429rem}.ui.tiny.rail{font-size:.85714286rem}.ui.small.rail{font-size:.92857143rem}.ui.large.rail{font-size:1.14285714rem}.ui.big.rail{font-size:1.28571429rem}.ui.huge.rail{font-size:1.42857143rem}.ui.massive.rail{font-size:1.71428571rem}
\ No newline at end of file
diff --git a/public/dist/components/rating.css b/public/dist/components/rating.css
new file mode 100644
index 000000000..a2aab79e8
--- /dev/null
+++ b/public/dist/components/rating.css
@@ -0,0 +1,494 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Rating
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+
+/*******************************
+ Rating
+*******************************/
+
+.ui.rating {
+ display: -webkit-inline-box;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ white-space: nowrap;
+ vertical-align: baseline;
+}
+.ui.rating:last-child {
+ margin-right: 0;
+}
+
+/* Icon */
+.ui.rating .icon {
+ padding: 0;
+ margin: 0;
+ text-align: center;
+ font-weight: normal;
+ font-style: normal;
+ -webkit-box-flex: 1;
+ -ms-flex: 1 0 auto;
+ flex: 1 0 auto;
+ cursor: pointer;
+ width: 1.25em;
+ height: auto;
+ -webkit-transition: opacity 0.1s ease, background 0.1s ease, text-shadow 0.1s ease, color 0.1s ease;
+ transition: opacity 0.1s ease, background 0.1s ease, text-shadow 0.1s ease, color 0.1s ease;
+ line-height: 1;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+}
+
+
+/*******************************
+ Types
+*******************************/
+
+
+/*-------------------
+ Standard
+--------------------*/
+
+
+/* Inactive Icon */
+.ui.rating .icon {
+ background: transparent;
+ color: rgba(0, 0, 0, 0.15);
+}
+
+/* Active Icon */
+.ui.rating .active.icon {
+ background: transparent;
+ color: rgba(0, 0, 0, 0.85);
+}
+
+/* Partially Active Icon */
+.ui.rating .icon.partial.active {
+ background: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, 0.85)), to(rgba(0, 0, 0, 0.15)));
+ background: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.85) 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ background: linear-gradient(to right, rgba(0, 0, 0, 0.85) 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ background-clip: text;
+ color: transparent;
+}
+
+/* Selected Icon */
+.ui.rating .icon.selected,
+.ui.rating .icon.selected.active,
+.ui.rating .icon.selected.partial.active {
+ background: transparent;
+ color: rgba(0, 0, 0, 0.87);
+ background-clip: unset;
+}
+
+/*--------------
+ Colors
+-------------- */
+
+.ui.primary.rating .active.icon {
+ color: #54C8FF;
+ text-shadow: 0px -1px 0px #2185D0, -1px 0px 0px #2185D0, 0px 1px 0px #2185D0, 1px 0px 0px #2185D0;
+}
+.ui.primary.rating .icon.selected,
+.ui.primary.rating .icon.selected.active,
+.ui.primary.rating .icon.selected.partial.active {
+ background: inherit;
+ color: #21b8ff;
+ text-shadow: 0px -1px 0px #1678c2, -1px 0px 0px #1678c2, 0px 1px 0px #1678c2, 1px 0px 0px #1678c2;
+ -webkit-text-stroke: unset;
+ background-clip: unset;
+}
+.ui.primary.rating .icon.partial.active {
+ background: -webkit-gradient(linear, left top, right top, from(#54C8FF), to(rgba(0, 0, 0, 0.15)));
+ background: -webkit-linear-gradient(left, #54C8FF 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ background: linear-gradient(to right, #54C8FF 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ text-shadow: none;
+ -webkit-text-stroke: #2185D0 0.78px;
+ background-clip: text;
+ color: transparent;
+}
+.ui.secondary.rating .active.icon {
+ color: #545454;
+ text-shadow: 0px -1px 0px #1B1C1D, -1px 0px 0px #1B1C1D, 0px 1px 0px #1B1C1D, 1px 0px 0px #1B1C1D;
+}
+.ui.secondary.rating .icon.selected,
+.ui.secondary.rating .icon.selected.active,
+.ui.secondary.rating .icon.selected.partial.active {
+ background: inherit;
+ color: #6e6e6e;
+ text-shadow: 0px -1px 0px #27292a, -1px 0px 0px #27292a, 0px 1px 0px #27292a, 1px 0px 0px #27292a;
+ -webkit-text-stroke: unset;
+ background-clip: unset;
+}
+.ui.secondary.rating .icon.partial.active {
+ background: -webkit-gradient(linear, left top, right top, from(#545454), to(rgba(0, 0, 0, 0.15)));
+ background: -webkit-linear-gradient(left, #545454 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ background: linear-gradient(to right, #545454 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ text-shadow: none;
+ -webkit-text-stroke: #1B1C1D 0.78px;
+ background-clip: text;
+ color: transparent;
+}
+.ui.red.rating .active.icon {
+ color: #FF695E;
+ text-shadow: 0px -1px 0px #DB2828, -1px 0px 0px #DB2828, 0px 1px 0px #DB2828, 1px 0px 0px #DB2828;
+}
+.ui.red.rating .icon.selected,
+.ui.red.rating .icon.selected.active,
+.ui.red.rating .icon.selected.partial.active {
+ background: inherit;
+ color: #ff392b;
+ text-shadow: 0px -1px 0px #d01919, -1px 0px 0px #d01919, 0px 1px 0px #d01919, 1px 0px 0px #d01919;
+ -webkit-text-stroke: unset;
+ background-clip: unset;
+}
+.ui.red.rating .icon.partial.active {
+ background: -webkit-gradient(linear, left top, right top, from(#FF695E), to(rgba(0, 0, 0, 0.15)));
+ background: -webkit-linear-gradient(left, #FF695E 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ background: linear-gradient(to right, #FF695E 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ text-shadow: none;
+ -webkit-text-stroke: #DB2828 0.78px;
+ background-clip: text;
+ color: transparent;
+}
+.ui.orange.rating .active.icon {
+ color: #FF851B;
+ text-shadow: 0px -1px 0px #F2711C, -1px 0px 0px #F2711C, 0px 1px 0px #F2711C, 1px 0px 0px #F2711C;
+}
+.ui.orange.rating .icon.selected,
+.ui.orange.rating .icon.selected.active,
+.ui.orange.rating .icon.selected.partial.active {
+ background: inherit;
+ color: #e76b00;
+ text-shadow: 0px -1px 0px #f26202, -1px 0px 0px #f26202, 0px 1px 0px #f26202, 1px 0px 0px #f26202;
+ -webkit-text-stroke: unset;
+ background-clip: unset;
+}
+.ui.orange.rating .icon.partial.active {
+ background: -webkit-gradient(linear, left top, right top, from(#FF851B), to(rgba(0, 0, 0, 0.15)));
+ background: -webkit-linear-gradient(left, #FF851B 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ background: linear-gradient(to right, #FF851B 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ text-shadow: none;
+ -webkit-text-stroke: #F2711C 0.78px;
+ background-clip: text;
+ color: transparent;
+}
+.ui.yellow.rating .active.icon {
+ color: #FFE21F;
+ text-shadow: 0px -1px 0px #FBBD08, -1px 0px 0px #FBBD08, 0px 1px 0px #FBBD08, 1px 0px 0px #FBBD08;
+}
+.ui.yellow.rating .icon.selected,
+.ui.yellow.rating .icon.selected.active,
+.ui.yellow.rating .icon.selected.partial.active {
+ background: inherit;
+ color: #ebcd00;
+ text-shadow: 0px -1px 0px #eaae00, -1px 0px 0px #eaae00, 0px 1px 0px #eaae00, 1px 0px 0px #eaae00;
+ -webkit-text-stroke: unset;
+ background-clip: unset;
+}
+.ui.yellow.rating .icon.partial.active {
+ background: -webkit-gradient(linear, left top, right top, from(#FFE21F), to(rgba(0, 0, 0, 0.15)));
+ background: -webkit-linear-gradient(left, #FFE21F 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ background: linear-gradient(to right, #FFE21F 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ text-shadow: none;
+ -webkit-text-stroke: #FBBD08 0.78px;
+ background-clip: text;
+ color: transparent;
+}
+.ui.olive.rating .active.icon {
+ color: #D9E778;
+ text-shadow: 0px -1px 0px #B5CC18, -1px 0px 0px #B5CC18, 0px 1px 0px #B5CC18, 1px 0px 0px #B5CC18;
+}
+.ui.olive.rating .icon.selected,
+.ui.olive.rating .icon.selected.active,
+.ui.olive.rating .icon.selected.partial.active {
+ background: inherit;
+ color: #d2e745;
+ text-shadow: 0px -1px 0px #a7bd0d, -1px 0px 0px #a7bd0d, 0px 1px 0px #a7bd0d, 1px 0px 0px #a7bd0d;
+ -webkit-text-stroke: unset;
+ background-clip: unset;
+}
+.ui.olive.rating .icon.partial.active {
+ background: -webkit-gradient(linear, left top, right top, from(#D9E778), to(rgba(0, 0, 0, 0.15)));
+ background: -webkit-linear-gradient(left, #D9E778 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ background: linear-gradient(to right, #D9E778 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ text-shadow: none;
+ -webkit-text-stroke: #B5CC18 0.78px;
+ background-clip: text;
+ color: transparent;
+}
+.ui.green.rating .active.icon {
+ color: #2ECC40;
+ text-shadow: 0px -1px 0px #21BA45, -1px 0px 0px #21BA45, 0px 1px 0px #21BA45, 1px 0px 0px #21BA45;
+}
+.ui.green.rating .icon.selected,
+.ui.green.rating .icon.selected.active,
+.ui.green.rating .icon.selected.partial.active {
+ background: inherit;
+ color: #1ea92e;
+ text-shadow: 0px -1px 0px #16ab39, -1px 0px 0px #16ab39, 0px 1px 0px #16ab39, 1px 0px 0px #16ab39;
+ -webkit-text-stroke: unset;
+ background-clip: unset;
+}
+.ui.green.rating .icon.partial.active {
+ background: -webkit-gradient(linear, left top, right top, from(#2ECC40), to(rgba(0, 0, 0, 0.15)));
+ background: -webkit-linear-gradient(left, #2ECC40 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ background: linear-gradient(to right, #2ECC40 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ text-shadow: none;
+ -webkit-text-stroke: #21BA45 0.78px;
+ background-clip: text;
+ color: transparent;
+}
+.ui.teal.rating .active.icon {
+ color: #6DFFFF;
+ text-shadow: 0px -1px 0px #00B5AD, -1px 0px 0px #00B5AD, 0px 1px 0px #00B5AD, 1px 0px 0px #00B5AD;
+}
+.ui.teal.rating .icon.selected,
+.ui.teal.rating .icon.selected.active,
+.ui.teal.rating .icon.selected.partial.active {
+ background: inherit;
+ color: #3affff;
+ text-shadow: 0px -1px 0px #009c95, -1px 0px 0px #009c95, 0px 1px 0px #009c95, 1px 0px 0px #009c95;
+ -webkit-text-stroke: unset;
+ background-clip: unset;
+}
+.ui.teal.rating .icon.partial.active {
+ background: -webkit-gradient(linear, left top, right top, from(#6DFFFF), to(rgba(0, 0, 0, 0.15)));
+ background: -webkit-linear-gradient(left, #6DFFFF 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ background: linear-gradient(to right, #6DFFFF 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ text-shadow: none;
+ -webkit-text-stroke: #00B5AD 0.78px;
+ background-clip: text;
+ color: transparent;
+}
+.ui.blue.rating .active.icon {
+ color: #54C8FF;
+ text-shadow: 0px -1px 0px #2185D0, -1px 0px 0px #2185D0, 0px 1px 0px #2185D0, 1px 0px 0px #2185D0;
+}
+.ui.blue.rating .icon.selected,
+.ui.blue.rating .icon.selected.active,
+.ui.blue.rating .icon.selected.partial.active {
+ background: inherit;
+ color: #21b8ff;
+ text-shadow: 0px -1px 0px #1678c2, -1px 0px 0px #1678c2, 0px 1px 0px #1678c2, 1px 0px 0px #1678c2;
+ -webkit-text-stroke: unset;
+ background-clip: unset;
+}
+.ui.blue.rating .icon.partial.active {
+ background: -webkit-gradient(linear, left top, right top, from(#54C8FF), to(rgba(0, 0, 0, 0.15)));
+ background: -webkit-linear-gradient(left, #54C8FF 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ background: linear-gradient(to right, #54C8FF 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ text-shadow: none;
+ -webkit-text-stroke: #2185D0 0.78px;
+ background-clip: text;
+ color: transparent;
+}
+.ui.violet.rating .active.icon {
+ color: #A291FB;
+ text-shadow: 0px -1px 0px #6435C9, -1px 0px 0px #6435C9, 0px 1px 0px #6435C9, 1px 0px 0px #6435C9;
+}
+.ui.violet.rating .icon.selected,
+.ui.violet.rating .icon.selected.active,
+.ui.violet.rating .icon.selected.partial.active {
+ background: inherit;
+ color: #745aff;
+ text-shadow: 0px -1px 0px #5829bb, -1px 0px 0px #5829bb, 0px 1px 0px #5829bb, 1px 0px 0px #5829bb;
+ -webkit-text-stroke: unset;
+ background-clip: unset;
+}
+.ui.violet.rating .icon.partial.active {
+ background: -webkit-gradient(linear, left top, right top, from(#A291FB), to(rgba(0, 0, 0, 0.15)));
+ background: -webkit-linear-gradient(left, #A291FB 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ background: linear-gradient(to right, #A291FB 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ text-shadow: none;
+ -webkit-text-stroke: #6435C9 0.78px;
+ background-clip: text;
+ color: transparent;
+}
+.ui.purple.rating .active.icon {
+ color: #DC73FF;
+ text-shadow: 0px -1px 0px #A333C8, -1px 0px 0px #A333C8, 0px 1px 0px #A333C8, 1px 0px 0px #A333C8;
+}
+.ui.purple.rating .icon.selected,
+.ui.purple.rating .icon.selected.active,
+.ui.purple.rating .icon.selected.partial.active {
+ background: inherit;
+ color: #cf40ff;
+ text-shadow: 0px -1px 0px #9627ba, -1px 0px 0px #9627ba, 0px 1px 0px #9627ba, 1px 0px 0px #9627ba;
+ -webkit-text-stroke: unset;
+ background-clip: unset;
+}
+.ui.purple.rating .icon.partial.active {
+ background: -webkit-gradient(linear, left top, right top, from(#DC73FF), to(rgba(0, 0, 0, 0.15)));
+ background: -webkit-linear-gradient(left, #DC73FF 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ background: linear-gradient(to right, #DC73FF 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ text-shadow: none;
+ -webkit-text-stroke: #A333C8 0.78px;
+ background-clip: text;
+ color: transparent;
+}
+.ui.pink.rating .active.icon {
+ color: #FF8EDF;
+ text-shadow: 0px -1px 0px #E03997, -1px 0px 0px #E03997, 0px 1px 0px #E03997, 1px 0px 0px #E03997;
+}
+.ui.pink.rating .icon.selected,
+.ui.pink.rating .icon.selected.active,
+.ui.pink.rating .icon.selected.partial.active {
+ background: inherit;
+ color: #ff5bd1;
+ text-shadow: 0px -1px 0px #e61a8d, -1px 0px 0px #e61a8d, 0px 1px 0px #e61a8d, 1px 0px 0px #e61a8d;
+ -webkit-text-stroke: unset;
+ background-clip: unset;
+}
+.ui.pink.rating .icon.partial.active {
+ background: -webkit-gradient(linear, left top, right top, from(#FF8EDF), to(rgba(0, 0, 0, 0.15)));
+ background: -webkit-linear-gradient(left, #FF8EDF 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ background: linear-gradient(to right, #FF8EDF 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ text-shadow: none;
+ -webkit-text-stroke: #E03997 0.78px;
+ background-clip: text;
+ color: transparent;
+}
+.ui.brown.rating .active.icon {
+ color: #D67C1C;
+ text-shadow: 0px -1px 0px #A5673F, -1px 0px 0px #A5673F, 0px 1px 0px #A5673F, 1px 0px 0px #A5673F;
+}
+.ui.brown.rating .icon.selected,
+.ui.brown.rating .icon.selected.active,
+.ui.brown.rating .icon.selected.partial.active {
+ background: inherit;
+ color: #b0620f;
+ text-shadow: 0px -1px 0px #975b33, -1px 0px 0px #975b33, 0px 1px 0px #975b33, 1px 0px 0px #975b33;
+ -webkit-text-stroke: unset;
+ background-clip: unset;
+}
+.ui.brown.rating .icon.partial.active {
+ background: -webkit-gradient(linear, left top, right top, from(#D67C1C), to(rgba(0, 0, 0, 0.15)));
+ background: -webkit-linear-gradient(left, #D67C1C 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ background: linear-gradient(to right, #D67C1C 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ text-shadow: none;
+ -webkit-text-stroke: #A5673F 0.78px;
+ background-clip: text;
+ color: transparent;
+}
+.ui.grey.rating .active.icon {
+ color: #DCDDDE;
+ text-shadow: 0px -1px 0px #767676, -1px 0px 0px #767676, 0px 1px 0px #767676, 1px 0px 0px #767676;
+}
+.ui.grey.rating .icon.selected,
+.ui.grey.rating .icon.selected.active,
+.ui.grey.rating .icon.selected.partial.active {
+ background: inherit;
+ color: #c2c4c5;
+ text-shadow: 0px -1px 0px #838383, -1px 0px 0px #838383, 0px 1px 0px #838383, 1px 0px 0px #838383;
+ -webkit-text-stroke: unset;
+ background-clip: unset;
+}
+.ui.grey.rating .icon.partial.active {
+ background: -webkit-gradient(linear, left top, right top, from(#DCDDDE), to(rgba(0, 0, 0, 0.15)));
+ background: -webkit-linear-gradient(left, #DCDDDE 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ background: linear-gradient(to right, #DCDDDE 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ text-shadow: none;
+ -webkit-text-stroke: #767676 0.78px;
+ background-clip: text;
+ color: transparent;
+}
+.ui.black.rating .active.icon {
+ color: #545454;
+ text-shadow: 0px -1px 0px #1B1C1D, -1px 0px 0px #1B1C1D, 0px 1px 0px #1B1C1D, 1px 0px 0px #1B1C1D;
+}
+.ui.black.rating .icon.selected,
+.ui.black.rating .icon.selected.active,
+.ui.black.rating .icon.selected.partial.active {
+ background: inherit;
+ color: #000000;
+ text-shadow: 0px -1px 0px #27292a, -1px 0px 0px #27292a, 0px 1px 0px #27292a, 1px 0px 0px #27292a;
+ -webkit-text-stroke: unset;
+ background-clip: unset;
+}
+.ui.black.rating .icon.partial.active {
+ background: -webkit-gradient(linear, left top, right top, from(#545454), to(rgba(0, 0, 0, 0.15)));
+ background: -webkit-linear-gradient(left, #545454 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ background: linear-gradient(to right, #545454 0% var(--full), rgba(0, 0, 0, 0.15) var(--full) 100%);
+ text-shadow: none;
+ -webkit-text-stroke: #1B1C1D 0.78px;
+ background-clip: text;
+ color: transparent;
+}
+
+
+/*******************************
+ States
+*******************************/
+
+
+/*-------------------
+ Disabled
+ --------------------*/
+
+
+/* disabled rating */
+.ui.disabled.rating .icon {
+ cursor: default;
+ pointer-events: none;
+}
+
+/*-------------------
+ User Interactive
+--------------------*/
+
+
+/* Selected Rating */
+.ui.rating.selected .active.icon {
+ opacity: 1;
+}
+.ui.rating.selected .icon.selected,
+.ui.rating .icon.selected {
+ opacity: 1;
+}
+
+
+/*******************************
+ Variations
+*******************************/
+
+.ui.rating {
+ font-size: 1rem;
+}
+.ui.mini.rating {
+ font-size: 0.78571429rem;
+}
+.ui.tiny.rating {
+ font-size: 0.85714286rem;
+}
+.ui.small.rating {
+ font-size: 0.92857143rem;
+}
+.ui.large.rating {
+ font-size: 1.14285714rem;
+}
+.ui.big.rating {
+ font-size: 1.28571429rem;
+}
+.ui.huge.rating {
+ font-size: 1.42857143rem;
+}
+.ui.massive.rating {
+ font-size: 2rem;
+}
+
+
+/*******************************
+ Theme Overrides
+*******************************/
+
+
+
+/*******************************
+ Site Overrides
+*******************************/
+
diff --git a/public/dist/components/rating.js b/public/dist/components/rating.js
new file mode 100644
index 000000000..8756b3dc4
--- /dev/null
+++ b/public/dist/components/rating.js
@@ -0,0 +1,554 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Rating
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+'use strict';
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.rating = function(parameters) {
+ var
+ $allModules = $(this),
+ moduleSelector = $allModules.selector || '',
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+ returnedValue
+ ;
+ $allModules
+ .each(function() {
+ var
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.fn.rating.settings, parameters)
+ : $.extend({}, $.fn.rating.settings),
+
+ namespace = settings.namespace,
+ className = settings.className,
+ metadata = settings.metadata,
+ selector = settings.selector,
+ cssVars = settings.cssVars,
+
+ eventNamespace = '.' + namespace,
+ moduleNamespace = 'module-' + namespace,
+
+ element = this,
+ instance = $(this).data(moduleNamespace),
+
+ $module = $(this),
+ $icon = $module.find(selector.icon),
+
+ initialLoad,
+ module
+ ;
+
+ module = {
+
+ initialize: function() {
+ module.verbose('Initializing rating module', settings);
+
+ if($icon.length === 0) {
+ module.setup.layout();
+ }
+
+ if(settings.interactive && !module.is.disabled()) {
+ module.enable();
+ }
+ else {
+ module.disable();
+ }
+ module.set.initialLoad();
+ module.set.rating( module.get.initialRating() );
+ module.remove.initialLoad();
+ module.instantiate();
+ },
+
+ instantiate: function() {
+ module.verbose('Instantiating module', settings);
+ instance = module;
+ $module
+ .data(moduleNamespace, module)
+ ;
+ },
+
+ destroy: function() {
+ module.verbose('Destroying previous instance', instance);
+ module.remove.events();
+ $module
+ .removeData(moduleNamespace)
+ ;
+ },
+
+ refresh: function() {
+ $icon = $module.find(selector.icon);
+ },
+
+ setup: {
+ layout: function() {
+ var
+ maxRating = module.get.maxRating(),
+ icon = module.get.icon(),
+ html = $.fn.rating.settings.templates.icon(maxRating, icon)
+ ;
+ module.debug('Generating icon html dynamically');
+ $module
+ .html(html)
+ ;
+ module.refresh();
+ }
+ },
+
+ event: {
+ mouseenter: function() {
+ var
+ $activeIcon = $(this)
+ ;
+ $activeIcon
+ .nextAll()
+ .removeClass(className.selected)
+ ;
+ $module
+ .addClass(className.selected)
+ ;
+ $activeIcon
+ .addClass(className.selected)
+ .prevAll()
+ .addClass(className.selected)
+ ;
+ },
+ mouseleave: function() {
+ $module
+ .removeClass(className.selected)
+ ;
+ $icon
+ .removeClass(className.selected)
+ ;
+ },
+ click: function() {
+ var
+ $activeIcon = $(this),
+ currentRating = module.get.rating(),
+ rating = $icon.index($activeIcon) + 1,
+ canClear = (settings.clearable == 'auto')
+ ? ($icon.length === 1)
+ : settings.clearable
+ ;
+ if(canClear && currentRating == rating) {
+ module.clearRating();
+ }
+ else {
+ module.set.rating( rating );
+ }
+ }
+ },
+
+ clearRating: function() {
+ module.debug('Clearing current rating');
+ module.set.rating(0);
+ },
+
+ bind: {
+ events: function() {
+ module.verbose('Binding events');
+ $module
+ .on('mouseenter' + eventNamespace, selector.icon, module.event.mouseenter)
+ .on('mouseleave' + eventNamespace, selector.icon, module.event.mouseleave)
+ .on('click' + eventNamespace, selector.icon, module.event.click)
+ ;
+ }
+ },
+
+ remove: {
+ events: function() {
+ module.verbose('Removing events');
+ $module
+ .off(eventNamespace)
+ ;
+ },
+ initialLoad: function() {
+ initialLoad = false;
+ }
+ },
+
+ enable: function() {
+ module.debug('Setting rating to interactive mode');
+ module.bind.events();
+ $module
+ .removeClass(className.disabled)
+ ;
+ },
+
+ disable: function() {
+ module.debug('Setting rating to read-only mode');
+ module.remove.events();
+ $module
+ .addClass(className.disabled)
+ ;
+ },
+
+ is: {
+ initialLoad: function() {
+ return initialLoad;
+ },
+ disabled: function() {
+ return $module.hasClass(className.disabled);
+ }
+ },
+
+ get: {
+ icon: function(){
+ var icon = $module.data(metadata.icon);
+ if (icon) {
+ $module.removeData(metadata.icon);
+ }
+ return icon || settings.icon;
+ },
+ initialRating: function() {
+ if($module.data(metadata.rating) !== undefined) {
+ $module.removeData(metadata.rating);
+ return $module.data(metadata.rating);
+ }
+ return settings.initialRating;
+ },
+ maxRating: function() {
+ if($module.data(metadata.maxRating) !== undefined) {
+ $module.removeData(metadata.maxRating);
+ return $module.data(metadata.maxRating);
+ }
+ return settings.maxRating;
+ },
+ rating: function() {
+ var
+ currentRating = $icon.filter('.' + className.active).length
+ ;
+ module.verbose('Current rating retrieved', currentRating);
+ return currentRating;
+ }
+ },
+
+ set: {
+ rating: function(rating) {
+ var
+ ratingIndex = Math.floor(
+ (rating - 1 >= 0)
+ ? (rating - 1)
+ : 0
+ ),
+ $activeIcon = $icon.eq(ratingIndex),
+ $partialActiveIcon = rating <= 1
+ ? $activeIcon
+ : $activeIcon.next()
+ ,
+ filledPercentage = (rating % 1) * 100
+ ;
+ $module
+ .removeClass(className.selected)
+ ;
+ $icon
+ .removeClass(className.selected)
+ .removeClass(className.active)
+ .removeClass(className.partiallyActive)
+ ;
+ if(rating > 0) {
+ module.verbose('Setting current rating to', rating);
+ $activeIcon
+ .prevAll()
+ .addBack()
+ .addClass(className.active)
+ ;
+ if($activeIcon.next() && rating % 1 !== 0) {
+ $partialActiveIcon
+ .addClass(className.partiallyActive)
+ .addClass(className.active)
+ ;
+ $partialActiveIcon
+ .css(cssVars.filledCustomPropName, filledPercentage + '%')
+ ;
+ if($partialActiveIcon.css('backgroundColor') === 'transparent') {
+ $partialActiveIcon
+ .removeClass(className.partiallyActive)
+ .removeClass(className.active)
+ ;
+ }
+ }
+ }
+ if(!module.is.initialLoad()) {
+ settings.onRate.call(element, rating);
+ }
+ },
+ initialLoad: function() {
+ initialLoad = true;
+ }
+ },
+
+ setting: function(name, value) {
+ module.debug('Changing setting', name, value);
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ if($.isPlainObject(settings[name])) {
+ $.extend(true, settings[name], value);
+ }
+ else {
+ settings[name] = value;
+ }
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if($allModules.length > 1) {
+ title += ' ' + '(' + $allModules.length + ')';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ }
+ })
+ ;
+
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.fn.rating.settings = {
+
+ name : 'Rating',
+ namespace : 'rating',
+
+ icon : 'star',
+
+ silent : false,
+ debug : false,
+ verbose : false,
+ performance : true,
+
+ initialRating : 0,
+ interactive : true,
+ maxRating : 4,
+ clearable : 'auto',
+
+ fireOnInit : false,
+
+ onRate : function(rating){},
+
+ error : {
+ method : 'The method you called is not defined',
+ noMaximum : 'No maximum rating specified. Cannot generate HTML automatically'
+ },
+
+
+ metadata: {
+ rating : 'rating',
+ maxRating : 'maxRating',
+ icon : 'icon'
+ },
+
+ className : {
+ active : 'active',
+ disabled : 'disabled',
+ selected : 'selected',
+ loading : 'loading',
+ partiallyActive : 'partial'
+ },
+
+ cssVars : {
+ filledCustomPropName : '--full'
+ },
+
+ selector : {
+ icon : '.icon'
+ },
+
+ templates: {
+ icon: function(maxRating, iconClass) {
+ var
+ icon = 1,
+ html = ''
+ ;
+ while(icon <= maxRating) {
+ html += ' ';
+ icon++;
+ }
+ return html;
+ }
+ }
+
+};
+
+})( jQuery, window, document );
diff --git a/public/dist/components/rating.min.css b/public/dist/components/rating.min.css
new file mode 100644
index 000000000..c8c36d0de
--- /dev/null
+++ b/public/dist/components/rating.min.css
@@ -0,0 +1,9 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Rating
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */.ui.rating{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;white-space:nowrap;vertical-align:baseline}.ui.rating:last-child{margin-right:0}.ui.rating .icon{padding:0;margin:0;text-align:center;font-weight:400;font-style:normal;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;cursor:pointer;width:1.25em;height:auto;-webkit-transition:opacity .1s ease,background .1s ease,text-shadow .1s ease,color .1s ease;transition:opacity .1s ease,background .1s ease,text-shadow .1s ease,color .1s ease;line-height:1;-webkit-backface-visibility:hidden;backface-visibility:hidden}.ui.rating .icon{background:0 0;color:rgba(0,0,0,.15)}.ui.rating .active.icon{background:0 0;color:rgba(0,0,0,.85)}.ui.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.85)),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,rgba(0,0,0,.85) 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,rgba(0,0,0,.85) 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background-clip:text;color:transparent}.ui.rating .icon.selected,.ui.rating .icon.selected.active,.ui.rating .icon.selected.partial.active{background:0 0;color:rgba(0,0,0,.87);background-clip:unset}.ui.primary.rating .active.icon{color:#54c8ff;text-shadow:0 -1px 0 #2185d0,-1px 0 0 #2185d0,0 1px 0 #2185d0,1px 0 0 #2185d0}.ui.primary.rating .icon.selected,.ui.primary.rating .icon.selected.active,.ui.primary.rating .icon.selected.partial.active{background:inherit;color:#21b8ff;text-shadow:0 -1px 0 #1678c2,-1px 0 0 #1678c2,0 1px 0 #1678c2,1px 0 0 #1678c2;-webkit-text-stroke:unset;background-clip:unset}.ui.primary.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(#54c8ff),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,#54c8ff 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,#54c8ff 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);text-shadow:none;-webkit-text-stroke:#2185d0 .78px;background-clip:text;color:transparent}.ui.secondary.rating .active.icon{color:#545454;text-shadow:0 -1px 0 #1b1c1d,-1px 0 0 #1b1c1d,0 1px 0 #1b1c1d,1px 0 0 #1b1c1d}.ui.secondary.rating .icon.selected,.ui.secondary.rating .icon.selected.active,.ui.secondary.rating .icon.selected.partial.active{background:inherit;color:#6e6e6e;text-shadow:0 -1px 0 #27292a,-1px 0 0 #27292a,0 1px 0 #27292a,1px 0 0 #27292a;-webkit-text-stroke:unset;background-clip:unset}.ui.secondary.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(#545454),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,#545454 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,#545454 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);text-shadow:none;-webkit-text-stroke:#1b1c1d .78px;background-clip:text;color:transparent}.ui.red.rating .active.icon{color:#ff695e;text-shadow:0 -1px 0 #db2828,-1px 0 0 #db2828,0 1px 0 #db2828,1px 0 0 #db2828}.ui.red.rating .icon.selected,.ui.red.rating .icon.selected.active,.ui.red.rating .icon.selected.partial.active{background:inherit;color:#ff392b;text-shadow:0 -1px 0 #d01919,-1px 0 0 #d01919,0 1px 0 #d01919,1px 0 0 #d01919;-webkit-text-stroke:unset;background-clip:unset}.ui.red.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(#ff695e),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,#ff695e 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,#ff695e 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);text-shadow:none;-webkit-text-stroke:#db2828 .78px;background-clip:text;color:transparent}.ui.orange.rating .active.icon{color:#ff851b;text-shadow:0 -1px 0 #f2711c,-1px 0 0 #f2711c,0 1px 0 #f2711c,1px 0 0 #f2711c}.ui.orange.rating .icon.selected,.ui.orange.rating .icon.selected.active,.ui.orange.rating .icon.selected.partial.active{background:inherit;color:#e76b00;text-shadow:0 -1px 0 #f26202,-1px 0 0 #f26202,0 1px 0 #f26202,1px 0 0 #f26202;-webkit-text-stroke:unset;background-clip:unset}.ui.orange.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(#ff851b),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,#ff851b 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,#ff851b 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);text-shadow:none;-webkit-text-stroke:#f2711c .78px;background-clip:text;color:transparent}.ui.yellow.rating .active.icon{color:#ffe21f;text-shadow:0 -1px 0 #fbbd08,-1px 0 0 #fbbd08,0 1px 0 #fbbd08,1px 0 0 #fbbd08}.ui.yellow.rating .icon.selected,.ui.yellow.rating .icon.selected.active,.ui.yellow.rating .icon.selected.partial.active{background:inherit;color:#ebcd00;text-shadow:0 -1px 0 #eaae00,-1px 0 0 #eaae00,0 1px 0 #eaae00,1px 0 0 #eaae00;-webkit-text-stroke:unset;background-clip:unset}.ui.yellow.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(#ffe21f),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,#ffe21f 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,#ffe21f 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);text-shadow:none;-webkit-text-stroke:#fbbd08 .78px;background-clip:text;color:transparent}.ui.olive.rating .active.icon{color:#d9e778;text-shadow:0 -1px 0 #b5cc18,-1px 0 0 #b5cc18,0 1px 0 #b5cc18,1px 0 0 #b5cc18}.ui.olive.rating .icon.selected,.ui.olive.rating .icon.selected.active,.ui.olive.rating .icon.selected.partial.active{background:inherit;color:#d2e745;text-shadow:0 -1px 0 #a7bd0d,-1px 0 0 #a7bd0d,0 1px 0 #a7bd0d,1px 0 0 #a7bd0d;-webkit-text-stroke:unset;background-clip:unset}.ui.olive.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(#d9e778),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,#d9e778 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,#d9e778 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);text-shadow:none;-webkit-text-stroke:#b5cc18 .78px;background-clip:text;color:transparent}.ui.green.rating .active.icon{color:#2ecc40;text-shadow:0 -1px 0 #21ba45,-1px 0 0 #21ba45,0 1px 0 #21ba45,1px 0 0 #21ba45}.ui.green.rating .icon.selected,.ui.green.rating .icon.selected.active,.ui.green.rating .icon.selected.partial.active{background:inherit;color:#1ea92e;text-shadow:0 -1px 0 #16ab39,-1px 0 0 #16ab39,0 1px 0 #16ab39,1px 0 0 #16ab39;-webkit-text-stroke:unset;background-clip:unset}.ui.green.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(#2ecc40),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,#2ecc40 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,#2ecc40 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);text-shadow:none;-webkit-text-stroke:#21ba45 .78px;background-clip:text;color:transparent}.ui.teal.rating .active.icon{color:#6dffff;text-shadow:0 -1px 0 #00b5ad,-1px 0 0 #00b5ad,0 1px 0 #00b5ad,1px 0 0 #00b5ad}.ui.teal.rating .icon.selected,.ui.teal.rating .icon.selected.active,.ui.teal.rating .icon.selected.partial.active{background:inherit;color:#3affff;text-shadow:0 -1px 0 #009c95,-1px 0 0 #009c95,0 1px 0 #009c95,1px 0 0 #009c95;-webkit-text-stroke:unset;background-clip:unset}.ui.teal.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(#6dffff),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,#6dffff 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,#6dffff 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);text-shadow:none;-webkit-text-stroke:#00b5ad .78px;background-clip:text;color:transparent}.ui.blue.rating .active.icon{color:#54c8ff;text-shadow:0 -1px 0 #2185d0,-1px 0 0 #2185d0,0 1px 0 #2185d0,1px 0 0 #2185d0}.ui.blue.rating .icon.selected,.ui.blue.rating .icon.selected.active,.ui.blue.rating .icon.selected.partial.active{background:inherit;color:#21b8ff;text-shadow:0 -1px 0 #1678c2,-1px 0 0 #1678c2,0 1px 0 #1678c2,1px 0 0 #1678c2;-webkit-text-stroke:unset;background-clip:unset}.ui.blue.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(#54c8ff),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,#54c8ff 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,#54c8ff 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);text-shadow:none;-webkit-text-stroke:#2185d0 .78px;background-clip:text;color:transparent}.ui.violet.rating .active.icon{color:#a291fb;text-shadow:0 -1px 0 #6435c9,-1px 0 0 #6435c9,0 1px 0 #6435c9,1px 0 0 #6435c9}.ui.violet.rating .icon.selected,.ui.violet.rating .icon.selected.active,.ui.violet.rating .icon.selected.partial.active{background:inherit;color:#745aff;text-shadow:0 -1px 0 #5829bb,-1px 0 0 #5829bb,0 1px 0 #5829bb,1px 0 0 #5829bb;-webkit-text-stroke:unset;background-clip:unset}.ui.violet.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(#a291fb),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,#a291fb 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,#a291fb 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);text-shadow:none;-webkit-text-stroke:#6435c9 .78px;background-clip:text;color:transparent}.ui.purple.rating .active.icon{color:#dc73ff;text-shadow:0 -1px 0 #a333c8,-1px 0 0 #a333c8,0 1px 0 #a333c8,1px 0 0 #a333c8}.ui.purple.rating .icon.selected,.ui.purple.rating .icon.selected.active,.ui.purple.rating .icon.selected.partial.active{background:inherit;color:#cf40ff;text-shadow:0 -1px 0 #9627ba,-1px 0 0 #9627ba,0 1px 0 #9627ba,1px 0 0 #9627ba;-webkit-text-stroke:unset;background-clip:unset}.ui.purple.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(#dc73ff),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,#dc73ff 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,#dc73ff 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);text-shadow:none;-webkit-text-stroke:#a333c8 .78px;background-clip:text;color:transparent}.ui.pink.rating .active.icon{color:#ff8edf;text-shadow:0 -1px 0 #e03997,-1px 0 0 #e03997,0 1px 0 #e03997,1px 0 0 #e03997}.ui.pink.rating .icon.selected,.ui.pink.rating .icon.selected.active,.ui.pink.rating .icon.selected.partial.active{background:inherit;color:#ff5bd1;text-shadow:0 -1px 0 #e61a8d,-1px 0 0 #e61a8d,0 1px 0 #e61a8d,1px 0 0 #e61a8d;-webkit-text-stroke:unset;background-clip:unset}.ui.pink.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(#ff8edf),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,#ff8edf 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,#ff8edf 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);text-shadow:none;-webkit-text-stroke:#e03997 .78px;background-clip:text;color:transparent}.ui.brown.rating .active.icon{color:#d67c1c;text-shadow:0 -1px 0 #a5673f,-1px 0 0 #a5673f,0 1px 0 #a5673f,1px 0 0 #a5673f}.ui.brown.rating .icon.selected,.ui.brown.rating .icon.selected.active,.ui.brown.rating .icon.selected.partial.active{background:inherit;color:#b0620f;text-shadow:0 -1px 0 #975b33,-1px 0 0 #975b33,0 1px 0 #975b33,1px 0 0 #975b33;-webkit-text-stroke:unset;background-clip:unset}.ui.brown.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(#d67c1c),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,#d67c1c 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,#d67c1c 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);text-shadow:none;-webkit-text-stroke:#a5673f .78px;background-clip:text;color:transparent}.ui.grey.rating .active.icon{color:#dcddde;text-shadow:0 -1px 0 #767676,-1px 0 0 #767676,0 1px 0 #767676,1px 0 0 #767676}.ui.grey.rating .icon.selected,.ui.grey.rating .icon.selected.active,.ui.grey.rating .icon.selected.partial.active{background:inherit;color:#c2c4c5;text-shadow:0 -1px 0 #838383,-1px 0 0 #838383,0 1px 0 #838383,1px 0 0 #838383;-webkit-text-stroke:unset;background-clip:unset}.ui.grey.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(#dcddde),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,#dcddde 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,#dcddde 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);text-shadow:none;-webkit-text-stroke:#767676 .78px;background-clip:text;color:transparent}.ui.black.rating .active.icon{color:#545454;text-shadow:0 -1px 0 #1b1c1d,-1px 0 0 #1b1c1d,0 1px 0 #1b1c1d,1px 0 0 #1b1c1d}.ui.black.rating .icon.selected,.ui.black.rating .icon.selected.active,.ui.black.rating .icon.selected.partial.active{background:inherit;color:#000;text-shadow:0 -1px 0 #27292a,-1px 0 0 #27292a,0 1px 0 #27292a,1px 0 0 #27292a;-webkit-text-stroke:unset;background-clip:unset}.ui.black.rating .icon.partial.active{background:-webkit-gradient(linear,left top,right top,from(#545454),to(rgba(0,0,0,.15)));background:-webkit-linear-gradient(left,#545454 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);background:linear-gradient(to right,#545454 0 var(--full),rgba(0,0,0,.15) var(--full) 100%);text-shadow:none;-webkit-text-stroke:#1b1c1d .78px;background-clip:text;color:transparent}.ui.disabled.rating .icon{cursor:default;pointer-events:none}.ui.rating.selected .active.icon{opacity:1}.ui.rating .icon.selected,.ui.rating.selected .icon.selected{opacity:1}.ui.rating{font-size:1rem}.ui.mini.rating{font-size:.78571429rem}.ui.tiny.rating{font-size:.85714286rem}.ui.small.rating{font-size:.92857143rem}.ui.large.rating{font-size:1.14285714rem}.ui.big.rating{font-size:1.28571429rem}.ui.huge.rating{font-size:1.42857143rem}.ui.massive.rating{font-size:2rem}
\ No newline at end of file
diff --git a/public/dist/components/rating.min.js b/public/dist/components/rating.min.js
new file mode 100644
index 000000000..b48519906
--- /dev/null
+++ b/public/dist/components/rating.min.js
@@ -0,0 +1,11 @@
+/*
+ * # Fomantic UI - 2.8.8
+ * https://github.com/fomantic/Fomantic-UI
+ * http://fomantic-ui.com/
+ *
+ * Copyright 2021 Contributors
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+!function(A,e,n,T){"use strict";A.isFunction=A.isFunction||function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},e=void 0!==e&&e.Math==Math?e:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),A.fn.rating=function(f){var v,p=A(this),b=p.selector||"",h=(new Date).getTime(),y=[],C=f,x="string"==typeof C,R=[].slice.call(arguments,1);return p.each(function(){var e,o,r=A.isPlainObject(f)?A.extend(!0,{},A.fn.rating.settings,f):A.extend({},A.fn.rating.settings),n=r.namespace,s=r.className,t=r.metadata,i=r.selector,l=r.cssVars,a="."+n,c="module-"+n,u=this,d=A(this).data(c),g=A(this),m=g.find(i.icon);o={initialize:function(){o.verbose("Initializing rating module",r),0===m.length&&o.setup.layout(),r.interactive&&!o.is.disabled()?o.enable():o.disable(),o.set.initialLoad(),o.set.rating(o.get.initialRating()),o.remove.initialLoad(),o.instantiate()},instantiate:function(){o.verbose("Instantiating module",r),d=o,g.data(c,o)},destroy:function(){o.verbose("Destroying previous instance",d),o.remove.events(),g.removeData(c)},refresh:function(){m=g.find(i.icon)},setup:{layout:function(){var e=o.get.maxRating(),n=o.get.icon(),t=A.fn.rating.settings.templates.icon(e,n);o.debug("Generating icon html dynamically"),g.html(t),o.refresh()}},event:{mouseenter:function(){var e=A(this);e.nextAll().removeClass(s.selected),g.addClass(s.selected),e.addClass(s.selected).prevAll().addClass(s.selected)},mouseleave:function(){g.removeClass(s.selected),m.removeClass(s.selected)},click:function(){var e=A(this),n=o.get.rating(),t=m.index(e)+1;("auto"==r.clearable?1===m.length:r.clearable)&&n==t?o.clearRating():o.set.rating(t)}},clearRating:function(){o.debug("Clearing current rating"),o.set.rating(0)},bind:{events:function(){o.verbose("Binding events"),g.on("mouseenter"+a,i.icon,o.event.mouseenter).on("mouseleave"+a,i.icon,o.event.mouseleave).on("click"+a,i.icon,o.event.click)}},remove:{events:function(){o.verbose("Removing events"),g.off(a)},initialLoad:function(){e=!1}},enable:function(){o.debug("Setting rating to interactive mode"),o.bind.events(),g.removeClass(s.disabled)},disable:function(){o.debug("Setting rating to read-only mode"),o.remove.events(),g.addClass(s.disabled)},is:{initialLoad:function(){return e},disabled:function(){return g.hasClass(s.disabled)}},get:{icon:function(){var e=g.data(t.icon);return e&&g.removeData(t.icon),e||r.icon},initialRating:function(){return g.data(t.rating)!==T?(g.removeData(t.rating),g.data(t.rating)):r.initialRating},maxRating:function(){return g.data(t.maxRating)!==T?(g.removeData(t.maxRating),g.data(t.maxRating)):r.maxRating},rating:function(){var e=m.filter("."+s.active).length;return o.verbose("Current rating retrieved",e),e}},set:{rating:function(e){var n=Math.floor(0<=e-1?e-1:0),t=m.eq(n),i=e<=1?t:t.next(),a=e%1*100;g.removeClass(s.selected),m.removeClass(s.selected).removeClass(s.active).removeClass(s.partiallyActive),0',t++;return i}}}}(jQuery,window,document);
\ No newline at end of file
diff --git a/public/dist/components/reset.css b/public/dist/components/reset.css
new file mode 100644
index 000000000..1f5d59bb6
--- /dev/null
+++ b/public/dist/components/reset.css
@@ -0,0 +1,390 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Reset
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+
+/*******************************
+ Reset
+*******************************/
+
+
+/* Border-Box */
+*,
+*:before,
+*:after {
+ -webkit-box-sizing: inherit;
+ box-sizing: inherit;
+}
+html {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+/* iPad Input Shadows */
+input[type="text"],
+input[type="email"],
+input[type="search"],
+input[type="password"] {
+ -webkit-appearance: none;
+ -moz-appearance: none;
+
+/* mobile firefox too! */
+}
+/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */
+
+/* Document
+ ========================================================================== */
+/**
+ * 1. Correct the line height in all browsers.
+ * 2. Prevent adjustments of font size after orientation changes in iOS.
+ */
+html {
+ line-height: 1.15;
+
+/* 1 */
+ -webkit-text-size-adjust: 100%;
+
+/* 2 */
+}
+
+/* Sections
+ ========================================================================== */
+/**
+ * Remove the margin in all browsers.
+ */
+body {
+ margin: 0;
+}
+/**
+ * Render the `main` element consistently in IE.
+ */
+main {
+ display: block;
+}
+/**
+ * Correct the font size and margin on `h1` elements within `section` and
+ * `article` contexts in Chrome, Firefox, and Safari.
+ */
+h1 {
+ font-size: 2em;
+ margin: 0.67em 0;
+}
+
+/* Grouping content
+ ========================================================================== */
+/**
+ * 1. Add the correct box sizing in Firefox.
+ * 2. Show the overflow in Edge and IE.
+ */
+hr {
+ -webkit-box-sizing: content-box;
+ box-sizing: content-box;
+
+/* 1 */
+ height: 0;
+
+/* 1 */
+ overflow: visible;
+
+/* 2 */
+}
+/**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+pre {
+ font-family: monospace, monospace;
+
+/* 1 */
+ font-size: 1em;
+
+/* 2 */
+}
+
+/* Text-level semantics
+ ========================================================================== */
+/**
+ * Remove the gray background on active links in IE 10.
+ */
+a {
+ background-color: transparent;
+}
+/**
+ * 1. Remove the bottom border in Chrome 57-
+ * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
+ */
+abbr[title] {
+ border-bottom: none;
+
+/* 1 */
+ text-decoration: underline;
+
+/* 2 */
+ text-decoration: underline dotted;
+
+/* 2 */
+}
+/**
+ * Add the correct font weight in Chrome, Edge, and Safari.
+ */
+b,
+strong {
+ font-weight: bolder;
+}
+/**
+ * 1. Correct the inheritance and scaling of font size in all browsers.
+ * 2. Correct the odd `em` font sizing in all browsers.
+ */
+code,
+kbd,
+samp {
+ font-family: monospace, monospace;
+
+/* 1 */
+ font-size: 1em;
+
+/* 2 */
+}
+/**
+ * Add the correct font size in all browsers.
+ */
+small {
+ font-size: 80%;
+}
+/**
+ * Prevent `sub` and `sup` elements from affecting the line height in
+ * all browsers.
+ */
+sub,
+sup {
+ font-size: 75%;
+ line-height: 0;
+ position: relative;
+ vertical-align: baseline;
+}
+sub {
+ bottom: -0.25em;
+}
+sup {
+ top: -0.5em;
+}
+
+/* Embedded content
+ ========================================================================== */
+/**
+ * Remove the border on images inside links in IE 10.
+ */
+img {
+ border-style: none;
+}
+
+/* Forms
+ ========================================================================== */
+/**
+ * 1. Change the font styles in all browsers.
+ * 2. Remove the margin in Firefox and Safari.
+ */
+button,
+input,
+optgroup,
+select,
+textarea {
+ font-family: inherit;
+
+/* 1 */
+ font-size: 100%;
+
+/* 1 */
+ line-height: 1.15;
+
+/* 1 */
+ margin: 0;
+
+/* 2 */
+}
+/**
+ * Show the overflow in IE.
+ * 1. Show the overflow in Edge.
+ */
+button,
+input {
+
+/* 1 */
+ overflow: visible;
+}
+/**
+ * Remove the inheritance of text transform in Edge, Firefox, and IE.
+ * 1. Remove the inheritance of text transform in Firefox.
+ */
+button,
+select {
+
+/* 1 */
+ text-transform: none;
+}
+/**
+ * Correct the inability to style clickable types in iOS and Safari.
+ */
+button,
+[type="button"],
+[type="reset"],
+[type="submit"] {
+ -webkit-appearance: button;
+}
+/**
+ * Remove the inner border and padding in Firefox.
+ */
+button::-moz-focus-inner,
+[type="button"]::-moz-focus-inner,
+[type="reset"]::-moz-focus-inner,
+[type="submit"]::-moz-focus-inner {
+ border-style: none;
+ padding: 0;
+}
+/**
+ * Restore the focus styles unset by the previous rule.
+ */
+button:-moz-focusring,
+[type="button"]:-moz-focusring,
+[type="reset"]:-moz-focusring,
+[type="submit"]:-moz-focusring {
+ outline: 1px dotted ButtonText;
+}
+/**
+ * Correct the padding in Firefox.
+ */
+fieldset {
+ padding: 0.35em 0.75em 0.625em;
+}
+/**
+ * 1. Correct the text wrapping in Edge and IE.
+ * 2. Correct the color inheritance from `fieldset` elements in IE.
+ * 3. Remove the padding so developers are not caught out when they zero out
+ * `fieldset` elements in all browsers.
+ */
+legend {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+
+/* 1 */
+ color: inherit;
+
+/* 2 */
+ display: table;
+
+/* 1 */
+ max-width: 100%;
+
+/* 1 */
+ padding: 0;
+
+/* 3 */
+ white-space: normal;
+
+/* 1 */
+}
+/**
+ * Add the correct vertical alignment in Chrome, Firefox, and Opera.
+ */
+progress {
+ vertical-align: baseline;
+}
+/**
+ * Remove the default vertical scrollbar in IE 10+.
+ */
+textarea {
+ overflow: auto;
+}
+/**
+ * 1. Add the correct box sizing in IE 10.
+ * 2. Remove the padding in IE 10.
+ */
+[type="checkbox"],
+[type="radio"] {
+ -webkit-box-sizing: border-box;
+ box-sizing: border-box;
+
+/* 1 */
+ padding: 0;
+
+/* 2 */
+}
+/**
+ * Correct the cursor style of increment and decrement buttons in Chrome.
+ */
+[type="number"]::-webkit-inner-spin-button,
+[type="number"]::-webkit-outer-spin-button {
+ height: auto;
+}
+/**
+ * 1. Correct the odd appearance in Chrome and Safari.
+ * 2. Correct the outline style in Safari.
+ */
+[type="search"] {
+ -webkit-appearance: textfield;
+
+/* 1 */
+ outline-offset: -2px;
+
+/* 2 */
+}
+/**
+ * Remove the inner padding in Chrome and Safari on macOS.
+ */
+[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+/**
+ * 1. Correct the inability to style clickable types in iOS and Safari.
+ * 2. Change font properties to `inherit` in Safari.
+ */
+::-webkit-file-upload-button {
+ -webkit-appearance: button;
+
+/* 1 */
+ font: inherit;
+
+/* 2 */
+}
+
+/* Interactive
+ ========================================================================== */
+/*
+ * Add the correct display in Edge, IE 10+, and Firefox.
+ */
+details {
+ display: block;
+}
+/*
+ * Add the correct display in all browsers.
+ */
+summary {
+ display: list-item;
+}
+
+/* Misc
+ ========================================================================== */
+/**
+ * Add the correct display in IE 10+.
+ */
+template {
+ display: none;
+}
+/**
+ * Add the correct display in IE 10.
+ */
+[hidden] {
+ display: none;
+}
+
+
+/*******************************
+ Site Overrides
+*******************************/
+
diff --git a/public/dist/components/reset.min.css b/public/dist/components/reset.min.css
new file mode 100644
index 000000000..3215f0d34
--- /dev/null
+++ b/public/dist/components/reset.min.css
@@ -0,0 +1,9 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Reset
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */*,:after,:before{-webkit-box-sizing:inherit;box-sizing:inherit}html{-webkit-box-sizing:border-box;box-sizing:border-box}input[type=email],input[type=password],input[type=search],input[type=text]{-webkit-appearance:none;-moz-appearance:none}/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}template{display:none}[hidden]{display:none}
\ No newline at end of file
diff --git a/public/dist/components/reveal.css b/public/dist/components/reveal.css
new file mode 100644
index 000000000..801bb1237
--- /dev/null
+++ b/public/dist/components/reveal.css
@@ -0,0 +1,316 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Reveal
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+
+/*******************************
+ Reveal
+*******************************/
+
+.ui.reveal {
+ display: inherit;
+ position: relative !important;
+ font-size: 0;
+}
+.ui.reveal > .visible.content {
+ position: absolute !important;
+ top: 0 !important;
+ left: 0 !important;
+ z-index: 3 !important;
+ -webkit-transition: all 0.5s ease 0.1s;
+ transition: all 0.5s ease 0.1s;
+}
+.ui.reveal > .hidden.content {
+ position: relative !important;
+ z-index: 2 !important;
+}
+
+/* Make sure hovered element is on top of other reveal */
+.ui.active.reveal .visible.content,
+.ui.reveal:hover .visible.content {
+ z-index: 4 !important;
+}
+
+
+/*******************************
+ Types
+*******************************/
+
+
+/*--------------
+ Slide
+ ---------------*/
+
+.ui.slide.reveal {
+ position: relative !important;
+ overflow: hidden !important;
+ white-space: nowrap;
+}
+.ui.slide.reveal > .content {
+ display: block;
+ width: 100%;
+ white-space: normal;
+ float: left;
+ margin: 0;
+ -webkit-transition: -webkit-transform 0.5s ease 0.1s;
+ transition: -webkit-transform 0.5s ease 0.1s;
+ transition: transform 0.5s ease 0.1s;
+ transition: transform 0.5s ease 0.1s, -webkit-transform 0.5s ease 0.1s;
+}
+.ui.slide.reveal > .visible.content {
+ position: relative !important;
+}
+.ui.slide.reveal > .hidden.content {
+ position: absolute !important;
+ left: 0 !important;
+ width: 100% !important;
+ -webkit-transform: translateX(100%) !important;
+ transform: translateX(100%) !important;
+}
+.ui.slide.active.reveal > .visible.content,
+.ui.slide.reveal:hover > .visible.content {
+ -webkit-transform: translateX(-100%) !important;
+ transform: translateX(-100%) !important;
+}
+.ui.slide.active.reveal > .hidden.content,
+.ui.slide.reveal:hover > .hidden.content {
+ -webkit-transform: translateX(0%) !important;
+ transform: translateX(0%) !important;
+}
+.ui.slide.right.reveal > .visible.content {
+ -webkit-transform: translateX(0%) !important;
+ transform: translateX(0%) !important;
+}
+.ui.slide.right.reveal > .hidden.content {
+ -webkit-transform: translateX(-100%) !important;
+ transform: translateX(-100%) !important;
+}
+.ui.slide.right.active.reveal > .visible.content,
+.ui.slide.right.reveal:hover > .visible.content {
+ -webkit-transform: translateX(100%) !important;
+ transform: translateX(100%) !important;
+}
+.ui.slide.right.active.reveal > .hidden.content,
+.ui.slide.right.reveal:hover > .hidden.content {
+ -webkit-transform: translateX(0%) !important;
+ transform: translateX(0%) !important;
+}
+.ui.slide.up.reveal > .hidden.content {
+ -webkit-transform: translateY(100%) !important;
+ transform: translateY(100%) !important;
+}
+.ui.slide.up.active.reveal > .visible.content,
+.ui.slide.up.reveal:hover > .visible.content {
+ -webkit-transform: translateY(-100%) !important;
+ transform: translateY(-100%) !important;
+}
+.ui.slide.up.active.reveal > .hidden.content,
+.ui.slide.up.reveal:hover > .hidden.content {
+ -webkit-transform: translateY(0%) !important;
+ transform: translateY(0%) !important;
+}
+.ui.slide.down.reveal > .hidden.content {
+ -webkit-transform: translateY(-100%) !important;
+ transform: translateY(-100%) !important;
+}
+.ui.slide.down.active.reveal > .visible.content,
+.ui.slide.down.reveal:hover > .visible.content {
+ -webkit-transform: translateY(100%) !important;
+ transform: translateY(100%) !important;
+}
+.ui.slide.down.active.reveal > .hidden.content,
+.ui.slide.down.reveal:hover > .hidden.content {
+ -webkit-transform: translateY(0%) !important;
+ transform: translateY(0%) !important;
+}
+
+/*--------------
+ Fade
+ ---------------*/
+
+.ui.fade.reveal > .visible.content {
+ opacity: 1;
+}
+.ui.fade.active.reveal > .visible.content,
+.ui.fade.reveal:hover > .visible.content {
+ opacity: 0;
+}
+
+/*--------------
+ Move
+ ---------------*/
+
+.ui.move.reveal {
+ position: relative !important;
+ overflow: hidden !important;
+ white-space: nowrap;
+}
+.ui.move.reveal > .content {
+ display: block;
+ float: left;
+ white-space: normal;
+ margin: 0;
+ -webkit-transition: -webkit-transform 0.5s cubic-bezier(0.175, 0.885, 0.32, 1) 0.1s;
+ transition: -webkit-transform 0.5s cubic-bezier(0.175, 0.885, 0.32, 1) 0.1s;
+ transition: transform 0.5s cubic-bezier(0.175, 0.885, 0.32, 1) 0.1s;
+ transition: transform 0.5s cubic-bezier(0.175, 0.885, 0.32, 1) 0.1s, -webkit-transform 0.5s cubic-bezier(0.175, 0.885, 0.32, 1) 0.1s;
+}
+.ui.move.reveal > .visible.content {
+ position: relative !important;
+}
+.ui.move.reveal > .hidden.content {
+ position: absolute !important;
+ left: 0 !important;
+ width: 100% !important;
+}
+.ui.move.active.reveal > .visible.content,
+.ui.move.reveal:hover > .visible.content {
+ -webkit-transform: translateX(-100%) !important;
+ transform: translateX(-100%) !important;
+}
+.ui.move.right.active.reveal > .visible.content,
+.ui.move.right.reveal:hover > .visible.content {
+ -webkit-transform: translateX(100%) !important;
+ transform: translateX(100%) !important;
+}
+.ui.move.up.active.reveal > .visible.content,
+.ui.move.up.reveal:hover > .visible.content {
+ -webkit-transform: translateY(-100%) !important;
+ transform: translateY(-100%) !important;
+}
+.ui.move.down.active.reveal > .visible.content,
+.ui.move.down.reveal:hover > .visible.content {
+ -webkit-transform: translateY(100%) !important;
+ transform: translateY(100%) !important;
+}
+
+/*--------------
+ Rotate
+ ---------------*/
+
+.ui.rotate.reveal > .visible.content {
+ -webkit-transition-duration: 0.5s;
+ transition-duration: 0.5s;
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+}
+.ui.rotate.reveal > .visible.content,
+.ui.rotate.right.reveal > .visible.content {
+ -webkit-transform-origin: bottom right;
+ transform-origin: bottom right;
+}
+.ui.rotate.active.reveal > .visible.content,
+.ui.rotate.reveal:hover > .visible.content,
+.ui.rotate.right.active.reveal > .visible.content,
+.ui.rotate.right.reveal:hover > .visible.content {
+ -webkit-transform: rotate(110deg);
+ transform: rotate(110deg);
+}
+.ui.rotate.left.reveal > .visible.content {
+ -webkit-transform-origin: bottom left;
+ transform-origin: bottom left;
+}
+.ui.rotate.left.active.reveal > .visible.content,
+.ui.rotate.left.reveal:hover > .visible.content {
+ -webkit-transform: rotate(-110deg);
+ transform: rotate(-110deg);
+}
+
+
+/*******************************
+ States
+*******************************/
+
+.ui.disabled.reveal:hover > .visible.visible.content {
+ position: static !important;
+ display: block !important;
+ opacity: 1 !important;
+ top: 0 !important;
+ left: 0 !important;
+ right: auto !important;
+ bottom: auto !important;
+ -webkit-transform: none !important;
+ transform: none !important;
+}
+.ui.disabled.reveal:hover > .hidden.hidden.content {
+ display: none !important;
+}
+
+
+/*******************************
+ Coupling
+*******************************/
+
+.ui.reveal > .ui.ribbon.label {
+ z-index: 5;
+}
+
+
+/*******************************
+ Variations
+*******************************/
+
+
+/*--------------
+ Visible
+---------------*/
+
+.ui.visible.reveal {
+ overflow: visible;
+}
+
+/*--------------
+ Instant
+---------------*/
+
+.ui.instant.reveal > .content {
+ -webkit-transition-delay: 0s !important;
+ transition-delay: 0s !important;
+}
+
+/*--------------
+ Sizing
+---------------*/
+
+.ui.reveal > .content {
+ font-size: 1rem;
+}
+.ui.mini.reveal > .content {
+ font-size: 0.78571429rem;
+}
+.ui.tiny.reveal > .content {
+ font-size: 0.85714286rem;
+}
+.ui.small.reveal > .content {
+ font-size: 0.92857143rem;
+}
+.ui.large.reveal > .content {
+ font-size: 1.14285714rem;
+}
+.ui.big.reveal > .content {
+ font-size: 1.28571429rem;
+}
+.ui.huge.reveal > .content {
+ font-size: 1.42857143rem;
+}
+.ui.massive.reveal > .content {
+ font-size: 1.71428571rem;
+}
+
+
+/*******************************
+ Theme Overrides
+*******************************/
+
+
+
+/*******************************
+ Site Overrides
+*******************************/
+
diff --git a/public/dist/components/reveal.min.css b/public/dist/components/reveal.min.css
new file mode 100644
index 000000000..a8b141769
--- /dev/null
+++ b/public/dist/components/reveal.min.css
@@ -0,0 +1,9 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Reveal
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */.ui.reveal{display:inherit;position:relative!important;font-size:0}.ui.reveal>.visible.content{position:absolute!important;top:0!important;left:0!important;z-index:3!important;-webkit-transition:all .5s ease .1s;transition:all .5s ease .1s}.ui.reveal>.hidden.content{position:relative!important;z-index:2!important}.ui.active.reveal .visible.content,.ui.reveal:hover .visible.content{z-index:4!important}.ui.slide.reveal{position:relative!important;overflow:hidden!important;white-space:nowrap}.ui.slide.reveal>.content{display:block;width:100%;white-space:normal;float:left;margin:0;-webkit-transition:-webkit-transform .5s ease .1s;transition:-webkit-transform .5s ease .1s;transition:transform .5s ease .1s;transition:transform .5s ease .1s,-webkit-transform .5s ease .1s}.ui.slide.reveal>.visible.content{position:relative!important}.ui.slide.reveal>.hidden.content{position:absolute!important;left:0!important;width:100%!important;-webkit-transform:translateX(100%)!important;transform:translateX(100%)!important}.ui.slide.active.reveal>.visible.content,.ui.slide.reveal:hover>.visible.content{-webkit-transform:translateX(-100%)!important;transform:translateX(-100%)!important}.ui.slide.active.reveal>.hidden.content,.ui.slide.reveal:hover>.hidden.content{-webkit-transform:translateX(0)!important;transform:translateX(0)!important}.ui.slide.right.reveal>.visible.content{-webkit-transform:translateX(0)!important;transform:translateX(0)!important}.ui.slide.right.reveal>.hidden.content{-webkit-transform:translateX(-100%)!important;transform:translateX(-100%)!important}.ui.slide.right.active.reveal>.visible.content,.ui.slide.right.reveal:hover>.visible.content{-webkit-transform:translateX(100%)!important;transform:translateX(100%)!important}.ui.slide.right.active.reveal>.hidden.content,.ui.slide.right.reveal:hover>.hidden.content{-webkit-transform:translateX(0)!important;transform:translateX(0)!important}.ui.slide.up.reveal>.hidden.content{-webkit-transform:translateY(100%)!important;transform:translateY(100%)!important}.ui.slide.up.active.reveal>.visible.content,.ui.slide.up.reveal:hover>.visible.content{-webkit-transform:translateY(-100%)!important;transform:translateY(-100%)!important}.ui.slide.up.active.reveal>.hidden.content,.ui.slide.up.reveal:hover>.hidden.content{-webkit-transform:translateY(0)!important;transform:translateY(0)!important}.ui.slide.down.reveal>.hidden.content{-webkit-transform:translateY(-100%)!important;transform:translateY(-100%)!important}.ui.slide.down.active.reveal>.visible.content,.ui.slide.down.reveal:hover>.visible.content{-webkit-transform:translateY(100%)!important;transform:translateY(100%)!important}.ui.slide.down.active.reveal>.hidden.content,.ui.slide.down.reveal:hover>.hidden.content{-webkit-transform:translateY(0)!important;transform:translateY(0)!important}.ui.fade.reveal>.visible.content{opacity:1}.ui.fade.active.reveal>.visible.content,.ui.fade.reveal:hover>.visible.content{opacity:0}.ui.move.reveal{position:relative!important;overflow:hidden!important;white-space:nowrap}.ui.move.reveal>.content{display:block;float:left;white-space:normal;margin:0;-webkit-transition:-webkit-transform .5s cubic-bezier(.175,.885,.32,1) .1s;transition:-webkit-transform .5s cubic-bezier(.175,.885,.32,1) .1s;transition:transform .5s cubic-bezier(.175,.885,.32,1) .1s;transition:transform .5s cubic-bezier(.175,.885,.32,1) .1s,-webkit-transform .5s cubic-bezier(.175,.885,.32,1) .1s}.ui.move.reveal>.visible.content{position:relative!important}.ui.move.reveal>.hidden.content{position:absolute!important;left:0!important;width:100%!important}.ui.move.active.reveal>.visible.content,.ui.move.reveal:hover>.visible.content{-webkit-transform:translateX(-100%)!important;transform:translateX(-100%)!important}.ui.move.right.active.reveal>.visible.content,.ui.move.right.reveal:hover>.visible.content{-webkit-transform:translateX(100%)!important;transform:translateX(100%)!important}.ui.move.up.active.reveal>.visible.content,.ui.move.up.reveal:hover>.visible.content{-webkit-transform:translateY(-100%)!important;transform:translateY(-100%)!important}.ui.move.down.active.reveal>.visible.content,.ui.move.down.reveal:hover>.visible.content{-webkit-transform:translateY(100%)!important;transform:translateY(100%)!important}.ui.rotate.reveal>.visible.content{-webkit-transition-duration:.5s;transition-duration:.5s;-webkit-transform:rotate(0);transform:rotate(0)}.ui.rotate.reveal>.visible.content,.ui.rotate.right.reveal>.visible.content{-webkit-transform-origin:bottom right;transform-origin:bottom right}.ui.rotate.active.reveal>.visible.content,.ui.rotate.reveal:hover>.visible.content,.ui.rotate.right.active.reveal>.visible.content,.ui.rotate.right.reveal:hover>.visible.content{-webkit-transform:rotate(110deg);transform:rotate(110deg)}.ui.rotate.left.reveal>.visible.content{-webkit-transform-origin:bottom left;transform-origin:bottom left}.ui.rotate.left.active.reveal>.visible.content,.ui.rotate.left.reveal:hover>.visible.content{-webkit-transform:rotate(-110deg);transform:rotate(-110deg)}.ui.disabled.reveal:hover>.visible.visible.content{position:static!important;display:block!important;opacity:1!important;top:0!important;left:0!important;right:auto!important;bottom:auto!important;-webkit-transform:none!important;transform:none!important}.ui.disabled.reveal:hover>.hidden.hidden.content{display:none!important}.ui.reveal>.ui.ribbon.label{z-index:5}.ui.visible.reveal{overflow:visible}.ui.instant.reveal>.content{-webkit-transition-delay:0s!important;transition-delay:0s!important}.ui.reveal>.content{font-size:1rem}.ui.mini.reveal>.content{font-size:.78571429rem}.ui.tiny.reveal>.content{font-size:.85714286rem}.ui.small.reveal>.content{font-size:.92857143rem}.ui.large.reveal>.content{font-size:1.14285714rem}.ui.big.reveal>.content{font-size:1.28571429rem}.ui.huge.reveal>.content{font-size:1.42857143rem}.ui.massive.reveal>.content{font-size:1.71428571rem}
\ No newline at end of file
diff --git a/public/dist/components/search.css b/public/dist/components/search.css
new file mode 100644
index 000000000..8a89b4e78
--- /dev/null
+++ b/public/dist/components/search.css
@@ -0,0 +1,534 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Search
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+
+/*******************************
+ Search
+*******************************/
+
+.ui.search {
+ position: relative;
+}
+.ui.search > .prompt {
+ margin: 0;
+ outline: none;
+ -webkit-appearance: none;
+ -webkit-tap-highlight-color: rgba(255, 255, 255, 0);
+ text-shadow: none;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1.21428571em;
+ padding: 0.67857143em 1em;
+ font-size: 1em;
+ background: #FFFFFF;
+ border: 1px solid rgba(34, 36, 38, 0.15);
+ color: rgba(0, 0, 0, 0.87);
+ -webkit-box-shadow: 0 0 0 0 transparent inset;
+ box-shadow: 0 0 0 0 transparent inset;
+ -webkit-transition: background-color 0.1s ease, color 0.1s ease, border-color 0.1s ease, -webkit-box-shadow 0.1s ease;
+ transition: background-color 0.1s ease, color 0.1s ease, border-color 0.1s ease, -webkit-box-shadow 0.1s ease;
+ transition: background-color 0.1s ease, color 0.1s ease, box-shadow 0.1s ease, border-color 0.1s ease;
+ transition: background-color 0.1s ease, color 0.1s ease, box-shadow 0.1s ease, border-color 0.1s ease, -webkit-box-shadow 0.1s ease;
+}
+.ui.search .prompt {
+ border-radius: 500rem;
+}
+
+/*--------------
+ Icon
+---------------*/
+
+.ui.search .prompt ~ .search.icon {
+ cursor: pointer;
+}
+
+/*--------------
+ Results
+---------------*/
+
+.ui.search > .results {
+ display: none;
+ position: absolute;
+ top: 100%;
+ left: 0;
+ -webkit-transform-origin: center top;
+ transform-origin: center top;
+ white-space: normal;
+ text-align: left;
+ text-transform: none;
+ background: #FFFFFF;
+ margin-top: 0.5em;
+ width: 18em;
+ border-radius: 0.28571429rem;
+ -webkit-box-shadow: 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15);
+ box-shadow: 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15);
+ border: 1px solid #D4D4D5;
+ z-index: 998;
+}
+.ui.search > .results > :first-child {
+ border-radius: 0.28571429rem 0.28571429rem 0 0;
+}
+.ui.search > .results > :last-child {
+ border-radius: 0 0 0.28571429rem 0.28571429rem;
+}
+
+/*--------------
+ Result
+---------------*/
+
+.ui.search > .results .result {
+ cursor: pointer;
+ display: block;
+ overflow: hidden;
+ font-size: 1em;
+ padding: 0.85714286em 1.14285714em;
+ color: rgba(0, 0, 0, 0.87);
+ line-height: 1.33;
+ border-bottom: 1px solid rgba(34, 36, 38, 0.1);
+}
+.ui.search > .results .result:last-child {
+ border-bottom: none !important;
+}
+
+/* Image */
+.ui.search > .results .result .image {
+ float: right;
+ overflow: hidden;
+ background: none;
+ width: 5em;
+ height: 3em;
+ border-radius: 0.25em;
+}
+.ui.search > .results .result .image img {
+ display: block;
+ width: auto;
+ height: 100%;
+}
+
+/*--------------
+ Info
+---------------*/
+
+.ui.search > .results .result .image + .content {
+ margin: 0 6em 0 0;
+}
+.ui.search > .results .result .title {
+ margin: -0.14285714em 0 0;
+ font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
+ font-weight: bold;
+ font-size: 1em;
+ color: rgba(0, 0, 0, 0.85);
+}
+.ui.search > .results .result .description {
+ margin-top: 0;
+ font-size: 0.92857143em;
+ color: rgba(0, 0, 0, 0.4);
+}
+.ui.search > .results .result .price {
+ float: right;
+ color: #21BA45;
+}
+
+/*--------------
+ Message
+---------------*/
+
+.ui.search > .results > .message {
+ padding: 1em 1em;
+}
+.ui.search > .results > .message .header {
+ font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
+ font-size: 1rem;
+ font-weight: bold;
+ color: rgba(0, 0, 0, 0.87);
+}
+.ui.search > .results > .message .description {
+ margin-top: 0.25rem;
+ font-size: 1em;
+ color: rgba(0, 0, 0, 0.87);
+}
+
+/* View All Results */
+.ui.search > .results > .action {
+ display: block;
+ border-top: none;
+ background: #F3F4F5;
+ padding: 0.92857143em 1em;
+ color: rgba(0, 0, 0, 0.87);
+ font-weight: bold;
+ text-align: center;
+}
+
+
+/*******************************
+ States
+*******************************/
+
+
+/*--------------------
+ Focus
+---------------------*/
+
+.ui.search > .prompt:focus {
+ border-color: rgba(34, 36, 38, 0.35);
+ background: #FFFFFF;
+ color: rgba(0, 0, 0, 0.95);
+}
+
+/*--------------------
+ Loading
+ ---------------------*/
+
+.ui.loading.search .input > i.icon:before {
+ position: absolute;
+ content: '';
+ top: 50%;
+ left: 50%;
+ margin: -0.64285714em 0 0 -0.64285714em;
+ width: 1.28571429em;
+ height: 1.28571429em;
+ border-radius: 500rem;
+ border: 0.2em solid rgba(0, 0, 0, 0.1);
+}
+.ui.loading.search .input > i.icon:after {
+ position: absolute;
+ content: '';
+ top: 50%;
+ left: 50%;
+ margin: -0.64285714em 0 0 -0.64285714em;
+ width: 1.28571429em;
+ height: 1.28571429em;
+ -webkit-animation: loader 0.6s infinite linear;
+ animation: loader 0.6s infinite linear;
+ border: 0.2em solid #767676;
+ border-radius: 500rem;
+ -webkit-box-shadow: 0 0 0 1px transparent;
+ box-shadow: 0 0 0 1px transparent;
+}
+
+/*--------------
+ Hover
+---------------*/
+
+.ui.search > .results .result:hover,
+.ui.category.search > .results .category .result:hover {
+ background: #F9FAFB;
+}
+.ui.search .action:hover:not(div) {
+ background: #E0E0E0;
+}
+
+/*--------------
+ Active
+---------------*/
+
+.ui.category.search > .results .category.active {
+ background: #F3F4F5;
+}
+.ui.category.search > .results .category.active > .name {
+ color: rgba(0, 0, 0, 0.87);
+}
+.ui.search > .results .result.active,
+.ui.category.search > .results .category .result.active {
+ position: relative;
+ border-left-color: rgba(34, 36, 38, 0.1);
+ background: #F3F4F5;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
+.ui.search > .results .result.active .title {
+ color: rgba(0, 0, 0, 0.85);
+}
+.ui.search > .results .result.active .description {
+ color: rgba(0, 0, 0, 0.85);
+}
+
+/*--------------------
+ Disabled
+ ----------------------*/
+
+
+/* Disabled */
+.ui.disabled.search {
+ cursor: default;
+ pointer-events: none;
+ opacity: 0.45;
+}
+
+
+/*******************************
+ Types
+*******************************/
+
+
+/*--------------
+ Selection
+ ---------------*/
+
+.ui.search.selection .prompt {
+ border-radius: 0.28571429rem;
+}
+
+/* Remove input */
+.ui.search.selection > .icon.input > .remove.icon {
+ pointer-events: none;
+ position: absolute;
+ left: auto;
+ opacity: 0;
+ color: '';
+ top: 0;
+ right: 0;
+ -webkit-transition: color 0.1s ease, opacity 0.1s ease;
+ transition: color 0.1s ease, opacity 0.1s ease;
+}
+.ui.search.selection > .icon.input > .active.remove.icon {
+ cursor: pointer;
+ opacity: 0.8;
+ pointer-events: auto;
+}
+.ui.search.selection > .icon.input:not([class*="left icon"]) > .icon ~ .remove.icon {
+ right: 1.85714em;
+}
+.ui.search.selection > .icon.input > .remove.icon:hover {
+ opacity: 1;
+ color: #DB2828;
+}
+
+/*--------------
+ Category
+ ---------------*/
+
+.ui.category.search .results {
+ width: 28em;
+}
+.ui.category.search .results.animating,
+.ui.category.search .results.visible {
+ display: table;
+}
+
+/* Category */
+.ui.category.search > .results .category {
+ display: table-row;
+ background: #F3F4F5;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ -webkit-transition: background 0.1s ease, border-color 0.1s ease;
+ transition: background 0.1s ease, border-color 0.1s ease;
+}
+
+/* Last Category */
+.ui.category.search > .results .category:last-child {
+ border-bottom: none;
+}
+
+/* First / Last */
+.ui.category.search > .results .category:first-child .name + .result {
+ border-radius: 0 0.28571429rem 0 0;
+}
+.ui.category.search > .results .category:last-child .result:last-child {
+ border-radius: 0 0 0.28571429rem 0;
+}
+
+/* Category Result Name */
+.ui.category.search > .results .category > .name {
+ display: table-cell;
+ text-overflow: ellipsis;
+ width: 100px;
+ white-space: nowrap;
+ background: transparent;
+ font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
+ font-size: 1em;
+ padding: 0.4em 1em;
+ font-weight: bold;
+ color: rgba(0, 0, 0, 0.4);
+ border-bottom: 1px solid rgba(34, 36, 38, 0.1);
+}
+
+/* Category Result */
+.ui.category.search > .results .category .results {
+ display: table-cell;
+ background: #FFFFFF;
+ border-left: 1px solid rgba(34, 36, 38, 0.15);
+ border-bottom: 1px solid rgba(34, 36, 38, 0.1);
+}
+.ui.category.search > .results .category .result {
+ border-bottom: 1px solid rgba(34, 36, 38, 0.1);
+ -webkit-transition: background 0.1s ease, border-color 0.1s ease;
+ transition: background 0.1s ease, border-color 0.1s ease;
+ padding: 0.85714286em 1.14285714em;
+}
+
+
+/*******************************
+ Variations
+*******************************/
+
+
+/*-------------------
+ Scrolling
+ --------------------*/
+
+.ui.scrolling.search > .results,
+.ui.search.long > .results,
+.ui.search.short > .results {
+ overflow-x: hidden;
+ overflow-y: auto;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ -webkit-overflow-scrolling: touch;
+}
+@media only screen and (max-width: 767.98px) {
+ .ui.scrolling.search > .results {
+ max-height: 12.17714286em;
+ }
+}
+@media only screen and (min-width: 768px) {
+ .ui.scrolling.search > .results {
+ max-height: 18.26571429em;
+ }
+}
+@media only screen and (min-width: 992px) {
+ .ui.scrolling.search > .results {
+ max-height: 24.35428571em;
+ }
+}
+@media only screen and (min-width: 1920px) {
+ .ui.scrolling.search > .results {
+ max-height: 36.53142857em;
+ }
+}
+@media only screen and (max-width: 767.98px) {
+ .ui.search.short > .results {
+ max-height: 12.17714286em;
+ }
+ .ui.search[class*="very short"] > .results {
+ max-height: 9.13285714em;
+ }
+ .ui.search.long > .results {
+ max-height: 24.35428571em;
+ }
+ .ui.search[class*="very long"] > .results {
+ max-height: 36.53142857em;
+ }
+}
+@media only screen and (min-width: 768px) {
+ .ui.search.short > .results {
+ max-height: 18.26571429em;
+ }
+ .ui.search[class*="very short"] > .results {
+ max-height: 13.69928571em;
+ }
+ .ui.search.long > .results {
+ max-height: 36.53142857em;
+ }
+ .ui.search[class*="very long"] > .results {
+ max-height: 54.79714286em;
+ }
+}
+@media only screen and (min-width: 992px) {
+ .ui.search.short > .results {
+ max-height: 24.35428571em;
+ }
+ .ui.search[class*="very short"] > .results {
+ max-height: 18.26571429em;
+ }
+ .ui.search.long > .results {
+ max-height: 48.70857143em;
+ }
+ .ui.search[class*="very long"] > .results {
+ max-height: 73.06285714em;
+ }
+}
+@media only screen and (min-width: 1920px) {
+ .ui.search.short > .results {
+ max-height: 36.53142857em;
+ }
+ .ui.search[class*="very short"] > .results {
+ max-height: 27.39857143em;
+ }
+ .ui.search.long > .results {
+ max-height: 73.06285714em;
+ }
+ .ui.search[class*="very long"] > .results {
+ max-height: 109.59428571em;
+ }
+}
+
+/*-------------------
+ Left / Right
+ --------------------*/
+
+.ui[class*="left aligned"].search > .results {
+ right: auto;
+ left: 0;
+}
+.ui[class*="right aligned"].search > .results {
+ right: 0;
+ left: auto;
+}
+
+/*--------------
+ Fluid
+---------------*/
+
+.ui.fluid.search .results {
+ width: 100%;
+}
+
+/*--------------
+ Sizes
+---------------*/
+
+.ui.search {
+ font-size: 1em;
+}
+.ui.mini.search {
+ font-size: 0.78571429em;
+}
+.ui.tiny.search {
+ font-size: 0.85714286em;
+}
+.ui.small.search {
+ font-size: 0.92857143em;
+}
+.ui.large.search {
+ font-size: 1.14285714em;
+}
+.ui.big.search {
+ font-size: 1.28571429em;
+}
+.ui.huge.search {
+ font-size: 1.42857143em;
+}
+.ui.massive.search {
+ font-size: 1.71428571em;
+}
+
+/*--------------
+ Mobile
+---------------*/
+
+@media only screen and (max-width: 767.98px) {
+ .ui.search .results {
+ max-width: calc(100vw - 2rem);
+ }
+}
+
+
+/*******************************
+ Theme Overrides
+*******************************/
+
+
+
+/*******************************
+ Site Overrides
+*******************************/
+
diff --git a/public/dist/components/search.js b/public/dist/components/search.js
new file mode 100644
index 000000000..5bcca8e39
--- /dev/null
+++ b/public/dist/components/search.js
@@ -0,0 +1,1567 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Search
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+'use strict';
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.search = function(parameters) {
+ var
+ $allModules = $(this),
+ moduleSelector = $allModules.selector || '',
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+ returnedValue
+ ;
+ $(this)
+ .each(function() {
+ var
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.fn.search.settings, parameters)
+ : $.extend({}, $.fn.search.settings),
+
+ className = settings.className,
+ metadata = settings.metadata,
+ regExp = settings.regExp,
+ fields = settings.fields,
+ selector = settings.selector,
+ error = settings.error,
+ namespace = settings.namespace,
+
+ eventNamespace = '.' + namespace,
+ moduleNamespace = namespace + '-module',
+
+ $module = $(this),
+ $prompt = $module.find(selector.prompt),
+ $searchButton = $module.find(selector.searchButton),
+ $results = $module.find(selector.results),
+ $result = $module.find(selector.result),
+ $category = $module.find(selector.category),
+
+ element = this,
+ instance = $module.data(moduleNamespace),
+
+ disabledBubbled = false,
+ resultsDismissed = false,
+
+ module
+ ;
+
+ module = {
+
+ initialize: function() {
+ module.verbose('Initializing module');
+ module.get.settings();
+ module.determine.searchFields();
+ module.bind.events();
+ module.set.type();
+ module.create.results();
+ module.instantiate();
+ },
+ instantiate: function() {
+ module.verbose('Storing instance of module', module);
+ instance = module;
+ $module
+ .data(moduleNamespace, module)
+ ;
+ },
+ destroy: function() {
+ module.verbose('Destroying instance');
+ $module
+ .off(eventNamespace)
+ .removeData(moduleNamespace)
+ ;
+ },
+
+ refresh: function() {
+ module.debug('Refreshing selector cache');
+ $prompt = $module.find(selector.prompt);
+ $searchButton = $module.find(selector.searchButton);
+ $category = $module.find(selector.category);
+ $results = $module.find(selector.results);
+ $result = $module.find(selector.result);
+ },
+
+ refreshResults: function() {
+ $results = $module.find(selector.results);
+ $result = $module.find(selector.result);
+ },
+
+ bind: {
+ events: function() {
+ module.verbose('Binding events to search');
+ if(settings.automatic) {
+ $module
+ .on(module.get.inputEvent() + eventNamespace, selector.prompt, module.event.input)
+ ;
+ $prompt
+ .attr('autocomplete', module.is.chrome() ? 'fomantic-search' : 'off')
+ ;
+ }
+ $module
+ // prompt
+ .on('focus' + eventNamespace, selector.prompt, module.event.focus)
+ .on('blur' + eventNamespace, selector.prompt, module.event.blur)
+ .on('keydown' + eventNamespace, selector.prompt, module.handleKeyboard)
+ // search button
+ .on('click' + eventNamespace, selector.searchButton, module.query)
+ // results
+ .on('mousedown' + eventNamespace, selector.results, module.event.result.mousedown)
+ .on('mouseup' + eventNamespace, selector.results, module.event.result.mouseup)
+ .on('click' + eventNamespace, selector.result, module.event.result.click)
+ ;
+ }
+ },
+
+ determine: {
+ searchFields: function() {
+ // this makes sure $.extend does not add specified search fields to default fields
+ // this is the only setting which should not extend defaults
+ if(parameters && parameters.searchFields !== undefined) {
+ settings.searchFields = parameters.searchFields;
+ }
+ }
+ },
+
+ event: {
+ input: function() {
+ if(settings.searchDelay) {
+ clearTimeout(module.timer);
+ module.timer = setTimeout(function() {
+ if(module.is.focused()) {
+ module.query();
+ }
+ }, settings.searchDelay);
+ }
+ else {
+ module.query();
+ }
+ },
+ focus: function() {
+ module.set.focus();
+ if(settings.searchOnFocus && module.has.minimumCharacters() ) {
+ module.query(function() {
+ if(module.can.show() ) {
+ module.showResults();
+ }
+ });
+ }
+ },
+ blur: function(event) {
+ var
+ pageLostFocus = (document.activeElement === this),
+ callback = function() {
+ module.cancel.query();
+ module.remove.focus();
+ module.timer = setTimeout(module.hideResults, settings.hideDelay);
+ }
+ ;
+ if(pageLostFocus) {
+ return;
+ }
+ resultsDismissed = false;
+ if(module.resultsClicked) {
+ module.debug('Determining if user action caused search to close');
+ $module
+ .one('click.close' + eventNamespace, selector.results, function(event) {
+ if(module.is.inMessage(event) || disabledBubbled) {
+ $prompt.focus();
+ return;
+ }
+ disabledBubbled = false;
+ if( !module.is.animating() && !module.is.hidden()) {
+ callback();
+ }
+ })
+ ;
+ }
+ else {
+ module.debug('Input blurred without user action, closing results');
+ callback();
+ }
+ },
+ result: {
+ mousedown: function() {
+ module.resultsClicked = true;
+ },
+ mouseup: function() {
+ module.resultsClicked = false;
+ },
+ click: function(event) {
+ module.debug('Search result selected');
+ var
+ $result = $(this),
+ $title = $result.find(selector.title).eq(0),
+ $link = $result.is('a[href]')
+ ? $result
+ : $result.find('a[href]').eq(0),
+ href = $link.attr('href') || false,
+ target = $link.attr('target') || false,
+ // title is used for result lookup
+ value = ($title.length > 0)
+ ? $title.text()
+ : false,
+ results = module.get.results(),
+ result = $result.data(metadata.result) || module.get.result(value, results)
+ ;
+ var oldValue = module.get.value();
+ if( $.isFunction(settings.onSelect) ) {
+ if(settings.onSelect.call(element, result, results) === false) {
+ module.debug('Custom onSelect callback cancelled default select action');
+ disabledBubbled = true;
+ return;
+ }
+ }
+ module.hideResults();
+ if(value && module.get.value() === oldValue) {
+ module.set.value(value);
+ }
+ if(href) {
+ event.preventDefault();
+ module.verbose('Opening search link found in result', $link);
+ if(target == '_blank' || event.ctrlKey) {
+ window.open(href);
+ }
+ else {
+ window.location.href = (href);
+ }
+ }
+ }
+ }
+ },
+ ensureVisible: function($el) {
+ var elTop, elBottom, resultsScrollTop, resultsHeight;
+ if($el.length === 0) {
+ return;
+ }
+ elTop = $el.position().top;
+ elBottom = elTop + $el.outerHeight(true);
+
+ resultsScrollTop = $results.scrollTop();
+ resultsHeight = $results.height();
+
+ if (elTop < 0) {
+ $results.scrollTop(resultsScrollTop + elTop);
+ }
+
+ else if (resultsHeight < elBottom) {
+ $results.scrollTop(resultsScrollTop + (elBottom - resultsHeight));
+ }
+ },
+ handleKeyboard: function(event) {
+ var
+ // force selector refresh
+ $result = $module.find(selector.result),
+ $category = $module.find(selector.category),
+ $activeResult = $result.filter('.' + className.active),
+ currentIndex = $result.index( $activeResult ),
+ resultSize = $result.length,
+ hasActiveResult = $activeResult.length > 0,
+
+ keyCode = event.which,
+ keys = {
+ backspace : 8,
+ enter : 13,
+ escape : 27,
+ upArrow : 38,
+ downArrow : 40
+ },
+ newIndex
+ ;
+ // search shortcuts
+ if(keyCode == keys.escape) {
+ module.verbose('Escape key pressed, blurring search field');
+ module.hideResults();
+ resultsDismissed = true;
+ }
+ if( module.is.visible() ) {
+ if(keyCode == keys.enter) {
+ module.verbose('Enter key pressed, selecting active result');
+ if( $result.filter('.' + className.active).length > 0 ) {
+ module.event.result.click.call($result.filter('.' + className.active), event);
+ event.preventDefault();
+ return false;
+ }
+ }
+ else if(keyCode == keys.upArrow && hasActiveResult) {
+ module.verbose('Up key pressed, changing active result');
+ newIndex = (currentIndex - 1 < 0)
+ ? currentIndex
+ : currentIndex - 1
+ ;
+ $category
+ .removeClass(className.active)
+ ;
+ $result
+ .removeClass(className.active)
+ .eq(newIndex)
+ .addClass(className.active)
+ .closest($category)
+ .addClass(className.active)
+ ;
+ module.ensureVisible($result.eq(newIndex));
+ event.preventDefault();
+ }
+ else if(keyCode == keys.downArrow) {
+ module.verbose('Down key pressed, changing active result');
+ newIndex = (currentIndex + 1 >= resultSize)
+ ? currentIndex
+ : currentIndex + 1
+ ;
+ $category
+ .removeClass(className.active)
+ ;
+ $result
+ .removeClass(className.active)
+ .eq(newIndex)
+ .addClass(className.active)
+ .closest($category)
+ .addClass(className.active)
+ ;
+ module.ensureVisible($result.eq(newIndex));
+ event.preventDefault();
+ }
+ }
+ else {
+ // query shortcuts
+ if(keyCode == keys.enter) {
+ module.verbose('Enter key pressed, executing query');
+ module.query();
+ module.set.buttonPressed();
+ $prompt.one('keyup', module.remove.buttonFocus);
+ }
+ }
+ },
+
+ setup: {
+ api: function(searchTerm, callback) {
+ var
+ apiSettings = {
+ debug : settings.debug,
+ on : false,
+ cache : settings.cache,
+ action : 'search',
+ urlData : {
+ query : searchTerm
+ },
+ onSuccess : function(response) {
+ module.parse.response.call(element, response, searchTerm);
+ callback();
+ },
+ onFailure : function() {
+ module.displayMessage(error.serverError);
+ callback();
+ },
+ onAbort : function(response) {
+ },
+ onError : module.error
+ }
+ ;
+ $.extend(true, apiSettings, settings.apiSettings);
+ module.verbose('Setting up API request', apiSettings);
+ $module.api(apiSettings);
+ }
+ },
+
+ can: {
+ useAPI: function() {
+ return $.fn.api !== undefined;
+ },
+ show: function() {
+ return module.is.focused() && !module.is.visible() && !module.is.empty();
+ },
+ transition: function() {
+ return settings.transition && $.fn.transition !== undefined && $module.transition('is supported');
+ }
+ },
+
+ is: {
+ animating: function() {
+ return $results.hasClass(className.animating);
+ },
+ chrome: function() {
+ return !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime);
+ },
+ hidden: function() {
+ return $results.hasClass(className.hidden);
+ },
+ inMessage: function(event) {
+ if(!event.target) {
+ return;
+ }
+ var
+ $target = $(event.target),
+ isInDOM = $.contains(document.documentElement, event.target)
+ ;
+ return (isInDOM && $target.closest(selector.message).length > 0);
+ },
+ empty: function() {
+ return ($results.html() === '');
+ },
+ visible: function() {
+ return ($results.filter(':visible').length > 0);
+ },
+ focused: function() {
+ return ($prompt.filter(':focus').length > 0);
+ }
+ },
+
+ get: {
+ settings: function() {
+ if($.isPlainObject(parameters) && parameters.searchFullText) {
+ settings.fullTextSearch = parameters.searchFullText;
+ module.error(settings.error.oldSearchSyntax, element);
+ }
+ if (settings.ignoreDiacritics && !String.prototype.normalize) {
+ settings.ignoreDiacritics = false;
+ module.error(error.noNormalize, element);
+ }
+ },
+ inputEvent: function() {
+ var
+ prompt = $prompt[0],
+ inputEvent = (prompt !== undefined && prompt.oninput !== undefined)
+ ? 'input'
+ : (prompt !== undefined && prompt.onpropertychange !== undefined)
+ ? 'propertychange'
+ : 'keyup'
+ ;
+ return inputEvent;
+ },
+ value: function() {
+ return $prompt.val();
+ },
+ results: function() {
+ var
+ results = $module.data(metadata.results)
+ ;
+ return results;
+ },
+ result: function(value, results) {
+ var
+ result = false
+ ;
+ value = (value !== undefined)
+ ? value
+ : module.get.value()
+ ;
+ results = (results !== undefined)
+ ? results
+ : module.get.results()
+ ;
+ if(settings.type === 'category') {
+ module.debug('Finding result that matches', value);
+ $.each(results, function(index, category) {
+ if(Array.isArray(category.results)) {
+ result = module.search.object(value, category.results)[0];
+ // don't continue searching if a result is found
+ if(result) {
+ return false;
+ }
+ }
+ });
+ }
+ else {
+ module.debug('Finding result in results object', value);
+ result = module.search.object(value, results)[0];
+ }
+ return result || false;
+ },
+ },
+
+ select: {
+ firstResult: function() {
+ module.verbose('Selecting first result');
+ $result.first().addClass(className.active);
+ }
+ },
+
+ set: {
+ focus: function() {
+ $module.addClass(className.focus);
+ },
+ loading: function() {
+ $module.addClass(className.loading);
+ },
+ value: function(value) {
+ module.verbose('Setting search input value', value);
+ $prompt
+ .val(value)
+ ;
+ },
+ type: function(type) {
+ type = type || settings.type;
+ if(settings.type == 'category') {
+ $module.addClass(settings.type);
+ }
+ },
+ buttonPressed: function() {
+ $searchButton.addClass(className.pressed);
+ }
+ },
+
+ remove: {
+ loading: function() {
+ $module.removeClass(className.loading);
+ },
+ focus: function() {
+ $module.removeClass(className.focus);
+ },
+ buttonPressed: function() {
+ $searchButton.removeClass(className.pressed);
+ },
+ diacritics: function(text) {
+ return settings.ignoreDiacritics ? text.normalize('NFD').replace(/[\u0300-\u036f]/g, '') : text;
+ }
+ },
+
+ query: function(callback) {
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ var
+ searchTerm = module.get.value(),
+ cache = module.read.cache(searchTerm)
+ ;
+ callback = callback || function() {};
+ if( module.has.minimumCharacters() ) {
+ if(cache) {
+ module.debug('Reading result from cache', searchTerm);
+ module.save.results(cache.results);
+ module.addResults(cache.html);
+ module.inject.id(cache.results);
+ callback();
+ }
+ else {
+ module.debug('Querying for', searchTerm);
+ if($.isPlainObject(settings.source) || Array.isArray(settings.source)) {
+ module.search.local(searchTerm);
+ callback();
+ }
+ else if( module.can.useAPI() ) {
+ module.search.remote(searchTerm, callback);
+ }
+ else {
+ module.error(error.source);
+ callback();
+ }
+ }
+ settings.onSearchQuery.call(element, searchTerm);
+ }
+ else {
+ module.hideResults();
+ }
+ },
+
+ search: {
+ local: function(searchTerm) {
+ var
+ results = module.search.object(searchTerm, settings.source),
+ searchHTML
+ ;
+ module.set.loading();
+ module.save.results(results);
+ module.debug('Returned full local search results', results);
+ if(settings.maxResults > 0) {
+ module.debug('Using specified max results', results);
+ results = results.slice(0, settings.maxResults);
+ }
+ if(settings.type == 'category') {
+ results = module.create.categoryResults(results);
+ }
+ searchHTML = module.generateResults({
+ results: results
+ });
+ module.remove.loading();
+ module.addResults(searchHTML);
+ module.inject.id(results);
+ module.write.cache(searchTerm, {
+ html : searchHTML,
+ results : results
+ });
+ },
+ remote: function(searchTerm, callback) {
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ if($module.api('is loading')) {
+ $module.api('abort');
+ }
+ module.setup.api(searchTerm, callback);
+ $module
+ .api('query')
+ ;
+ },
+ object: function(searchTerm, source, searchFields) {
+ searchTerm = module.remove.diacritics(String(searchTerm));
+ var
+ results = [],
+ exactResults = [],
+ fuzzyResults = [],
+ searchExp = searchTerm.replace(regExp.escape, '\\$&'),
+ matchRegExp = new RegExp(regExp.beginsWith + searchExp, 'i'),
+
+ // avoid duplicates when pushing results
+ addResult = function(array, result) {
+ var
+ notResult = ($.inArray(result, results) == -1),
+ notFuzzyResult = ($.inArray(result, fuzzyResults) == -1),
+ notExactResults = ($.inArray(result, exactResults) == -1)
+ ;
+ if(notResult && notFuzzyResult && notExactResults) {
+ array.push(result);
+ }
+ }
+ ;
+ source = source || settings.source;
+ searchFields = (searchFields !== undefined)
+ ? searchFields
+ : settings.searchFields
+ ;
+
+ // search fields should be array to loop correctly
+ if(!Array.isArray(searchFields)) {
+ searchFields = [searchFields];
+ }
+
+ // exit conditions if no source
+ if(source === undefined || source === false) {
+ module.error(error.source);
+ return [];
+ }
+ // iterate through search fields looking for matches
+ $.each(searchFields, function(index, field) {
+ $.each(source, function(label, content) {
+ var
+ fieldExists = (typeof content[field] == 'string') || (typeof content[field] == 'number')
+ ;
+ if(fieldExists) {
+ var text;
+ if (typeof content[field] === 'string'){
+ text = module.remove.diacritics(content[field]);
+ } else {
+ text = content[field].toString();
+ }
+ if( text.search(matchRegExp) !== -1) {
+ // content starts with value (first in results)
+ addResult(results, content);
+ }
+ else if(settings.fullTextSearch === 'exact' && module.exactSearch(searchTerm, text) ) {
+ // content fuzzy matches (last in results)
+ addResult(exactResults, content);
+ }
+ else if(settings.fullTextSearch == true && module.fuzzySearch(searchTerm, text) ) {
+ // content fuzzy matches (last in results)
+ addResult(fuzzyResults, content);
+ }
+ }
+ });
+ });
+ $.merge(exactResults, fuzzyResults);
+ $.merge(results, exactResults);
+ return results;
+ }
+ },
+ exactSearch: function (query, term) {
+ query = query.toLowerCase();
+ term = term.toLowerCase();
+ return term.indexOf(query) > -1;
+ },
+ fuzzySearch: function(query, term) {
+ var
+ termLength = term.length,
+ queryLength = query.length
+ ;
+ if(typeof query !== 'string') {
+ return false;
+ }
+ query = query.toLowerCase();
+ term = term.toLowerCase();
+ if(queryLength > termLength) {
+ return false;
+ }
+ if(queryLength === termLength) {
+ return (query === term);
+ }
+ search: for (var characterIndex = 0, nextCharacterIndex = 0; characterIndex < queryLength; characterIndex++) {
+ var
+ queryCharacter = query.charCodeAt(characterIndex)
+ ;
+ while(nextCharacterIndex < termLength) {
+ if(term.charCodeAt(nextCharacterIndex++) === queryCharacter) {
+ continue search;
+ }
+ }
+ return false;
+ }
+ return true;
+ },
+
+ parse: {
+ response: function(response, searchTerm) {
+ if(Array.isArray(response)){
+ var o={};
+ o[fields.results]=response;
+ response = o;
+ }
+ var
+ searchHTML = module.generateResults(response)
+ ;
+ module.verbose('Parsing server response', response);
+ if(response !== undefined) {
+ if(searchTerm !== undefined && response[fields.results] !== undefined) {
+ module.addResults(searchHTML);
+ module.inject.id(response[fields.results]);
+ module.write.cache(searchTerm, {
+ html : searchHTML,
+ results : response[fields.results]
+ });
+ module.save.results(response[fields.results]);
+ }
+ }
+ }
+ },
+
+ cancel: {
+ query: function() {
+ if( module.can.useAPI() ) {
+ $module.api('abort');
+ }
+ }
+ },
+
+ has: {
+ minimumCharacters: function() {
+ var
+ searchTerm = module.get.value(),
+ numCharacters = searchTerm.length
+ ;
+ return (numCharacters >= settings.minCharacters);
+ },
+ results: function() {
+ if($results.length === 0) {
+ return false;
+ }
+ var
+ html = $results.html()
+ ;
+ return html != '';
+ }
+ },
+
+ clear: {
+ cache: function(value) {
+ var
+ cache = $module.data(metadata.cache)
+ ;
+ if(!value) {
+ module.debug('Clearing cache', value);
+ $module.removeData(metadata.cache);
+ }
+ else if(value && cache && cache[value]) {
+ module.debug('Removing value from cache', value);
+ delete cache[value];
+ $module.data(metadata.cache, cache);
+ }
+ }
+ },
+
+ read: {
+ cache: function(name) {
+ var
+ cache = $module.data(metadata.cache)
+ ;
+ if(settings.cache) {
+ module.verbose('Checking cache for generated html for query', name);
+ return (typeof cache == 'object') && (cache[name] !== undefined)
+ ? cache[name]
+ : false
+ ;
+ }
+ return false;
+ }
+ },
+
+ create: {
+ categoryResults: function(results) {
+ var
+ categoryResults = {}
+ ;
+ $.each(results, function(index, result) {
+ if(!result.category) {
+ return;
+ }
+ if(categoryResults[result.category] === undefined) {
+ module.verbose('Creating new category of results', result.category);
+ categoryResults[result.category] = {
+ name : result.category,
+ results : [result]
+ };
+ }
+ else {
+ categoryResults[result.category].results.push(result);
+ }
+ });
+ return categoryResults;
+ },
+ id: function(resultIndex, categoryIndex) {
+ var
+ resultID = (resultIndex + 1), // not zero indexed
+ letterID,
+ id
+ ;
+ if(categoryIndex !== undefined) {
+ // start char code for "A"
+ letterID = String.fromCharCode(97 + categoryIndex);
+ id = letterID + resultID;
+ module.verbose('Creating category result id', id);
+ }
+ else {
+ id = resultID;
+ module.verbose('Creating result id', id);
+ }
+ return id;
+ },
+ results: function() {
+ if($results.length === 0) {
+ $results = $('
')
+ .addClass(className.results)
+ .appendTo($module)
+ ;
+ }
+ }
+ },
+
+ inject: {
+ result: function(result, resultIndex, categoryIndex) {
+ module.verbose('Injecting result into results');
+ var
+ $selectedResult = (categoryIndex !== undefined)
+ ? $results
+ .children().eq(categoryIndex)
+ .children(selector.results)
+ .first()
+ .children(selector.result)
+ .eq(resultIndex)
+ : $results
+ .children(selector.result).eq(resultIndex)
+ ;
+ module.verbose('Injecting results metadata', $selectedResult);
+ $selectedResult
+ .data(metadata.result, result)
+ ;
+ },
+ id: function(results) {
+ module.debug('Injecting unique ids into results');
+ var
+ // since results may be object, we must use counters
+ categoryIndex = 0,
+ resultIndex = 0
+ ;
+ if(settings.type === 'category') {
+ // iterate through each category result
+ $.each(results, function(index, category) {
+ if(category.results.length > 0){
+ resultIndex = 0;
+ $.each(category.results, function(index, result) {
+ if(result.id === undefined) {
+ result.id = module.create.id(resultIndex, categoryIndex);
+ }
+ module.inject.result(result, resultIndex, categoryIndex);
+ resultIndex++;
+ });
+ categoryIndex++;
+ }
+ });
+ }
+ else {
+ // top level
+ $.each(results, function(index, result) {
+ if(result.id === undefined) {
+ result.id = module.create.id(resultIndex);
+ }
+ module.inject.result(result, resultIndex);
+ resultIndex++;
+ });
+ }
+ return results;
+ }
+ },
+
+ save: {
+ results: function(results) {
+ module.verbose('Saving current search results to metadata', results);
+ $module.data(metadata.results, results);
+ }
+ },
+
+ write: {
+ cache: function(name, value) {
+ var
+ cache = ($module.data(metadata.cache) !== undefined)
+ ? $module.data(metadata.cache)
+ : {}
+ ;
+ if(settings.cache) {
+ module.verbose('Writing generated html to cache', name, value);
+ cache[name] = value;
+ $module
+ .data(metadata.cache, cache)
+ ;
+ }
+ }
+ },
+
+ addResults: function(html) {
+ if( $.isFunction(settings.onResultsAdd) ) {
+ if( settings.onResultsAdd.call($results, html) === false ) {
+ module.debug('onResultsAdd callback cancelled default action');
+ return false;
+ }
+ }
+ if(html) {
+ $results
+ .html(html)
+ ;
+ module.refreshResults();
+ if(settings.selectFirstResult) {
+ module.select.firstResult();
+ }
+ module.showResults();
+ }
+ else {
+ module.hideResults(function() {
+ $results.empty();
+ });
+ }
+ },
+
+ showResults: function(callback) {
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ if(resultsDismissed) {
+ return;
+ }
+ if(!module.is.visible() && module.has.results()) {
+ if( module.can.transition() ) {
+ module.debug('Showing results with css animations');
+ $results
+ .transition({
+ animation : settings.transition + ' in',
+ debug : settings.debug,
+ verbose : settings.verbose,
+ duration : settings.duration,
+ onShow : function() {
+ var $firstResult = $module.find(selector.result).eq(0);
+ module.ensureVisible($firstResult);
+ },
+ onComplete : function() {
+ callback();
+ },
+ queue : true
+ })
+ ;
+ }
+ else {
+ module.debug('Showing results with javascript');
+ $results
+ .stop()
+ .fadeIn(settings.duration, settings.easing)
+ ;
+ }
+ settings.onResultsOpen.call($results);
+ }
+ },
+ hideResults: function(callback) {
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ if( module.is.visible() ) {
+ if( module.can.transition() ) {
+ module.debug('Hiding results with css animations');
+ $results
+ .transition({
+ animation : settings.transition + ' out',
+ debug : settings.debug,
+ verbose : settings.verbose,
+ duration : settings.duration,
+ onComplete : function() {
+ callback();
+ },
+ queue : true
+ })
+ ;
+ }
+ else {
+ module.debug('Hiding results with javascript');
+ $results
+ .stop()
+ .fadeOut(settings.duration, settings.easing)
+ ;
+ }
+ settings.onResultsClose.call($results);
+ }
+ },
+
+ generateResults: function(response) {
+ module.debug('Generating html from response', response);
+ var
+ template = settings.templates[settings.type],
+ isProperObject = ($.isPlainObject(response[fields.results]) && !$.isEmptyObject(response[fields.results])),
+ isProperArray = (Array.isArray(response[fields.results]) && response[fields.results].length > 0),
+ html = ''
+ ;
+ if(isProperObject || isProperArray ) {
+ if(settings.maxResults > 0) {
+ if(isProperObject) {
+ if(settings.type == 'standard') {
+ module.error(error.maxResults);
+ }
+ }
+ else {
+ response[fields.results] = response[fields.results].slice(0, settings.maxResults);
+ }
+ }
+ if($.isFunction(template)) {
+ html = template(response, fields, settings.preserveHTML);
+ }
+ else {
+ module.error(error.noTemplate, false);
+ }
+ }
+ else if(settings.showNoResults) {
+ html = module.displayMessage(error.noResults, 'empty', error.noResultsHeader);
+ }
+ settings.onResults.call(element, response);
+ return html;
+ },
+
+ displayMessage: function(text, type, header) {
+ type = type || 'standard';
+ module.debug('Displaying message', text, type, header);
+ module.addResults( settings.templates.message(text, type, header) );
+ return settings.templates.message(text, type, header);
+ },
+
+ setting: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ settings[name] = value;
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if($allModules.length > 1) {
+ title += ' ' + '(' + $allModules.length + ')';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ return false;
+ }
+ });
+ }
+ if( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ }
+
+ })
+ ;
+
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.fn.search.settings = {
+
+ name : 'Search',
+ namespace : 'search',
+
+ silent : false,
+ debug : false,
+ verbose : false,
+ performance : true,
+
+ // template to use (specified in settings.templates)
+ type : 'standard',
+
+ // minimum characters required to search
+ minCharacters : 1,
+
+ // whether to select first result after searching automatically
+ selectFirstResult : false,
+
+ // API config
+ apiSettings : false,
+
+ // object to search
+ source : false,
+
+ // Whether search should query current term on focus
+ searchOnFocus : true,
+
+ // fields to search
+ searchFields : [
+ 'id',
+ 'title',
+ 'description'
+ ],
+
+ // field to display in standard results template
+ displayField : '',
+
+ // search anywhere in value (set to 'exact' to require exact matches
+ fullTextSearch : 'exact',
+
+ // match results also if they contain diacritics of the same base character (for example searching for "a" will also match "á" or "â" or "à ", etc...)
+ ignoreDiacritics : false,
+
+ // whether to add events to prompt automatically
+ automatic : true,
+
+ // delay before hiding menu after blur
+ hideDelay : 0,
+
+ // delay before searching
+ searchDelay : 200,
+
+ // maximum results returned from search
+ maxResults : 7,
+
+ // whether to store lookups in local cache
+ cache : true,
+
+ // whether no results errors should be shown
+ showNoResults : true,
+
+ // preserve possible html of resultset values
+ preserveHTML : true,
+
+ // transition settings
+ transition : 'scale',
+ duration : 200,
+ easing : 'easeOutExpo',
+
+ // callbacks
+ onSelect : false,
+ onResultsAdd : false,
+
+ onSearchQuery : function(query){},
+ onResults : function(response){},
+
+ onResultsOpen : function(){},
+ onResultsClose : function(){},
+
+ className: {
+ animating : 'animating',
+ active : 'active',
+ empty : 'empty',
+ focus : 'focus',
+ hidden : 'hidden',
+ loading : 'loading',
+ results : 'results',
+ pressed : 'down'
+ },
+
+ error : {
+ source : 'Cannot search. No source used, and Semantic API module was not included',
+ noResultsHeader : 'No Results',
+ noResults : 'Your search returned no results',
+ logging : 'Error in debug logging, exiting.',
+ noEndpoint : 'No search endpoint was specified',
+ noTemplate : 'A valid template name was not specified.',
+ oldSearchSyntax : 'searchFullText setting has been renamed fullTextSearch for consistency, please adjust your settings.',
+ serverError : 'There was an issue querying the server.',
+ maxResults : 'Results must be an array to use maxResults setting',
+ method : 'The method you called is not defined.',
+ noNormalize : '"ignoreDiacritics" setting will be ignored. Browser does not support String().normalize(). You may consider including as a polyfill.'
+ },
+
+ metadata: {
+ cache : 'cache',
+ results : 'results',
+ result : 'result'
+ },
+
+ regExp: {
+ escape : /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,
+ beginsWith : '(?:\s|^)'
+ },
+
+ // maps api response attributes to internal representation
+ fields: {
+ categories : 'results', // array of categories (category view)
+ categoryName : 'name', // name of category (category view)
+ categoryResults : 'results', // array of results (category view)
+ description : 'description', // result description
+ image : 'image', // result image
+ price : 'price', // result price
+ results : 'results', // array of results (standard)
+ title : 'title', // result title
+ url : 'url', // result url
+ action : 'action', // "view more" object name
+ actionText : 'text', // "view more" text
+ actionURL : 'url' // "view more" url
+ },
+
+ selector : {
+ prompt : '.prompt',
+ searchButton : '.search.button',
+ results : '.results',
+ message : '.results > .message',
+ category : '.category',
+ result : '.result',
+ title : '.title, .name'
+ },
+
+ templates: {
+ escape: function(string, preserveHTML) {
+ if (preserveHTML){
+ return string;
+ }
+ var
+ badChars = /[<>"'`]/g,
+ shouldEscape = /[&<>"'`]/,
+ escape = {
+ "<": "<",
+ ">": ">",
+ '"': """,
+ "'": "'",
+ "`": "`"
+ },
+ escapedChar = function(chr) {
+ return escape[chr];
+ }
+ ;
+ if(shouldEscape.test(string)) {
+ string = string.replace(/&(?![a-z0-9#]{1,6};)/, "&");
+ return string.replace(badChars, escapedChar);
+ }
+ return string;
+ },
+ message: function(message, type, header) {
+ var
+ html = ''
+ ;
+ if(message !== undefined && type !== undefined) {
+ html += ''
+ + ''
+ ;
+ if(header) {
+ html += ''
+ + ''
+ ;
+ }
+ html += '
' + message + '
';
+ html += '
';
+ }
+ return html;
+ },
+ category: function(response, fields, preserveHTML) {
+ var
+ html = '',
+ escape = $.fn.search.settings.templates.escape
+ ;
+ if(response[fields.categoryResults] !== undefined) {
+
+ // each category
+ $.each(response[fields.categoryResults], function(index, category) {
+ if(category[fields.results] !== undefined && category.results.length > 0) {
+
+ html += '';
+
+ if(category[fields.categoryName] !== undefined) {
+ html += '
' + escape(category[fields.categoryName], preserveHTML) + '
';
+ }
+
+ // each item inside category
+ html += '
';
+ html += ''
+ + '
'
+ ;
+ }
+ });
+ if(response[fields.action]) {
+ if(fields.actionURL === false) {
+ html += ''
+ + ''
+ + escape(response[fields.action][fields.actionText], preserveHTML)
+ + '
';
+ } else {
+ html += ''
+ + ''
+ + escape(response[fields.action][fields.actionText], preserveHTML)
+ + ' ';
+ }
+ }
+ return html;
+ }
+ return false;
+ },
+ standard: function(response, fields, preserveHTML) {
+ var
+ html = '',
+ escape = $.fn.search.settings.templates.escape
+ ;
+ if(response[fields.results] !== undefined) {
+
+ // each result
+ $.each(response[fields.results], function(index, result) {
+ if(result[fields.url]) {
+ html += '';
+ }
+ else {
+ html += ' ';
+ }
+ if(result[fields.image] !== undefined) {
+ html += ''
+ + ''
+ + '
'
+ + '
'
+ ;
+ }
+ html += '';
+ if(result[fields.price] !== undefined) {
+ html += '
' + escape(result[fields.price], preserveHTML) + '
';
+ }
+ if(result[fields.title] !== undefined) {
+ html += '
' + escape(result[fields.title], preserveHTML) + '
';
+ }
+ if(result[fields.description] !== undefined) {
+ html += '
' + escape(result[fields.description], preserveHTML) + '
';
+ }
+ html += ''
+ + '
'
+ ;
+ html += ' ';
+ });
+ if(response[fields.action]) {
+ if(fields.actionURL === false) {
+ html += ''
+ + ''
+ + escape(response[fields.action][fields.actionText], preserveHTML)
+ + '
';
+ } else {
+ html += ''
+ + ''
+ + escape(response[fields.action][fields.actionText], preserveHTML)
+ + ' ';
+ }
+ }
+ return html;
+ }
+ return false;
+ }
+ }
+};
+
+})( jQuery, window, document );
diff --git a/public/dist/components/search.min.css b/public/dist/components/search.min.css
new file mode 100644
index 000000000..ebf331aea
--- /dev/null
+++ b/public/dist/components/search.min.css
@@ -0,0 +1,9 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Search
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */.ui.search{position:relative}.ui.search>.prompt{margin:0;outline:0;-webkit-appearance:none;-webkit-tap-highlight-color:rgba(255,255,255,0);text-shadow:none;font-style:normal;font-weight:400;line-height:1.21428571em;padding:.67857143em 1em;font-size:1em;background:#fff;border:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87);-webkit-box-shadow:0 0 0 0 transparent inset;box-shadow:0 0 0 0 transparent inset;-webkit-transition:background-color .1s ease,color .1s ease,border-color .1s ease,-webkit-box-shadow .1s ease;transition:background-color .1s ease,color .1s ease,border-color .1s ease,-webkit-box-shadow .1s ease;transition:background-color .1s ease,color .1s ease,box-shadow .1s ease,border-color .1s ease;transition:background-color .1s ease,color .1s ease,box-shadow .1s ease,border-color .1s ease,-webkit-box-shadow .1s ease}.ui.search .prompt{border-radius:500rem}.ui.search .prompt~.search.icon{cursor:pointer}.ui.search>.results{display:none;position:absolute;top:100%;left:0;-webkit-transform-origin:center top;transform-origin:center top;white-space:normal;text-align:left;text-transform:none;background:#fff;margin-top:.5em;width:18em;border-radius:.28571429rem;-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);border:1px solid #d4d4d5;z-index:998}.ui.search>.results>:first-child{border-radius:.28571429rem .28571429rem 0 0}.ui.search>.results>:last-child{border-radius:0 0 .28571429rem .28571429rem}.ui.search>.results .result{cursor:pointer;display:block;overflow:hidden;font-size:1em;padding:.85714286em 1.14285714em;color:rgba(0,0,0,.87);line-height:1.33;border-bottom:1px solid rgba(34,36,38,.1)}.ui.search>.results .result:last-child{border-bottom:none!important}.ui.search>.results .result .image{float:right;overflow:hidden;background:0 0;width:5em;height:3em;border-radius:.25em}.ui.search>.results .result .image img{display:block;width:auto;height:100%}.ui.search>.results .result .image+.content{margin:0 6em 0 0}.ui.search>.results .result .title{margin:-.14285714em 0 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-weight:700;font-size:1em;color:rgba(0,0,0,.85)}.ui.search>.results .result .description{margin-top:0;font-size:.92857143em;color:rgba(0,0,0,.4)}.ui.search>.results .result .price{float:right;color:#21ba45}.ui.search>.results>.message{padding:1em 1em}.ui.search>.results>.message .header{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1rem;font-weight:700;color:rgba(0,0,0,.87)}.ui.search>.results>.message .description{margin-top:.25rem;font-size:1em;color:rgba(0,0,0,.87)}.ui.search>.results>.action{display:block;border-top:none;background:#f3f4f5;padding:.92857143em 1em;color:rgba(0,0,0,.87);font-weight:700;text-align:center}.ui.search>.prompt:focus{border-color:rgba(34,36,38,.35);background:#fff;color:rgba(0,0,0,.95)}.ui.loading.search .input>i.icon:before{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.loading.search .input>i.icon:after{position:absolute;content:'';top:50%;left:50%;margin:-.64285714em 0 0 -.64285714em;width:1.28571429em;height:1.28571429em;-webkit-animation:loader .6s infinite linear;animation:loader .6s infinite linear;border:.2em solid #767676;border-radius:500rem;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent}.ui.category.search>.results .category .result:hover,.ui.search>.results .result:hover{background:#f9fafb}.ui.search .action:hover:not(div){background:#e0e0e0}.ui.category.search>.results .category.active{background:#f3f4f5}.ui.category.search>.results .category.active>.name{color:rgba(0,0,0,.87)}.ui.category.search>.results .category .result.active,.ui.search>.results .result.active{position:relative;border-left-color:rgba(34,36,38,.1);background:#f3f4f5;-webkit-box-shadow:none;box-shadow:none}.ui.search>.results .result.active .title{color:rgba(0,0,0,.85)}.ui.search>.results .result.active .description{color:rgba(0,0,0,.85)}.ui.disabled.search{cursor:default;pointer-events:none;opacity:.45}.ui.search.selection .prompt{border-radius:.28571429rem}.ui.search.selection>.icon.input>.remove.icon{pointer-events:none;position:absolute;left:auto;opacity:0;color:'';top:0;right:0;-webkit-transition:color .1s ease,opacity .1s ease;transition:color .1s ease,opacity .1s ease}.ui.search.selection>.icon.input>.active.remove.icon{cursor:pointer;opacity:.8;pointer-events:auto}.ui.search.selection>.icon.input:not([class*="left icon"])>.icon~.remove.icon{right:1.85714em}.ui.search.selection>.icon.input>.remove.icon:hover{opacity:1;color:#db2828}.ui.category.search .results{width:28em}.ui.category.search .results.animating,.ui.category.search .results.visible{display:table}.ui.category.search>.results .category{display:table-row;background:#f3f4f5;-webkit-box-shadow:none;box-shadow:none;-webkit-transition:background .1s ease,border-color .1s ease;transition:background .1s ease,border-color .1s ease}.ui.category.search>.results .category:last-child{border-bottom:none}.ui.category.search>.results .category:first-child .name+.result{border-radius:0 .28571429rem 0 0}.ui.category.search>.results .category:last-child .result:last-child{border-radius:0 0 .28571429rem 0}.ui.category.search>.results .category>.name{display:table-cell;text-overflow:ellipsis;width:100px;white-space:nowrap;background:0 0;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1em;padding:.4em 1em;font-weight:700;color:rgba(0,0,0,.4);border-bottom:1px solid rgba(34,36,38,.1)}.ui.category.search>.results .category .results{display:table-cell;background:#fff;border-left:1px solid rgba(34,36,38,.15);border-bottom:1px solid rgba(34,36,38,.1)}.ui.category.search>.results .category .result{border-bottom:1px solid rgba(34,36,38,.1);-webkit-transition:background .1s ease,border-color .1s ease;transition:background .1s ease,border-color .1s ease;padding:.85714286em 1.14285714em}.ui.scrolling.search>.results,.ui.search.long>.results,.ui.search.short>.results{overflow-x:hidden;overflow-y:auto;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-overflow-scrolling:touch}@media only screen and (max-width:767.98px){.ui.scrolling.search>.results{max-height:12.17714286em}}@media only screen and (min-width:768px){.ui.scrolling.search>.results{max-height:18.26571429em}}@media only screen and (min-width:992px){.ui.scrolling.search>.results{max-height:24.35428571em}}@media only screen and (min-width:1920px){.ui.scrolling.search>.results{max-height:36.53142857em}}@media only screen and (max-width:767.98px){.ui.search.short>.results{max-height:12.17714286em}.ui.search[class*="very short"]>.results{max-height:9.13285714em}.ui.search.long>.results{max-height:24.35428571em}.ui.search[class*="very long"]>.results{max-height:36.53142857em}}@media only screen and (min-width:768px){.ui.search.short>.results{max-height:18.26571429em}.ui.search[class*="very short"]>.results{max-height:13.69928571em}.ui.search.long>.results{max-height:36.53142857em}.ui.search[class*="very long"]>.results{max-height:54.79714286em}}@media only screen and (min-width:992px){.ui.search.short>.results{max-height:24.35428571em}.ui.search[class*="very short"]>.results{max-height:18.26571429em}.ui.search.long>.results{max-height:48.70857143em}.ui.search[class*="very long"]>.results{max-height:73.06285714em}}@media only screen and (min-width:1920px){.ui.search.short>.results{max-height:36.53142857em}.ui.search[class*="very short"]>.results{max-height:27.39857143em}.ui.search.long>.results{max-height:73.06285714em}.ui.search[class*="very long"]>.results{max-height:109.59428571em}}.ui[class*="left aligned"].search>.results{right:auto;left:0}.ui[class*="right aligned"].search>.results{right:0;left:auto}.ui.fluid.search .results{width:100%}.ui.search{font-size:1em}.ui.mini.search{font-size:.78571429em}.ui.tiny.search{font-size:.85714286em}.ui.small.search{font-size:.92857143em}.ui.large.search{font-size:1.14285714em}.ui.big.search{font-size:1.28571429em}.ui.huge.search{font-size:1.42857143em}.ui.massive.search{font-size:1.71428571em}@media only screen and (max-width:767.98px){.ui.search .results{max-width:calc(100vw - 2rem)}}
\ No newline at end of file
diff --git a/public/dist/components/search.min.js b/public/dist/components/search.min.js
new file mode 100644
index 000000000..1f4f08f9e
--- /dev/null
+++ b/public/dist/components/search.min.js
@@ -0,0 +1,11 @@
+/*
+ * # Fomantic UI - 2.8.8
+ * https://github.com/fomantic/Fomantic-UI
+ * http://fomantic-ui.com/
+ *
+ * Copyright 2021 Contributors
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+!function(q,k,D,E){"use strict";q.isFunction=q.isFunction||function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},k=void 0!==k&&k.Math==Math?k:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),q.fn.search=function(u){var x,C=q(this),w=C.selector||"",S=(new Date).getTime(),T=[],F=u,j="string"==typeof F,A=[].slice.call(arguments,1);return q(this).each(function(){var f,l=q.isPlainObject(u)?q.extend(!0,{},q.fn.search.settings,u):q.extend({},q.fn.search.settings),g=l.className,d=l.metadata,n=l.regExp,i=l.fields,h=l.selector,p=l.error,e=l.namespace,r="."+e,t=e+"-module",m=q(this),v=m.find(h.prompt),s=m.find(h.searchButton),a=m.find(h.results),o=m.find(h.result),y=(m.find(h.category),this),c=m.data(t),b=!1,R=!1;f={initialize:function(){f.verbose("Initializing module"),f.get.settings(),f.determine.searchFields(),f.bind.events(),f.set.type(),f.create.results(),f.instantiate()},instantiate:function(){f.verbose("Storing instance of module",f),c=f,m.data(t,f)},destroy:function(){f.verbose("Destroying instance"),m.off(r).removeData(t)},refresh:function(){f.debug("Refreshing selector cache"),v=m.find(h.prompt),s=m.find(h.searchButton),m.find(h.category),a=m.find(h.results),o=m.find(h.result)},refreshResults:function(){a=m.find(h.results),o=m.find(h.result)},bind:{events:function(){f.verbose("Binding events to search"),l.automatic&&(m.on(f.get.inputEvent()+r,h.prompt,f.event.input),v.attr("autocomplete",f.is.chrome()?"fomantic-search":"off")),m.on("focus"+r,h.prompt,f.event.focus).on("blur"+r,h.prompt,f.event.blur).on("keydown"+r,h.prompt,f.handleKeyboard).on("click"+r,h.searchButton,f.query).on("mousedown"+r,h.results,f.event.result.mousedown).on("mouseup"+r,h.results,f.event.result.mouseup).on("click"+r,h.result,f.event.result.click)}},determine:{searchFields:function(){u&&u.searchFields!==E&&(l.searchFields=u.searchFields)}},event:{input:function(){l.searchDelay?(clearTimeout(f.timer),f.timer=setTimeout(function(){f.is.focused()&&f.query()},l.searchDelay)):f.query()},focus:function(){f.set.focus(),l.searchOnFocus&&f.has.minimumCharacters()&&f.query(function(){f.can.show()&&f.showResults()})},blur:function(e){function t(){f.cancel.query(),f.remove.focus(),f.timer=setTimeout(f.hideResults,l.hideDelay)}var s=D.activeElement===this;s||(R=!1,f.resultsClicked?(f.debug("Determining if user action caused search to close"),m.one("click.close"+r,h.results,function(e){f.is.inMessage(e)||b?v.focus():(b=!1,f.is.animating()||f.is.hidden()||t())})):(f.debug("Input blurred without user action, closing results"),t()))},result:{mousedown:function(){f.resultsClicked=!0},mouseup:function(){f.resultsClicked=!1},click:function(e){f.debug("Search result selected");var t=q(this),s=t.find(h.title).eq(0),n=t.is("a[href]")?t:t.find("a[href]").eq(0),r=n.attr("href")||!1,i=n.attr("target")||!1,a=0=l.minCharacters},results:function(){return 0!==a.length&&""!=a.html()}},clear:{cache:function(e){var t=m.data(d.cache);e?e&&t&&t[e]&&(f.debug("Removing value from cache",e),delete t[e],m.data(d.cache,t)):(f.debug("Clearing cache",e),m.removeData(d.cache))}},read:{cache:function(e){var t=m.data(d.cache);return!!l.cache&&(f.verbose("Checking cache for generated html for query",e),"object"==typeof t&&t[e]!==E&&t[e])}},create:{categoryResults:function(e){var s={};return q.each(e,function(e,t){t.category&&(s[t.category]===E?(f.verbose("Creating new category of results",t.category),s[t.category]={name:t.category,results:[t]}):s[t.category].results.push(t))}),s},id:function(e,t){var s,n=e+1;return t!==E?(s=String.fromCharCode(97+t)+n,f.verbose("Creating category result id",s)):(s=n,f.verbose("Creating result id",s)),s},results:function(){0===a.length&&(a=q("
").addClass(g.results).appendTo(m))}},inject:{result:function(e,t,s){f.verbose("Injecting result into results");var n=s!==E?a.children().eq(s).children(h.results).first().children(h.result).eq(t):a.children(h.result).eq(t);f.verbose("Injecting results metadata",n),n.data(d.result,e)},id:function(e){f.debug("Injecting unique ids into results");var s=0,n=0;return"category"===l.type?q.each(e,function(e,t){0 as a polyfill.'},metadata:{cache:"cache",results:"results",result:"result"},regExp:{escape:/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,beginsWith:"(?:s|^)"},fields:{categories:"results",categoryName:"name",categoryResults:"results",description:"description",image:"image",price:"price",results:"results",title:"title",url:"url",action:"action",actionText:"text",actionURL:"url"},selector:{prompt:".prompt",searchButton:".search.button",results:".results",message:".results > .message",category:".category",result:".result",title:".title, .name"},templates:{escape:function(e,t){if(t)return e;var s={"<":"<",">":">",'"':""","'":"'","`":"`"};return/[&<>"'`]/.test(e)?(e=e.replace(/&(?![a-z0-9#]{1,6};)/,"&")).replace(/[<>"'`]/g,function(e){return s[e]}):e},message:function(e,t,s){var n="";return e!==E&&t!==E&&(n+='',s&&(n+='"),n+='
'+e+"
",n+="
"),n},category:function(e,s,n){var r="",i=q.fn.search.settings.templates.escape;return e[s.categoryResults]!==E&&(q.each(e[s.categoryResults],function(e,t){t[s.results]!==E&&0',t[s.categoryName]!==E&&(r+=''+i(t[s.categoryName],n)+"
"),r+='',q.each(t.results,function(e,t){t[s.url]?r+='
':r+=' ',t[s.image]!==E&&(r+=''),r+='',t[s.price]!==E&&(r+='
'+i(t[s.price],n)+"
"),t[s.title]!==E&&(r+='
'+i(t[s.title],n)+"
"),t[s.description]!==E&&(r+='
'+i(t[s.description],n)+"
"),r+="
",r+=" "}),r+="
",r+="")}),e[s.action]&&(!1===s.actionURL?r+=''+i(e[s.action][s.actionText],n)+"
":r+=''+i(e[s.action][s.actionText],n)+" "),r)},standard:function(e,s,n){var r="",i=q.fn.search.settings.templates.escape;return e[s.results]!==E&&(q.each(e[s.results],function(e,t){t[s.url]?r+='':r+=' ',t[s.image]!==E&&(r+=''),r+='',t[s.price]!==E&&(r+='
'+i(t[s.price],n)+"
"),t[s.title]!==E&&(r+='
'+i(t[s.title],n)+"
"),t[s.description]!==E&&(r+='
'+i(t[s.description],n)+"
"),r+="
",r+=" "}),e[s.action]&&(!1===s.actionURL?r+=''+i(e[s.action][s.actionText],n)+"
":r+=''+i(e[s.action][s.actionText],n)+" "),r)}}}}(jQuery,window,document);
\ No newline at end of file
diff --git a/public/dist/components/segment.css b/public/dist/components/segment.css
new file mode 100644
index 000000000..9a8191ebf
--- /dev/null
+++ b/public/dist/components/segment.css
@@ -0,0 +1,896 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Segment
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+
+/*******************************
+ Segment
+*******************************/
+
+.ui.segment {
+ position: relative;
+ background: #FFFFFF;
+ -webkit-box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15);
+ box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15);
+ margin: 1rem 0;
+ padding: 1em 1em;
+ border-radius: 0.28571429rem;
+ border: 1px solid rgba(34, 36, 38, 0.15);
+}
+.ui.segment:first-child {
+ margin-top: 0;
+}
+.ui.segment:last-child {
+ margin-bottom: 0;
+}
+
+/* Vertical */
+.ui.vertical.segment {
+ margin: 0;
+ padding-left: 0;
+ padding-right: 0;
+ background: none transparent;
+ border-radius: 0;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ border: none;
+ border-bottom: 1px solid rgba(34, 36, 38, 0.15);
+}
+.ui.vertical.segment:last-child {
+ border-bottom: none;
+}
+
+/*-------------------
+ Loose Coupling
+--------------------*/
+
+
+/* Header */
+.ui.inverted.segments .segment > .ui.header .sub.header,
+.ui.inverted.segments .segment > .ui.header,
+.ui.inverted.segment > .ui.header .sub.header,
+.ui.inverted.segment > .ui.header {
+ color: #FFFFFF;
+}
+
+/* Label */
+.ui[class*="bottom attached"].segment > [class*="top attached"].label {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+.ui[class*="top attached"].segment > [class*="bottom attached"].label {
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.ui.attached.segment:not(.top):not(.bottom) > [class*="top attached"].label {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+.ui.attached.segment:not(.top):not(.bottom) > [class*="bottom attached"].label {
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+}
+
+/* Grid */
+.ui.page.grid.segment,
+.ui.grid > .row > .ui.segment.column,
+.ui.grid > .ui.segment.column {
+ padding-top: 2em;
+ padding-bottom: 2em;
+}
+.ui.grid.segment {
+ margin: 1rem 0;
+ border-radius: 0.28571429rem;
+}
+
+/* Table */
+.ui.basic.table.segment {
+ background: #FFFFFF;
+ border: 1px solid rgba(34, 36, 38, 0.15);
+ -webkit-box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15);
+ box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15);
+}
+.ui[class*="very basic"].table.segment {
+ padding: 1em 1em;
+}
+
+/* Tab */
+.ui.segment.tab:last-child {
+ margin-bottom: 1rem;
+}
+
+
+/*******************************
+ Types
+*******************************/
+
+
+/*-------------------
+ Placeholder
+ --------------------*/
+
+.ui.placeholder.segment {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ -webkit-box-pack: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ -webkit-box-align: stretch;
+ -ms-flex-align: stretch;
+ align-items: stretch;
+ max-width: initial;
+ -webkit-animation: none;
+ animation: none;
+ overflow: visible;
+ padding: 1em 1em;
+ min-height: 18rem;
+ background: #F9FAFB;
+ border-color: rgba(34, 36, 38, 0.15);
+ -webkit-box-shadow: 0 2px 25px 0 rgba(34, 36, 38, 0.05) inset;
+ box-shadow: 0 2px 25px 0 rgba(34, 36, 38, 0.05) inset;
+}
+.ui.placeholder.segment.tab {
+ display: none;
+}
+.ui.placeholder.segment.tab.active {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+}
+.ui.placeholder.segment .button,
+.ui.placeholder.segment textarea {
+ display: block;
+}
+.ui.placeholder.segment .field,
+.ui.placeholder.segment textarea,
+.ui.placeholder.segment > .ui.input,
+.ui.placeholder.segment .button {
+ max-width: 15rem;
+ margin-left: auto;
+ margin-right: auto;
+}
+.ui.placeholder.segment .column .button,
+.ui.placeholder.segment .column .field,
+.ui.placeholder.segment .column textarea,
+.ui.placeholder.segment .column > .ui.input {
+ max-width: 15rem;
+ margin-left: auto;
+ margin-right: auto;
+}
+.ui.placeholder.segment > .inline {
+ -ms-flex-item-align: center;
+ align-self: center;
+}
+.ui.placeholder.segment > .inline > .button {
+ display: inline-block;
+ width: auto;
+ margin: 0 0.35714286rem 0 0;
+}
+.ui.placeholder.segment > .inline > .button:last-child {
+ margin-right: 0;
+}
+
+/*-------------------
+ Piled
+ --------------------*/
+
+.ui.piled.segments,
+.ui.piled.segment {
+ margin: 3em 0;
+ -webkit-box-shadow: '';
+ box-shadow: '';
+ z-index: auto;
+}
+.ui.piled.segment:first-child {
+ margin-top: 0;
+}
+.ui.piled.segment:last-child {
+ margin-bottom: 0;
+}
+.ui.piled.segments:after,
+.ui.piled.segments:before,
+.ui.piled.segment:after,
+.ui.piled.segment:before {
+ background-color: #FFFFFF;
+ visibility: visible;
+ content: '';
+ display: block;
+ height: 100%;
+ left: 0;
+ position: absolute;
+ width: 100%;
+ border: 1px solid rgba(34, 36, 38, 0.15);
+ -webkit-box-shadow: '';
+ box-shadow: '';
+}
+.ui.piled.segments:before,
+.ui.piled.segment:before {
+ -webkit-transform: rotate(-1.2deg);
+ transform: rotate(-1.2deg);
+ top: 0;
+ z-index: -2;
+}
+.ui.piled.segments:after,
+.ui.piled.segment:after {
+ -webkit-transform: rotate(1.2deg);
+ transform: rotate(1.2deg);
+ top: 0;
+ z-index: -1;
+}
+
+/* Piled Attached */
+.ui[class*="top attached"].piled.segment {
+ margin-top: 3em;
+ margin-bottom: 0;
+}
+.ui.piled.segment[class*="top attached"]:first-child {
+ margin-top: 0;
+}
+.ui.piled.segment[class*="bottom attached"] {
+ margin-top: 0;
+ margin-bottom: 3em;
+}
+.ui.piled.segment[class*="bottom attached"]:last-child {
+ margin-bottom: 0;
+}
+
+/*-------------------
+ Stacked
+ --------------------*/
+
+.ui.stacked.segment {
+ padding-bottom: 1.4em;
+}
+.ui.stacked.segments:before,
+.ui.stacked.segments:after,
+.ui.stacked.segment:before,
+.ui.stacked.segment:after {
+ content: '';
+ position: absolute;
+ bottom: -3px;
+ left: 0;
+ border-top: 1px solid rgba(34, 36, 38, 0.15);
+ background: rgba(0, 0, 0, 0.03);
+ width: 100%;
+ height: 6px;
+ visibility: visible;
+}
+.ui.stacked.segments:before,
+.ui.stacked.segment:before {
+ display: none;
+}
+
+/* Add additional page */
+.ui.tall.stacked.segments:before,
+.ui.tall.stacked.segment:before {
+ display: block;
+ bottom: 0;
+}
+
+/* Inverted */
+.ui.stacked.inverted.segments:before,
+.ui.stacked.inverted.segments:after,
+.ui.stacked.inverted.segment:before,
+.ui.stacked.inverted.segment:after {
+ background-color: rgba(0, 0, 0, 0.03);
+ border-top: 1px solid rgba(34, 36, 38, 0.35);
+}
+
+/*-------------------
+ Padded
+ --------------------*/
+
+.ui.padded.segment {
+ padding: 1.5em;
+}
+.ui[class*="very padded"].segment {
+ padding: 3em;
+}
+
+/* Padded vertical */
+.ui.padded.segment.vertical.segment,
+.ui[class*="very padded"].vertical.segment {
+ padding-left: 0;
+ padding-right: 0;
+}
+
+/*-------------------
+ Compact
+ --------------------*/
+
+.ui.compact.segment {
+ display: table;
+}
+
+/* Compact Group */
+.ui.compact.segments {
+ display: -webkit-inline-box;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+}
+.ui.compact.segments .segment,
+.ui.segments .compact.segment {
+ display: block;
+ -webkit-box-flex: 0;
+ -ms-flex: 0 1 auto;
+ flex: 0 1 auto;
+}
+
+/*-------------------
+ Circular
+ --------------------*/
+
+.ui.circular.segment {
+ display: table-cell;
+ padding: 2em;
+ text-align: center;
+ vertical-align: middle;
+ border-radius: 500em;
+}
+
+/*-------------------
+ Raised
+ --------------------*/
+
+.ui.raised.raised.segments,
+.ui.raised.raised.segment {
+ -webkit-box-shadow: 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15);
+ box-shadow: 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15);
+}
+
+
+/*******************************
+ Groups
+ *******************************/
+
+
+/* Group */
+.ui.segments {
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ position: relative;
+ margin: 1rem 0;
+ border: 1px solid rgba(34, 36, 38, 0.15);
+ -webkit-box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15);
+ box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15);
+ border-radius: 0.28571429rem;
+}
+.ui.segments:first-child {
+ margin-top: 0;
+}
+.ui.segments:last-child {
+ margin-bottom: 0;
+}
+
+/* Nested Segment */
+.ui.segments > .segment {
+ top: 0;
+ bottom: 0;
+ border-radius: 0;
+ margin: 0;
+ width: auto;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ border: none;
+ border-top: 1px solid rgba(34, 36, 38, 0.15);
+}
+.ui.segments:not(.horizontal) > .segment:first-child {
+ top: 0;
+ bottom: 0;
+ border-top: none;
+ margin-top: 0;
+ margin-bottom: 0;
+ border-radius: 0.28571429rem 0.28571429rem 0 0;
+}
+
+/* Bottom */
+.ui.segments:not(.horizontal) > .segment:last-child {
+ top: 0;
+ bottom: 0;
+ margin-top: 0;
+ margin-bottom: 0;
+ -webkit-box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15), none;
+ box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15), none;
+ border-radius: 0 0 0.28571429rem 0.28571429rem;
+}
+
+/* Only */
+.ui.segments:not(.horizontal) > .segment:only-child {
+ border-radius: 0.28571429rem;
+}
+
+/* Nested Group */
+.ui.segments > .ui.segments {
+ border-top: 1px solid rgba(34, 36, 38, 0.15);
+ margin: 1rem 1rem;
+}
+.ui.segments > .segments:first-child {
+ border-top: none;
+}
+.ui.segments > .segment + .segments:not(.horizontal) {
+ margin-top: 0;
+}
+
+/* Horizontal Group */
+.ui.horizontal.segments {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ background-color: transparent;
+ padding: 0;
+ -webkit-box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15);
+ box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15);
+ margin: 1rem 0;
+ border-radius: 0.28571429rem;
+ border: 1px solid rgba(34, 36, 38, 0.15);
+}
+.ui.stackable.horizontal.segments {
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+}
+
+/* Nested Horizontal Group */
+.ui.segments > .horizontal.segments {
+ margin: 0;
+ background-color: transparent;
+ border-radius: 0;
+ border: none;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ border-top: 1px solid rgba(34, 36, 38, 0.15);
+}
+
+/* Horizontal Segment */
+.ui.horizontal.segments:not(.compact) > .segment:not(.compact) {
+ -webkit-box-flex: 1;
+ flex: 1 1 auto;
+ -ms-flex: 1 1 0;
+
+/* Solves #2550 MS Flex */
+}
+.ui.horizontal.segments > .segment {
+ margin: 0;
+ min-width: 0;
+ border-radius: 0;
+ border: none;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ border-left: 1px solid rgba(34, 36, 38, 0.15);
+}
+
+/* Border Fixes */
+.ui.segments > .horizontal.segments:first-child {
+ border-top: none;
+}
+.ui.horizontal.segments:not(.stackable) > .segment:first-child {
+ border-left: none;
+}
+.ui.horizontal.segments > .segment:first-child {
+ border-radius: 0.28571429rem 0 0 0.28571429rem;
+}
+.ui.horizontal.segments > .segment:last-child {
+ border-radius: 0 0.28571429rem 0.28571429rem 0;
+}
+
+/* Equal Width */
+.ui[class*="equal width"].horizontal.segments > .segment {
+ width: 100%;
+}
+
+
+/*******************************
+ States
+*******************************/
+
+
+/*--------------
+ Disabled
+ ---------------*/
+
+.ui.disabled.segments,
+.ui.disabled.segment {
+ opacity: 0.45;
+ color: rgba(40, 40, 40, 0.3);
+ pointer-events: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+
+/*--------------
+ Loading
+ ---------------*/
+
+.ui.loading.segments,
+.ui.loading.segment {
+ position: relative;
+ cursor: default;
+ pointer-events: none;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ -webkit-transition: all 0s linear;
+ transition: all 0s linear;
+}
+.ui.loading.segments:before,
+.ui.loading.segment:before {
+ position: absolute;
+ content: '';
+ top: 0;
+ left: 0;
+ background: rgba(255, 255, 255, 0.8);
+ width: 100%;
+ height: 100%;
+ border-radius: 0.28571429rem;
+ z-index: 100;
+}
+.ui.loading.segments:after,
+.ui.loading.segment:after {
+ position: absolute;
+ content: '';
+ top: 50%;
+ left: 50%;
+ margin: -1.5em 0 0 -1.5em;
+ width: 3em;
+ height: 3em;
+ -webkit-animation: loader 0.6s infinite linear;
+ animation: loader 0.6s infinite linear;
+ border: 0.2em solid #767676;
+ border-radius: 500rem;
+ -webkit-box-shadow: 0 0 0 1px transparent;
+ box-shadow: 0 0 0 1px transparent;
+ visibility: visible;
+ z-index: 101;
+}
+
+
+/*******************************
+ Variations
+*******************************/
+
+
+/*-------------------
+ Basic
+ --------------------*/
+
+.ui.basic.segment,
+.ui.segments .ui.basic.segment,
+.ui.basic.segments {
+ background: none transparent;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ border: none;
+ border-radius: 0;
+}
+
+/*-------------------
+ Clearing
+ --------------------*/
+
+.ui.clearing.segment:after {
+ content: "";
+ display: block;
+ clear: both;
+}
+
+/*-------------------
+ Colors
+--------------------*/
+
+.ui.red.segment.segment.segment.segment.segment:not(.inverted) {
+ border-top: 2px solid #DB2828;
+}
+.ui.inverted.red.segment.segment.segment.segment.segment {
+ background-color: #DB2828;
+ color: #FFFFFF;
+}
+.ui.orange.segment.segment.segment.segment.segment:not(.inverted) {
+ border-top: 2px solid #F2711C;
+}
+.ui.inverted.orange.segment.segment.segment.segment.segment {
+ background-color: #F2711C;
+ color: #FFFFFF;
+}
+.ui.yellow.segment.segment.segment.segment.segment:not(.inverted) {
+ border-top: 2px solid #FBBD08;
+}
+.ui.inverted.yellow.segment.segment.segment.segment.segment {
+ background-color: #FBBD08;
+ color: #FFFFFF;
+}
+.ui.olive.segment.segment.segment.segment.segment:not(.inverted) {
+ border-top: 2px solid #B5CC18;
+}
+.ui.inverted.olive.segment.segment.segment.segment.segment {
+ background-color: #B5CC18;
+ color: #FFFFFF;
+}
+.ui.green.segment.segment.segment.segment.segment:not(.inverted) {
+ border-top: 2px solid #21BA45;
+}
+.ui.inverted.green.segment.segment.segment.segment.segment {
+ background-color: #21BA45;
+ color: #FFFFFF;
+}
+.ui.teal.segment.segment.segment.segment.segment:not(.inverted) {
+ border-top: 2px solid #00B5AD;
+}
+.ui.inverted.teal.segment.segment.segment.segment.segment {
+ background-color: #00B5AD;
+ color: #FFFFFF;
+}
+.ui.blue.segment.segment.segment.segment.segment:not(.inverted) {
+ border-top: 2px solid #2185D0;
+}
+.ui.inverted.blue.segment.segment.segment.segment.segment {
+ background-color: #2185D0;
+ color: #FFFFFF;
+}
+.ui.violet.segment.segment.segment.segment.segment:not(.inverted) {
+ border-top: 2px solid #6435C9;
+}
+.ui.inverted.violet.segment.segment.segment.segment.segment {
+ background-color: #6435C9;
+ color: #FFFFFF;
+}
+.ui.purple.segment.segment.segment.segment.segment:not(.inverted) {
+ border-top: 2px solid #A333C8;
+}
+.ui.inverted.purple.segment.segment.segment.segment.segment {
+ background-color: #A333C8;
+ color: #FFFFFF;
+}
+.ui.pink.segment.segment.segment.segment.segment:not(.inverted) {
+ border-top: 2px solid #E03997;
+}
+.ui.inverted.pink.segment.segment.segment.segment.segment {
+ background-color: #E03997;
+ color: #FFFFFF;
+}
+.ui.brown.segment.segment.segment.segment.segment:not(.inverted) {
+ border-top: 2px solid #A5673F;
+}
+.ui.inverted.brown.segment.segment.segment.segment.segment {
+ background-color: #A5673F;
+ color: #FFFFFF;
+}
+.ui.grey.segment.segment.segment.segment.segment:not(.inverted) {
+ border-top: 2px solid #767676;
+}
+.ui.inverted.grey.segment.segment.segment.segment.segment {
+ background-color: #767676;
+ color: #FFFFFF;
+}
+.ui.black.segment.segment.segment.segment.segment:not(.inverted) {
+ border-top: 2px solid #1B1C1D;
+}
+.ui.inverted.black.segment.segment.segment.segment.segment {
+ background-color: #1B1C1D;
+ color: #FFFFFF;
+}
+
+/*-------------------
+ Aligned
+ --------------------*/
+
+.ui[class*="left aligned"].segment {
+ text-align: left;
+}
+.ui[class*="right aligned"].segment {
+ text-align: right;
+}
+.ui[class*="center aligned"].segment {
+ text-align: center;
+}
+
+/*-------------------
+ Floated
+ --------------------*/
+
+.ui.floated.segment,
+.ui[class*="left floated"].segment {
+ float: left;
+ margin-right: 1em;
+}
+.ui[class*="right floated"].segment {
+ float: right;
+ margin-left: 1em;
+}
+
+/*-------------------
+ Inverted
+ --------------------*/
+
+.ui.inverted.segments,
+.ui.inverted.segments .segment,
+.ui.inverted.segment {
+ border: none;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
+.ui.inverted.segments .segment,
+.ui.inverted.segment,
+.ui.primary.inverted.segment {
+ background: #1B1C1D;
+ color: rgba(255, 255, 255, 0.9);
+}
+
+/* Nested */
+.ui.inverted.segment .segment {
+ color: rgba(0, 0, 0, 0.87);
+}
+.ui.inverted.segment .inverted.segment {
+ color: rgba(255, 255, 255, 0.9);
+}
+
+/* Attached */
+.ui.inverted.attached.segment {
+ border-color: #555555;
+}
+
+/* Loading */
+.ui.inverted.loading.segments,
+.ui.inverted.loading.segment {
+ color: #FFFFFF;
+}
+.ui.inverted.loading.segments:before,
+.ui.inverted.loading.segment:before {
+ background: rgba(0, 0, 0, 0.85);
+}
+
+/*-------------------
+ Emphasis
+--------------------*/
+
+
+/* Secondary */
+.ui.secondary.segment {
+ background: #F3F4F5;
+ color: rgba(0, 0, 0, 0.6);
+}
+.ui.secondary.inverted.segment {
+ background: #4c4f52 -webkit-gradient(linear, left top, left bottom, color-stop(0, rgba(255, 255, 255, 0.2)), to(rgba(255, 255, 255, 0.2)));
+ background: #4c4f52 -webkit-linear-gradient(rgba(255, 255, 255, 0.2) 0, rgba(255, 255, 255, 0.2) 100%);
+ background: #4c4f52 linear-gradient(rgba(255, 255, 255, 0.2) 0, rgba(255, 255, 255, 0.2) 100%);
+ color: rgba(255, 255, 255, 0.8);
+}
+
+/* Tertiary */
+.ui.tertiary.segment {
+ background: #DCDDDE;
+ color: rgba(0, 0, 0, 0.6);
+}
+.ui.tertiary.inverted.segment {
+ background: #717579 -webkit-gradient(linear, left top, left bottom, color-stop(0, rgba(255, 255, 255, 0.35)), to(rgba(255, 255, 255, 0.35)));
+ background: #717579 -webkit-linear-gradient(rgba(255, 255, 255, 0.35) 0, rgba(255, 255, 255, 0.35) 100%);
+ background: #717579 linear-gradient(rgba(255, 255, 255, 0.35) 0, rgba(255, 255, 255, 0.35) 100%);
+ color: rgba(255, 255, 255, 0.8);
+}
+
+/*-------------------
+ Attached
+ --------------------*/
+
+
+/* Middle */
+.ui.attached.segment {
+ top: 0;
+ bottom: 0;
+ border-radius: 0;
+ margin: 0 -1px;
+ width: calc(100% + 2px);
+ max-width: calc(100% + 2px);
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ border: 1px solid #D4D4D5;
+}
+.ui.attached:not(.message) + .ui.attached.segment:not(.top) {
+ border-top: none;
+}
+
+/* Top */
+.ui[class*="top attached"].segment {
+ bottom: 0;
+ margin-bottom: 0;
+ top: 0;
+ margin-top: 1rem;
+ border-radius: 0.28571429rem 0.28571429rem 0 0;
+}
+.ui.segment[class*="top attached"]:first-child {
+ margin-top: 0;
+}
+
+/* Bottom */
+.ui.segment[class*="bottom attached"] {
+ bottom: 0;
+ margin-top: 0;
+ top: 0;
+ margin-bottom: 1rem;
+ -webkit-box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15), none;
+ box-shadow: 0 1px 2px 0 rgba(34, 36, 38, 0.15), none;
+ border-radius: 0 0 0.28571429rem 0.28571429rem;
+}
+.ui.segment[class*="bottom attached"]:last-child {
+ margin-bottom: 1rem;
+}
+
+/*--------------
+ Fitted
+ ---------------*/
+
+.ui.fitted.segment:not(.horizontally) {
+ padding-top: 0;
+ padding-bottom: 0;
+}
+.ui.fitted.segment:not(.vertically) {
+ padding-left: 0;
+ padding-right: 0;
+}
+
+/*-------------------
+ Size
+--------------------*/
+
+.ui.segments .segment,
+.ui.segment {
+ font-size: 1rem;
+}
+.ui.mini.segments .segment,
+.ui.mini.segment {
+ font-size: 0.78571429rem;
+}
+.ui.tiny.segments .segment,
+.ui.tiny.segment {
+ font-size: 0.85714286rem;
+}
+.ui.small.segments .segment,
+.ui.small.segment {
+ font-size: 0.92857143rem;
+}
+.ui.large.segments .segment,
+.ui.large.segment {
+ font-size: 1.14285714rem;
+}
+.ui.big.segments .segment,
+.ui.big.segment {
+ font-size: 1.28571429rem;
+}
+.ui.huge.segments .segment,
+.ui.huge.segment {
+ font-size: 1.42857143rem;
+}
+.ui.massive.segments .segment,
+.ui.massive.segment {
+ font-size: 1.71428571rem;
+}
+
+
+/*******************************
+ Theme Overrides
+*******************************/
+
+
+
+/*******************************
+ Site Overrides
+*******************************/
+
diff --git a/public/dist/components/segment.min.css b/public/dist/components/segment.min.css
new file mode 100644
index 000000000..7450e3392
--- /dev/null
+++ b/public/dist/components/segment.min.css
@@ -0,0 +1,9 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Segment
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */.ui.segment{position:relative;background:#fff;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15);margin:1rem 0;padding:1em 1em;border-radius:.28571429rem;border:1px solid rgba(34,36,38,.15)}.ui.segment:first-child{margin-top:0}.ui.segment:last-child{margin-bottom:0}.ui.vertical.segment{margin:0;padding-left:0;padding-right:0;background:none transparent;border-radius:0;-webkit-box-shadow:none;box-shadow:none;border:none;border-bottom:1px solid rgba(34,36,38,.15)}.ui.vertical.segment:last-child{border-bottom:none}.ui.inverted.segment>.ui.header,.ui.inverted.segment>.ui.header .sub.header,.ui.inverted.segments .segment>.ui.header,.ui.inverted.segments .segment>.ui.header .sub.header{color:#fff}.ui[class*="bottom attached"].segment>[class*="top attached"].label{border-top-left-radius:0;border-top-right-radius:0}.ui[class*="top attached"].segment>[class*="bottom attached"].label{border-bottom-left-radius:0;border-bottom-right-radius:0}.ui.attached.segment:not(.top):not(.bottom)>[class*="top attached"].label{border-top-left-radius:0;border-top-right-radius:0}.ui.attached.segment:not(.top):not(.bottom)>[class*="bottom attached"].label{border-bottom-left-radius:0;border-bottom-right-radius:0}.ui.grid>.row>.ui.segment.column,.ui.grid>.ui.segment.column,.ui.page.grid.segment{padding-top:2em;padding-bottom:2em}.ui.grid.segment{margin:1rem 0;border-radius:.28571429rem}.ui.basic.table.segment{background:#fff;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15)}.ui[class*="very basic"].table.segment{padding:1em 1em}.ui.segment.tab:last-child{margin-bottom:1rem}.ui.placeholder.segment{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;max-width:initial;-webkit-animation:none;animation:none;overflow:visible;padding:1em 1em;min-height:18rem;background:#f9fafb;border-color:rgba(34,36,38,.15);-webkit-box-shadow:0 2px 25px 0 rgba(34,36,38,.05) inset;box-shadow:0 2px 25px 0 rgba(34,36,38,.05) inset}.ui.placeholder.segment.tab{display:none}.ui.placeholder.segment.tab.active{display:-webkit-box;display:-ms-flexbox;display:flex}.ui.placeholder.segment .button,.ui.placeholder.segment textarea{display:block}.ui.placeholder.segment .button,.ui.placeholder.segment .field,.ui.placeholder.segment textarea,.ui.placeholder.segment>.ui.input{max-width:15rem;margin-left:auto;margin-right:auto}.ui.placeholder.segment .column .button,.ui.placeholder.segment .column .field,.ui.placeholder.segment .column textarea,.ui.placeholder.segment .column>.ui.input{max-width:15rem;margin-left:auto;margin-right:auto}.ui.placeholder.segment>.inline{-ms-flex-item-align:center;align-self:center}.ui.placeholder.segment>.inline>.button{display:inline-block;width:auto;margin:0 .35714286rem 0 0}.ui.placeholder.segment>.inline>.button:last-child{margin-right:0}.ui.piled.segment,.ui.piled.segments{margin:3em 0;-webkit-box-shadow:'';box-shadow:'';z-index:auto}.ui.piled.segment:first-child{margin-top:0}.ui.piled.segment:last-child{margin-bottom:0}.ui.piled.segment:after,.ui.piled.segment:before,.ui.piled.segments:after,.ui.piled.segments:before{background-color:#fff;visibility:visible;content:'';display:block;height:100%;left:0;position:absolute;width:100%;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:'';box-shadow:''}.ui.piled.segment:before,.ui.piled.segments:before{-webkit-transform:rotate(-1.2deg);transform:rotate(-1.2deg);top:0;z-index:-2}.ui.piled.segment:after,.ui.piled.segments:after{-webkit-transform:rotate(1.2deg);transform:rotate(1.2deg);top:0;z-index:-1}.ui[class*="top attached"].piled.segment{margin-top:3em;margin-bottom:0}.ui.piled.segment[class*="top attached"]:first-child{margin-top:0}.ui.piled.segment[class*="bottom attached"]{margin-top:0;margin-bottom:3em}.ui.piled.segment[class*="bottom attached"]:last-child{margin-bottom:0}.ui.stacked.segment{padding-bottom:1.4em}.ui.stacked.segment:after,.ui.stacked.segment:before,.ui.stacked.segments:after,.ui.stacked.segments:before{content:'';position:absolute;bottom:-3px;left:0;border-top:1px solid rgba(34,36,38,.15);background:rgba(0,0,0,.03);width:100%;height:6px;visibility:visible}.ui.stacked.segment:before,.ui.stacked.segments:before{display:none}.ui.tall.stacked.segment:before,.ui.tall.stacked.segments:before{display:block;bottom:0}.ui.stacked.inverted.segment:after,.ui.stacked.inverted.segment:before,.ui.stacked.inverted.segments:after,.ui.stacked.inverted.segments:before{background-color:rgba(0,0,0,.03);border-top:1px solid rgba(34,36,38,.35)}.ui.padded.segment{padding:1.5em}.ui[class*="very padded"].segment{padding:3em}.ui.padded.segment.vertical.segment,.ui[class*="very padded"].vertical.segment{padding-left:0;padding-right:0}.ui.compact.segment{display:table}.ui.compact.segments{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.ui.compact.segments .segment,.ui.segments .compact.segment{display:block;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto}.ui.circular.segment{display:table-cell;padding:2em;text-align:center;vertical-align:middle;border-radius:500em}.ui.raised.raised.segment,.ui.raised.raised.segments{-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.segments{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;position:relative;margin:1rem 0;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15);border-radius:.28571429rem}.ui.segments:first-child{margin-top:0}.ui.segments:last-child{margin-bottom:0}.ui.segments>.segment{top:0;bottom:0;border-radius:0;margin:0;width:auto;-webkit-box-shadow:none;box-shadow:none;border:none;border-top:1px solid rgba(34,36,38,.15)}.ui.segments:not(.horizontal)>.segment:first-child{top:0;bottom:0;border-top:none;margin-top:0;margin-bottom:0;border-radius:.28571429rem .28571429rem 0 0}.ui.segments:not(.horizontal)>.segment:last-child{top:0;bottom:0;margin-top:0;margin-bottom:0;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;border-radius:0 0 .28571429rem .28571429rem}.ui.segments:not(.horizontal)>.segment:only-child{border-radius:.28571429rem}.ui.segments>.ui.segments{border-top:1px solid rgba(34,36,38,.15);margin:1rem 1rem}.ui.segments>.segments:first-child{border-top:none}.ui.segments>.segment+.segments:not(.horizontal){margin-top:0}.ui.horizontal.segments{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;background-color:transparent;padding:0;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15);box-shadow:0 1px 2px 0 rgba(34,36,38,.15);margin:1rem 0;border-radius:.28571429rem;border:1px solid rgba(34,36,38,.15)}.ui.stackable.horizontal.segments{-ms-flex-wrap:wrap;flex-wrap:wrap}.ui.segments>.horizontal.segments{margin:0;background-color:transparent;border-radius:0;border:none;-webkit-box-shadow:none;box-shadow:none;border-top:1px solid rgba(34,36,38,.15)}.ui.horizontal.segments:not(.compact)>.segment:not(.compact){-webkit-box-flex:1;flex:1 1 auto;-ms-flex:1 1 0}.ui.horizontal.segments>.segment{margin:0;min-width:0;border-radius:0;border:none;-webkit-box-shadow:none;box-shadow:none;border-left:1px solid rgba(34,36,38,.15)}.ui.segments>.horizontal.segments:first-child{border-top:none}.ui.horizontal.segments:not(.stackable)>.segment:first-child{border-left:none}.ui.horizontal.segments>.segment:first-child{border-radius:.28571429rem 0 0 .28571429rem}.ui.horizontal.segments>.segment:last-child{border-radius:0 .28571429rem .28571429rem 0}.ui[class*="equal width"].horizontal.segments>.segment{width:100%}.ui.disabled.segment,.ui.disabled.segments{opacity:.45;color:rgba(40,40,40,.3);pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ui.loading.segment,.ui.loading.segments{position:relative;cursor:default;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all 0s linear;transition:all 0s linear}.ui.loading.segment:before,.ui.loading.segments:before{position:absolute;content:'';top:0;left:0;background:rgba(255,255,255,.8);width:100%;height:100%;border-radius:.28571429rem;z-index:100}.ui.loading.segment:after,.ui.loading.segments:after{position:absolute;content:'';top:50%;left:50%;margin:-1.5em 0 0 -1.5em;width:3em;height:3em;-webkit-animation:loader .6s infinite linear;animation:loader .6s infinite linear;border:.2em solid #767676;border-radius:500rem;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent;visibility:visible;z-index:101}.ui.basic.segment,.ui.basic.segments,.ui.segments .ui.basic.segment{background:none transparent;-webkit-box-shadow:none;box-shadow:none;border:none;border-radius:0}.ui.clearing.segment:after{content:"";display:block;clear:both}.ui.red.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #db2828}.ui.inverted.red.segment.segment.segment.segment.segment{background-color:#db2828;color:#fff}.ui.orange.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #f2711c}.ui.inverted.orange.segment.segment.segment.segment.segment{background-color:#f2711c;color:#fff}.ui.yellow.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #fbbd08}.ui.inverted.yellow.segment.segment.segment.segment.segment{background-color:#fbbd08;color:#fff}.ui.olive.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #b5cc18}.ui.inverted.olive.segment.segment.segment.segment.segment{background-color:#b5cc18;color:#fff}.ui.green.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #21ba45}.ui.inverted.green.segment.segment.segment.segment.segment{background-color:#21ba45;color:#fff}.ui.teal.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #00b5ad}.ui.inverted.teal.segment.segment.segment.segment.segment{background-color:#00b5ad;color:#fff}.ui.blue.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #2185d0}.ui.inverted.blue.segment.segment.segment.segment.segment{background-color:#2185d0;color:#fff}.ui.violet.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #6435c9}.ui.inverted.violet.segment.segment.segment.segment.segment{background-color:#6435c9;color:#fff}.ui.purple.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #a333c8}.ui.inverted.purple.segment.segment.segment.segment.segment{background-color:#a333c8;color:#fff}.ui.pink.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #e03997}.ui.inverted.pink.segment.segment.segment.segment.segment{background-color:#e03997;color:#fff}.ui.brown.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #a5673f}.ui.inverted.brown.segment.segment.segment.segment.segment{background-color:#a5673f;color:#fff}.ui.grey.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #767676}.ui.inverted.grey.segment.segment.segment.segment.segment{background-color:#767676;color:#fff}.ui.black.segment.segment.segment.segment.segment:not(.inverted){border-top:2px solid #1b1c1d}.ui.inverted.black.segment.segment.segment.segment.segment{background-color:#1b1c1d;color:#fff}.ui[class*="left aligned"].segment{text-align:left}.ui[class*="right aligned"].segment{text-align:right}.ui[class*="center aligned"].segment{text-align:center}.ui.floated.segment,.ui[class*="left floated"].segment{float:left;margin-right:1em}.ui[class*="right floated"].segment{float:right;margin-left:1em}.ui.inverted.segment,.ui.inverted.segments,.ui.inverted.segments .segment{border:none;-webkit-box-shadow:none;box-shadow:none}.ui.inverted.segment,.ui.inverted.segments .segment,.ui.primary.inverted.segment{background:#1b1c1d;color:rgba(255,255,255,.9)}.ui.inverted.segment .segment{color:rgba(0,0,0,.87)}.ui.inverted.segment .inverted.segment{color:rgba(255,255,255,.9)}.ui.inverted.attached.segment{border-color:#555}.ui.inverted.loading.segment,.ui.inverted.loading.segments{color:#fff}.ui.inverted.loading.segment:before,.ui.inverted.loading.segments:before{background:rgba(0,0,0,.85)}.ui.secondary.segment{background:#f3f4f5;color:rgba(0,0,0,.6)}.ui.secondary.inverted.segment{background:#4c4f52 -webkit-gradient(linear,left top,left bottom,color-stop(0,rgba(255,255,255,.2)),to(rgba(255,255,255,.2)));background:#4c4f52 -webkit-linear-gradient(rgba(255,255,255,.2) 0,rgba(255,255,255,.2) 100%);background:#4c4f52 linear-gradient(rgba(255,255,255,.2) 0,rgba(255,255,255,.2) 100%);color:rgba(255,255,255,.8)}.ui.tertiary.segment{background:#dcddde;color:rgba(0,0,0,.6)}.ui.tertiary.inverted.segment{background:#717579 -webkit-gradient(linear,left top,left bottom,color-stop(0,rgba(255,255,255,.35)),to(rgba(255,255,255,.35)));background:#717579 -webkit-linear-gradient(rgba(255,255,255,.35) 0,rgba(255,255,255,.35) 100%);background:#717579 linear-gradient(rgba(255,255,255,.35) 0,rgba(255,255,255,.35) 100%);color:rgba(255,255,255,.8)}.ui.attached.segment{top:0;bottom:0;border-radius:0;margin:0 -1px;width:calc(100% + 2px);max-width:calc(100% + 2px);-webkit-box-shadow:none;box-shadow:none;border:1px solid #d4d4d5}.ui.attached:not(.message)+.ui.attached.segment:not(.top){border-top:none}.ui[class*="top attached"].segment{bottom:0;margin-bottom:0;top:0;margin-top:1rem;border-radius:.28571429rem .28571429rem 0 0}.ui.segment[class*="top attached"]:first-child{margin-top:0}.ui.segment[class*="bottom attached"]{bottom:0;margin-top:0;top:0;margin-bottom:1rem;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),none;border-radius:0 0 .28571429rem .28571429rem}.ui.segment[class*="bottom attached"]:last-child{margin-bottom:1rem}.ui.fitted.segment:not(.horizontally){padding-top:0;padding-bottom:0}.ui.fitted.segment:not(.vertically){padding-left:0;padding-right:0}.ui.segment,.ui.segments .segment{font-size:1rem}.ui.mini.segment,.ui.mini.segments .segment{font-size:.78571429rem}.ui.tiny.segment,.ui.tiny.segments .segment{font-size:.85714286rem}.ui.small.segment,.ui.small.segments .segment{font-size:.92857143rem}.ui.large.segment,.ui.large.segments .segment{font-size:1.14285714rem}.ui.big.segment,.ui.big.segments .segment{font-size:1.28571429rem}.ui.huge.segment,.ui.huge.segments .segment{font-size:1.42857143rem}.ui.massive.segment,.ui.massive.segments .segment{font-size:1.71428571rem}
\ No newline at end of file
diff --git a/public/dist/components/shape.css b/public/dist/components/shape.css
new file mode 100644
index 000000000..fcc213849
--- /dev/null
+++ b/public/dist/components/shape.css
@@ -0,0 +1,160 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Shape
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+
+/*******************************
+ Shape
+*******************************/
+
+.ui.shape {
+ position: relative;
+ vertical-align: top;
+ display: inline-block;
+ -webkit-perspective: 2000px;
+ perspective: 2000px;
+ -webkit-transition: left 0.6s ease-in-out, width 0.6s ease-in-out, height 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out;
+ transition: left 0.6s ease-in-out, width 0.6s ease-in-out, height 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out;
+ transition: transform 0.6s ease-in-out, left 0.6s ease-in-out, width 0.6s ease-in-out, height 0.6s ease-in-out;
+ transition: transform 0.6s ease-in-out, left 0.6s ease-in-out, width 0.6s ease-in-out, height 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out;
+}
+.ui.shape .side,
+.ui.shape .sides {
+ -webkit-transform-style: preserve-3d;
+ transform-style: preserve-3d;
+}
+.ui.shape .side {
+ display: none;
+ opacity: 1;
+ width: 100%;
+ margin: 0 !important;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+}
+.ui.shape .side * {
+ -webkit-backface-visibility: visible !important;
+ backface-visibility: visible !important;
+}
+
+
+/*******************************
+ Types
+*******************************/
+
+.ui.cube.shape .side {
+ min-width: 15em;
+ height: 15em;
+ padding: 2em;
+ background-color: #E6E6E6;
+ color: rgba(0, 0, 0, 0.87);
+ -webkit-box-shadow: 0 0 2px rgba(0, 0, 0, 0.3);
+ box-shadow: 0 0 2px rgba(0, 0, 0, 0.3);
+}
+.ui.cube.shape .side > .content {
+ width: 100%;
+ height: 100%;
+ display: table;
+ text-align: center;
+ -webkit-user-select: text;
+ -moz-user-select: text;
+ -ms-user-select: text;
+ user-select: text;
+}
+.ui.cube.shape .side > .content > div {
+ display: table-cell;
+ vertical-align: middle;
+ font-size: 2em;
+}
+
+
+/*******************************
+ Variations
+*******************************/
+
+.ui.text.shape.animating .sides {
+ position: static;
+}
+.ui.text.shape .side {
+ white-space: nowrap;
+}
+.ui.text.shape .side > * {
+ white-space: normal;
+}
+
+
+/*******************************
+ States
+*******************************/
+
+
+/*--------------
+ Loading
+ ---------------*/
+
+.ui.loading.shape {
+ position: absolute;
+ top: -9999px;
+ left: -9999px;
+}
+
+/*--------------
+ Animating
+---------------*/
+
+.ui.shape .animating.side {
+ position: absolute;
+ top: 0;
+ left: 0;
+ display: block;
+ z-index: 100;
+}
+.ui.shape .hidden.side {
+ opacity: 0.6;
+}
+
+/*--------------
+ CSS
+---------------*/
+
+.ui.shape.animating .sides {
+ position: absolute;
+ -webkit-transition: left 0.6s ease-in-out, width 0.6s ease-in-out, height 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out;
+ transition: left 0.6s ease-in-out, width 0.6s ease-in-out, height 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out;
+ transition: transform 0.6s ease-in-out, left 0.6s ease-in-out, width 0.6s ease-in-out, height 0.6s ease-in-out;
+ transition: transform 0.6s ease-in-out, left 0.6s ease-in-out, width 0.6s ease-in-out, height 0.6s ease-in-out, -webkit-transform 0.6s ease-in-out;
+}
+.ui.shape.animating .side {
+ -webkit-transition: opacity 0.6s ease-in-out;
+ transition: opacity 0.6s ease-in-out;
+}
+.ui.shape .animating.side *,
+.ui.shape.animating .side * {
+ -webkit-transition: none;
+ transition: none;
+}
+
+/*--------------
+ Active
+---------------*/
+
+.ui.shape .active.side {
+ display: block;
+}
+
+
+/*******************************
+ Theme Overrides
+*******************************/
+
+
+
+/*******************************
+ User Overrides
+*******************************/
+
diff --git a/public/dist/components/shape.js b/public/dist/components/shape.js
new file mode 100644
index 000000000..247df53de
--- /dev/null
+++ b/public/dist/components/shape.js
@@ -0,0 +1,848 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Shape
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+'use strict';
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.shape = function(parameters) {
+ var
+ $allModules = $(this),
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+
+ requestAnimationFrame = window.requestAnimationFrame
+ || window.mozRequestAnimationFrame
+ || window.webkitRequestAnimationFrame
+ || window.msRequestAnimationFrame
+ || function(callback) { setTimeout(callback, 0); },
+
+ returnedValue
+ ;
+
+ $allModules
+ .each(function() {
+ var
+ moduleSelector = $allModules.selector || '',
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.fn.shape.settings, parameters)
+ : $.extend({}, $.fn.shape.settings),
+
+ // internal aliases
+ namespace = settings.namespace,
+ selector = settings.selector,
+ error = settings.error,
+ className = settings.className,
+
+ // define namespaces for modules
+ eventNamespace = '.' + namespace,
+ moduleNamespace = 'module-' + namespace,
+
+ // selector cache
+ $module = $(this),
+ $sides = $module.find('>' + selector.sides),
+ $side = $sides.find('>' + selector.side),
+
+ // private variables
+ nextIndex = false,
+ $activeSide,
+ $nextSide,
+
+ // standard module
+ element = this,
+ instance = $module.data(moduleNamespace),
+ module
+ ;
+
+ module = {
+
+ initialize: function() {
+ module.verbose('Initializing module for', element);
+ module.set.defaultSide();
+ module.instantiate();
+ },
+
+ instantiate: function() {
+ module.verbose('Storing instance of module', module);
+ instance = module;
+ $module
+ .data(moduleNamespace, instance)
+ ;
+ },
+
+ destroy: function() {
+ module.verbose('Destroying previous module for', element);
+ $module
+ .removeData(moduleNamespace)
+ .off(eventNamespace)
+ ;
+ },
+
+ refresh: function() {
+ module.verbose('Refreshing selector cache for', element);
+ $module = $(element);
+ $sides = $(this).find(selector.sides);
+ $side = $(this).find(selector.side);
+ },
+
+ repaint: function() {
+ module.verbose('Forcing repaint event');
+ var
+ shape = $sides[0] || document.createElement('div'),
+ fakeAssignment = shape.offsetWidth
+ ;
+ },
+
+ animate: function(propertyObject, callback) {
+ module.verbose('Animating box with properties', propertyObject);
+ callback = callback || function(event) {
+ module.verbose('Executing animation callback');
+ if(event !== undefined) {
+ event.stopPropagation();
+ }
+ module.reset();
+ module.set.active();
+ };
+ settings.beforeChange.call($nextSide[0]);
+ if(module.get.transitionEvent()) {
+ module.verbose('Starting CSS animation');
+ $module
+ .addClass(className.animating)
+ ;
+ $sides
+ .css(propertyObject)
+ .one(module.get.transitionEvent(), callback)
+ ;
+ module.set.duration(settings.duration);
+ requestAnimationFrame(function() {
+ $module
+ .addClass(className.animating)
+ ;
+ $activeSide
+ .addClass(className.hidden)
+ ;
+ });
+ }
+ else {
+ callback();
+ }
+ },
+
+ queue: function(method) {
+ module.debug('Queueing animation of', method);
+ $sides
+ .one(module.get.transitionEvent(), function() {
+ module.debug('Executing queued animation');
+ setTimeout(function(){
+ $module.shape(method);
+ }, 0);
+ })
+ ;
+ },
+
+ reset: function() {
+ module.verbose('Animating states reset');
+ $module
+ .removeClass(className.animating)
+ .attr('style', '')
+ .removeAttr('style')
+ ;
+ // removeAttr style does not consistently work in safari
+ $sides
+ .attr('style', '')
+ .removeAttr('style')
+ ;
+ $side
+ .attr('style', '')
+ .removeAttr('style')
+ .removeClass(className.hidden)
+ ;
+ $nextSide
+ .removeClass(className.animating)
+ .attr('style', '')
+ .removeAttr('style')
+ ;
+ },
+
+ is: {
+ complete: function() {
+ return ($side.filter('.' + className.active)[0] == $nextSide[0]);
+ },
+ animating: function() {
+ return $module.hasClass(className.animating);
+ },
+ hidden: function() {
+ return $module.closest(':hidden').length > 0;
+ }
+ },
+
+ set: {
+
+ defaultSide: function() {
+ $activeSide = $side.filter('.' + settings.className.active);
+ $nextSide = ( $activeSide.next(selector.side).length > 0 )
+ ? $activeSide.next(selector.side)
+ : $side.first()
+ ;
+ nextIndex = false;
+ module.verbose('Active side set to', $activeSide);
+ module.verbose('Next side set to', $nextSide);
+ },
+
+ duration: function(duration) {
+ duration = duration || settings.duration;
+ duration = (typeof duration == 'number')
+ ? duration + 'ms'
+ : duration
+ ;
+ module.verbose('Setting animation duration', duration);
+ if(settings.duration || settings.duration === 0) {
+ $sides.add($side)
+ .css({
+ '-webkit-transition-duration': duration,
+ '-moz-transition-duration': duration,
+ '-ms-transition-duration': duration,
+ '-o-transition-duration': duration,
+ 'transition-duration': duration
+ })
+ ;
+ }
+ },
+
+ currentStageSize: function() {
+ var
+ $activeSide = $side.filter('.' + settings.className.active),
+ width = $activeSide.outerWidth(true),
+ height = $activeSide.outerHeight(true)
+ ;
+ $module
+ .css({
+ width: width,
+ height: height
+ })
+ ;
+ },
+
+ stageSize: function() {
+ var
+ $clone = $module.clone().addClass(className.loading),
+ $side = $clone.find('>' + selector.sides + '>' + selector.side),
+ $activeSide = $side.filter('.' + settings.className.active),
+ $nextSide = (nextIndex)
+ ? $side.eq(nextIndex)
+ : ( $activeSide.next(selector.side).length > 0 )
+ ? $activeSide.next(selector.side)
+ : $side.first(),
+ newWidth = (settings.width === 'next')
+ ? $nextSide.outerWidth(true)
+ : (settings.width === 'initial')
+ ? $module.width()
+ : settings.width,
+ newHeight = (settings.height === 'next')
+ ? $nextSide.outerHeight(true)
+ : (settings.height === 'initial')
+ ? $module.height()
+ : settings.height
+ ;
+ $activeSide.removeClass(className.active);
+ $nextSide.addClass(className.active);
+ $clone.insertAfter($module);
+ $clone.remove();
+ if(settings.width !== 'auto') {
+ $module.css('width', newWidth + settings.jitter);
+ module.verbose('Specifying width during animation', newWidth);
+ }
+ if(settings.height !== 'auto') {
+ $module.css('height', newHeight + settings.jitter);
+ module.verbose('Specifying height during animation', newHeight);
+ }
+ },
+
+ nextSide: function(selector) {
+ nextIndex = selector;
+ $nextSide = $side.filter(selector);
+ nextIndex = $side.index($nextSide);
+ if($nextSide.length === 0) {
+ module.set.defaultSide();
+ module.error(error.side);
+ }
+ module.verbose('Next side manually set to', $nextSide);
+ },
+
+ active: function() {
+ module.verbose('Setting new side to active', $nextSide);
+ $side
+ .removeClass(className.active)
+ ;
+ $nextSide
+ .addClass(className.active)
+ ;
+ settings.onChange.call($nextSide[0]);
+ module.set.defaultSide();
+ }
+ },
+
+ flip: {
+ to: function(type,stage){
+ if(module.is.hidden()) {
+ module.debug('Module not visible', $nextSide);
+ return;
+ }
+ if(module.is.complete() && !module.is.animating() && !settings.allowRepeats) {
+ module.debug('Side already visible', $nextSide);
+ return;
+ }
+ var
+ transform = module.get.transform[type]()
+ ;
+ if( !module.is.animating()) {
+ module.debug('Flipping '+type, $nextSide);
+ module.set.stageSize();
+ module.stage[stage]();
+ module.animate(transform);
+ }
+ else {
+ module.queue('flip '+type);
+ }
+ },
+
+ up: function() {
+ module.flip.to('up','above');
+ },
+
+ down: function() {
+ module.flip.to('down','below');
+ },
+
+ left: function() {
+ module.flip.to('left','left');
+ },
+
+ right: function() {
+ module.flip.to('right','right');
+ },
+
+ over: function() {
+ module.flip.to('over','behind');
+ },
+
+ back: function() {
+ module.flip.to('back','behind');
+ }
+
+ },
+
+ get: {
+
+ transform: {
+ up: function() {
+ var
+ translateZ = $activeSide.outerHeight(true) / 2,
+ translateY = $nextSide.outerHeight(true) - translateZ
+ ;
+ return {
+ transform: 'translateY(' + translateY + 'px) translateZ(-'+ translateZ + 'px) rotateX(-90deg)'
+ };
+ },
+
+ down: function() {
+ var
+ translate = {
+ z: $activeSide.outerHeight(true) / 2
+ }
+ ;
+ return {
+ transform: 'translateY(-' + translate.z + 'px) translateZ(-'+ translate.z + 'px) rotateX(90deg)'
+ };
+ },
+
+ left: function() {
+ var
+ translateZ = $activeSide.outerWidth(true) / 2,
+ translateX = $nextSide.outerWidth(true) - translateZ
+ ;
+ return {
+ transform: 'translateX(' + translateX + 'px) translateZ(-' + translateZ + 'px) rotateY(90deg)'
+ };
+ },
+
+ right: function() {
+ var
+ translate = {
+ z : $activeSide.outerWidth(true) / 2
+ }
+ ;
+ return {
+ transform: 'translateX(-' + translate.z + 'px) translateZ(-' + translate.z + 'px) rotateY(-90deg)'
+ };
+ },
+
+ over: function() {
+ var
+ translate = {
+ x : -(($activeSide.outerWidth(true) - $nextSide.outerWidth(true)) / 2)
+ }
+ ;
+ return {
+ transform: 'translateX(' + translate.x + 'px) rotateY(180deg)'
+ };
+ },
+
+ back: function() {
+ var
+ translate = {
+ x : -(($activeSide.outerWidth(true) - $nextSide.outerWidth(true)) / 2)
+ }
+ ;
+ return {
+ transform: 'translateX(' + translate.x + 'px) rotateY(-180deg)'
+ };
+ }
+ },
+
+ transitionEvent: function() {
+ var
+ element = document.createElement('element'),
+ transitions = {
+ 'transition' :'transitionend',
+ 'OTransition' :'oTransitionEnd',
+ 'MozTransition' :'transitionend',
+ 'WebkitTransition' :'webkitTransitionEnd'
+ },
+ transition
+ ;
+ for(transition in transitions){
+ if( element.style[transition] !== undefined ){
+ return transitions[transition];
+ }
+ }
+ },
+
+ nextSide: function() {
+ return ( $activeSide.next(selector.side).length > 0 )
+ ? $activeSide.next(selector.side)
+ : $side.first()
+ ;
+ }
+
+ },
+
+ stage: {
+
+ above: function() {
+ var
+ box = {
+ origin : (($activeSide.outerHeight(true) - $nextSide.outerHeight(true)) / 2),
+ depth : {
+ active : ($nextSide.outerHeight(true) / 2),
+ next : ($activeSide.outerHeight(true) / 2)
+ }
+ }
+ ;
+ module.verbose('Setting the initial animation position as above', $nextSide, box);
+ $activeSide
+ .css({
+ 'transform' : 'rotateX(0deg)'
+ })
+ ;
+ $nextSide
+ .addClass(className.animating)
+ .css({
+ 'top' : box.origin + 'px',
+ 'transform' : 'rotateX(90deg) translateZ(' + box.depth.next + 'px) translateY(-' + box.depth.active + 'px)'
+ })
+ ;
+ },
+
+ below: function() {
+ var
+ box = {
+ origin : (($activeSide.outerHeight(true) - $nextSide.outerHeight(true)) / 2),
+ depth : {
+ active : ($nextSide.outerHeight(true) / 2),
+ next : ($activeSide.outerHeight(true) / 2)
+ }
+ }
+ ;
+ module.verbose('Setting the initial animation position as below', $nextSide, box);
+ $activeSide
+ .css({
+ 'transform' : 'rotateX(0deg)'
+ })
+ ;
+ $nextSide
+ .addClass(className.animating)
+ .css({
+ 'top' : box.origin + 'px',
+ 'transform' : 'rotateX(-90deg) translateZ(' + box.depth.next + 'px) translateY(' + box.depth.active + 'px)'
+ })
+ ;
+ },
+
+ left: function() {
+ var
+ height = {
+ active : $activeSide.outerWidth(true),
+ next : $nextSide.outerWidth(true)
+ },
+ box = {
+ origin : ( ( height.active - height.next ) / 2),
+ depth : {
+ active : (height.next / 2),
+ next : (height.active / 2)
+ }
+ }
+ ;
+ module.verbose('Setting the initial animation position as left', $nextSide, box);
+ $activeSide
+ .css({
+ 'transform' : 'rotateY(0deg)'
+ })
+ ;
+ $nextSide
+ .addClass(className.animating)
+ .css({
+ 'left' : box.origin + 'px',
+ 'transform' : 'rotateY(-90deg) translateZ(' + box.depth.next + 'px) translateX(-' + box.depth.active + 'px)'
+ })
+ ;
+ },
+
+ right: function() {
+ var
+ height = {
+ active : $activeSide.outerWidth(true),
+ next : $nextSide.outerWidth(true)
+ },
+ box = {
+ origin : ( ( height.active - height.next ) / 2),
+ depth : {
+ active : (height.next / 2),
+ next : (height.active / 2)
+ }
+ }
+ ;
+ module.verbose('Setting the initial animation position as right', $nextSide, box);
+ $activeSide
+ .css({
+ 'transform' : 'rotateY(0deg)'
+ })
+ ;
+ $nextSide
+ .addClass(className.animating)
+ .css({
+ 'left' : box.origin + 'px',
+ 'transform' : 'rotateY(90deg) translateZ(' + box.depth.next + 'px) translateX(' + box.depth.active + 'px)'
+ })
+ ;
+ },
+
+ behind: function() {
+ var
+ height = {
+ active : $activeSide.outerWidth(true),
+ next : $nextSide.outerWidth(true)
+ },
+ box = {
+ origin : ( ( height.active - height.next ) / 2),
+ depth : {
+ active : (height.next / 2),
+ next : (height.active / 2)
+ }
+ }
+ ;
+ module.verbose('Setting the initial animation position as behind', $nextSide, box);
+ $activeSide
+ .css({
+ 'transform' : 'rotateY(0deg)'
+ })
+ ;
+ $nextSide
+ .addClass(className.animating)
+ .css({
+ 'left' : box.origin + 'px',
+ 'transform' : 'rotateY(-180deg)'
+ })
+ ;
+ }
+ },
+ setting: function(name, value) {
+ module.debug('Changing setting', name, value);
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ if($.isPlainObject(settings[name])) {
+ $.extend(true, settings[name], value);
+ }
+ else {
+ settings[name] = value;
+ }
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if($allModules.length > 1) {
+ title += ' ' + '(' + $allModules.length + ')';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ var $inputs = $module.find('input');
+ if( $inputs.length > 0) {
+ $inputs.blur();
+ setTimeout(function(){
+ module.invoke(query);
+ }, 150);
+ } else {
+ module.invoke(query);
+ }
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ }
+ })
+ ;
+
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.fn.shape.settings = {
+
+ // module info
+ name : 'Shape',
+
+ // hide all debug content
+ silent : false,
+
+ // debug content outputted to console
+ debug : false,
+
+ // verbose debug output
+ verbose : false,
+
+ // fudge factor in pixels when swapping from 2d to 3d (can be useful to correct rounding errors)
+ jitter : 0,
+
+ // performance data output
+ performance: true,
+
+ // event namespace
+ namespace : 'shape',
+
+ // width during animation, can be set to 'auto', initial', 'next' or pixel amount
+ width: 'initial',
+
+ // height during animation, can be set to 'auto', 'initial', 'next' or pixel amount
+ height: 'initial',
+
+ // callback occurs on side change
+ beforeChange : function() {},
+ onChange : function() {},
+
+ // allow animation to same side
+ allowRepeats: false,
+
+ // animation duration
+ duration : false,
+
+ // possible errors
+ error: {
+ side : 'You tried to switch to a side that does not exist.',
+ method : 'The method you called is not defined'
+ },
+
+ // classnames used
+ className : {
+ animating : 'animating',
+ hidden : 'hidden',
+ loading : 'loading',
+ active : 'active'
+ },
+
+ // selectors used
+ selector : {
+ sides : '.sides',
+ side : '.side'
+ }
+
+};
+
+
+})( jQuery, window, document );
diff --git a/public/dist/components/shape.min.css b/public/dist/components/shape.min.css
new file mode 100644
index 000000000..9d701e737
--- /dev/null
+++ b/public/dist/components/shape.min.css
@@ -0,0 +1,9 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Shape
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */.ui.shape{position:relative;vertical-align:top;display:inline-block;-webkit-perspective:2000px;perspective:2000px;-webkit-transition:left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out;transition:left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out,left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out;transition:transform .6s ease-in-out,left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out}.ui.shape .side,.ui.shape .sides{-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.ui.shape .side{display:none;opacity:1;width:100%;margin:0!important;-webkit-backface-visibility:hidden;backface-visibility:hidden}.ui.shape .side *{-webkit-backface-visibility:visible!important;backface-visibility:visible!important}.ui.cube.shape .side{min-width:15em;height:15em;padding:2em;background-color:#e6e6e6;color:rgba(0,0,0,.87);-webkit-box-shadow:0 0 2px rgba(0,0,0,.3);box-shadow:0 0 2px rgba(0,0,0,.3)}.ui.cube.shape .side>.content{width:100%;height:100%;display:table;text-align:center;-webkit-user-select:text;-moz-user-select:text;-ms-user-select:text;user-select:text}.ui.cube.shape .side>.content>div{display:table-cell;vertical-align:middle;font-size:2em}.ui.text.shape.animating .sides{position:static}.ui.text.shape .side{white-space:nowrap}.ui.text.shape .side>*{white-space:normal}.ui.loading.shape{position:absolute;top:-9999px;left:-9999px}.ui.shape .animating.side{position:absolute;top:0;left:0;display:block;z-index:100}.ui.shape .hidden.side{opacity:.6}.ui.shape.animating .sides{position:absolute;-webkit-transition:left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out;transition:left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out;transition:transform .6s ease-in-out,left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out;transition:transform .6s ease-in-out,left .6s ease-in-out,width .6s ease-in-out,height .6s ease-in-out,-webkit-transform .6s ease-in-out}.ui.shape.animating .side{-webkit-transition:opacity .6s ease-in-out;transition:opacity .6s ease-in-out}.ui.shape .animating.side *,.ui.shape.animating .side *{-webkit-transition:none;transition:none}.ui.shape .active.side{display:block}
\ No newline at end of file
diff --git a/public/dist/components/shape.min.js b/public/dist/components/shape.min.js
new file mode 100644
index 000000000..c985dd5ff
--- /dev/null
+++ b/public/dist/components/shape.min.js
@@ -0,0 +1,11 @@
+/*
+ * # Fomantic UI - 2.8.8
+ * https://github.com/fomantic/Fomantic-UI
+ * http://fomantic-ui.com/
+ *
+ * Copyright 2021 Contributors
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+!function(E,e,Y,F){"use strict";E.isFunction=E.isFunction||function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},e=void 0!==e&&e.Math==Math?e:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),E.fn.shape=function(b){var x,y=E(this),w=(new Date).getTime(),C=[],S=b,T="string"==typeof S,W=[].slice.call(arguments,1),A=e.requestAnimationFrame||e.mozRequestAnimationFrame||e.webkitRequestAnimationFrame||e.msRequestAnimationFrame||function(e){setTimeout(e,0)};return y.each(function(){var n,o,r,t=y.selector||"",s=E.isPlainObject(b)?E.extend(!0,{},E.fn.shape.settings,b):E.extend({},E.fn.shape.settings),e=s.namespace,d=s.selector,i=s.error,l=s.className,a="."+e,u="module-"+e,c=E(this),f=c.find(">"+d.sides),g=f.find(">"+d.side),h=!1,m=this,p=c.data(u);if(r={initialize:function(){r.verbose("Initializing module for",m),r.set.defaultSide(),r.instantiate()},instantiate:function(){r.verbose("Storing instance of module",r),p=r,c.data(u,p)},destroy:function(){r.verbose("Destroying previous module for",m),c.removeData(u).off(a)},refresh:function(){r.verbose("Refreshing selector cache for",m),c=E(m),f=E(this).find(d.sides),g=E(this).find(d.side)},repaint:function(){r.verbose("Forcing repaint event");(f[0]||Y.createElement("div")).offsetWidth},animate:function(e,t){r.verbose("Animating box with properties",e),t=t||function(e){r.verbose("Executing animation callback"),e!==F&&e.stopPropagation(),r.reset(),r.set.active()},s.beforeChange.call(o[0]),r.get.transitionEvent()?(r.verbose("Starting CSS animation"),c.addClass(l.animating),f.css(e).one(r.get.transitionEvent(),t),r.set.duration(s.duration),A(function(){c.addClass(l.animating),n.addClass(l.hidden)})):t()},queue:function(e){r.debug("Queueing animation of",e),f.one(r.get.transitionEvent(),function(){r.debug("Executing queued animation"),setTimeout(function(){c.shape(e)},0)})},reset:function(){r.verbose("Animating states reset"),c.removeClass(l.animating).attr("style","").removeAttr("style"),f.attr("style","").removeAttr("style"),g.attr("style","").removeAttr("style").removeClass(l.hidden),o.removeClass(l.animating).attr("style","").removeAttr("style")},is:{complete:function(){return g.filter("."+l.active)[0]==o[0]},animating:function(){return c.hasClass(l.animating)},hidden:function(){return 0"+d.sides+">"+d.side),i=t.filter("."+s.className.active),n=h?t.eq(h):0 * {
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+}
+
+/*--------------
+ Direction
+---------------*/
+
+.ui.left.sidebar {
+ right: auto;
+ left: 0;
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 0);
+}
+.ui.right.sidebar {
+ right: 0 !important;
+ left: auto !important;
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0);
+}
+.ui.top.sidebar,
+.ui.bottom.sidebar {
+ width: 100% !important;
+ height: auto !important;
+}
+.ui.top.sidebar {
+ top: 0 !important;
+ bottom: auto !important;
+ -webkit-transform: translate3d(0, -100%, 0);
+ transform: translate3d(0, -100%, 0);
+}
+.ui.bottom.sidebar {
+ top: auto !important;
+ bottom: 0 !important;
+ -webkit-transform: translate3d(0, 100%, 0);
+ transform: translate3d(0, 100%, 0);
+}
+
+/*--------------
+ Pushable
+---------------*/
+
+.pushable {
+ height: 100%;
+ overflow-x: hidden;
+ padding: 0 !important;
+}
+
+/* Whole Page */
+body.pushable {
+ background: #545454;
+}
+body.pushable.dimmed {
+ background: inherit;
+}
+
+/* Page Context */
+.pushable:not(body) {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ overflow-y: hidden;
+}
+.pushable:not(body) > .ui.sidebar,
+.pushable:not(body) > .fixed,
+.pushable:not(body) > .pusher:after {
+ position: absolute;
+}
+
+/*--------------
+ Fixed
+---------------*/
+
+.pushable > .fixed {
+ position: fixed;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ -webkit-transition: -webkit-transform 500ms ease;
+ transition: -webkit-transform 500ms ease;
+ transition: transform 500ms ease;
+ transition: transform 500ms ease, -webkit-transform 500ms ease;
+ will-change: transform;
+ z-index: 101;
+}
+
+/*--------------
+ Page
+---------------*/
+
+.pushable > .pusher {
+ position: relative;
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ overflow: hidden;
+ min-height: 100%;
+ -webkit-transition: -webkit-transform 500ms ease;
+ transition: -webkit-transform 500ms ease;
+ transition: transform 500ms ease;
+ transition: transform 500ms ease, -webkit-transform 500ms ease;
+ z-index: 2;
+
+/* Pusher should inherit background from context */
+ background: inherit;
+}
+body.pushable > .pusher {
+ background: #FFFFFF;
+}
+
+/*--------------
+ Dimmer
+---------------*/
+
+.pushable > .pusher:after {
+ position: fixed;
+ top: 0;
+ right: 0;
+ content: '';
+ background: rgba(0, 0, 0, 0.4);
+ overflow: hidden;
+ opacity: 0;
+ -webkit-transition: opacity 500ms;
+ transition: opacity 500ms;
+ will-change: opacity;
+ z-index: 1000;
+}
+
+/*--------------
+ Coupling
+---------------*/
+
+.ui.sidebar.menu .item {
+ border-radius: 0 !important;
+}
+
+
+/*******************************
+ States
+*******************************/
+
+
+/*--------------
+ Dimmed
+---------------*/
+
+.pushable > .pusher.dimmed:after {
+ width: 100% !important;
+ height: 100% !important;
+ opacity: 1 !important;
+}
+
+/*--------------
+ Animating
+---------------*/
+
+.ui.animating.sidebar {
+ visibility: visible;
+}
+
+/*--------------
+ Visible
+---------------*/
+
+.ui.visible.sidebar {
+ visibility: visible;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+}
+
+/* Shadow Direction */
+.ui.left.visible.sidebar,
+.ui.right.visible.sidebar {
+ -webkit-box-shadow: 0 0 20px rgba(34, 36, 38, 0.15);
+ box-shadow: 0 0 20px rgba(34, 36, 38, 0.15);
+}
+.ui.top.visible.sidebar,
+.ui.bottom.visible.sidebar {
+ -webkit-box-shadow: 0 0 20px rgba(34, 36, 38, 0.15);
+ box-shadow: 0 0 20px rgba(34, 36, 38, 0.15);
+}
+
+/* Visible On Load */
+.ui.visible.left.sidebar ~ .fixed,
+.ui.visible.left.sidebar ~ .pusher {
+ -webkit-transform: translate3d(260px, 0, 0);
+ transform: translate3d(260px, 0, 0);
+}
+.ui.visible.right.sidebar ~ .fixed,
+.ui.visible.right.sidebar ~ .pusher {
+ -webkit-transform: translate3d(-260px, 0, 0);
+ transform: translate3d(-260px, 0, 0);
+}
+.ui.visible.top.sidebar ~ .fixed,
+.ui.visible.top.sidebar ~ .pusher {
+ -webkit-transform: translate3d(0, 36px, 0);
+ transform: translate3d(0, 36px, 0);
+}
+.ui.visible.bottom.sidebar ~ .fixed,
+.ui.visible.bottom.sidebar ~ .pusher {
+ -webkit-transform: translate3d(0, -36px, 0);
+ transform: translate3d(0, -36px, 0);
+}
+
+/* opposite sides visible forces content overlay */
+.ui.visible.left.sidebar ~ .ui.visible.right.sidebar ~ .fixed,
+.ui.visible.left.sidebar ~ .ui.visible.right.sidebar ~ .pusher,
+.ui.visible.right.sidebar ~ .ui.visible.left.sidebar ~ .fixed,
+.ui.visible.right.sidebar ~ .ui.visible.left.sidebar ~ .pusher {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+}
+
+/*--------------
+ iOS
+---------------*/
+
+
+
+/*******************************
+ Variations
+*******************************/
+
+
+/*--------------
+ Width
+---------------*/
+
+
+/* Left / Right */
+.ui.thin.left.sidebar,
+.ui.thin.right.sidebar {
+ width: 150px;
+}
+.ui[class*="very thin"].left.sidebar,
+.ui[class*="very thin"].right.sidebar {
+ width: 60px;
+}
+.ui.left.sidebar,
+.ui.right.sidebar {
+ width: 260px;
+}
+.ui.wide.left.sidebar,
+.ui.wide.right.sidebar {
+ width: 350px;
+}
+.ui[class*="very wide"].left.sidebar,
+.ui[class*="very wide"].right.sidebar {
+ width: 475px;
+}
+
+/* Left Visible */
+.ui.visible.thin.left.sidebar ~ .fixed,
+.ui.visible.thin.left.sidebar ~ .pusher {
+ -webkit-transform: translate3d(150px, 0, 0);
+ transform: translate3d(150px, 0, 0);
+}
+.ui.visible[class*="very thin"].left.sidebar ~ .fixed,
+.ui.visible[class*="very thin"].left.sidebar ~ .pusher {
+ -webkit-transform: translate3d(60px, 0, 0);
+ transform: translate3d(60px, 0, 0);
+}
+.ui.visible.wide.left.sidebar ~ .fixed,
+.ui.visible.wide.left.sidebar ~ .pusher {
+ -webkit-transform: translate3d(350px, 0, 0);
+ transform: translate3d(350px, 0, 0);
+}
+.ui.visible[class*="very wide"].left.sidebar ~ .fixed,
+.ui.visible[class*="very wide"].left.sidebar ~ .pusher {
+ -webkit-transform: translate3d(475px, 0, 0);
+ transform: translate3d(475px, 0, 0);
+}
+
+/* Right Visible */
+.ui.visible.thin.right.sidebar ~ .fixed,
+.ui.visible.thin.right.sidebar ~ .pusher {
+ -webkit-transform: translate3d(-150px, 0, 0);
+ transform: translate3d(-150px, 0, 0);
+}
+.ui.visible[class*="very thin"].right.sidebar ~ .fixed,
+.ui.visible[class*="very thin"].right.sidebar ~ .pusher {
+ -webkit-transform: translate3d(-60px, 0, 0);
+ transform: translate3d(-60px, 0, 0);
+}
+.ui.visible.wide.right.sidebar ~ .fixed,
+.ui.visible.wide.right.sidebar ~ .pusher {
+ -webkit-transform: translate3d(-350px, 0, 0);
+ transform: translate3d(-350px, 0, 0);
+}
+.ui.visible[class*="very wide"].right.sidebar ~ .fixed,
+.ui.visible[class*="very wide"].right.sidebar ~ .pusher {
+ -webkit-transform: translate3d(-475px, 0, 0);
+ transform: translate3d(-475px, 0, 0);
+}
+
+
+/*******************************
+ Animations
+*******************************/
+
+
+/*--------------
+ Overlay
+ ---------------*/
+
+
+/* Set-up */
+.ui.overlay.sidebar {
+ z-index: 102;
+}
+
+/* Initial */
+.ui.left.overlay.sidebar {
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 0);
+}
+.ui.right.overlay.sidebar {
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0);
+}
+.ui.top.overlay.sidebar {
+ -webkit-transform: translate3d(0%, -100%, 0);
+ transform: translate3d(0%, -100%, 0);
+}
+.ui.bottom.overlay.sidebar {
+ -webkit-transform: translate3d(0%, 100%, 0);
+ transform: translate3d(0%, 100%, 0);
+}
+
+/* Animation */
+.animating.ui.overlay.sidebar,
+.ui.visible.overlay.sidebar {
+ -webkit-transition: -webkit-transform 500ms ease;
+ transition: -webkit-transform 500ms ease;
+ transition: transform 500ms ease;
+ transition: transform 500ms ease, -webkit-transform 500ms ease;
+}
+
+/* End - Sidebar */
+.ui.visible.left.overlay.sidebar {
+ -webkit-transform: translate3d(0%, 0, 0);
+ transform: translate3d(0%, 0, 0);
+}
+.ui.visible.right.overlay.sidebar {
+ -webkit-transform: translate3d(0%, 0, 0);
+ transform: translate3d(0%, 0, 0);
+}
+.ui.visible.top.overlay.sidebar {
+ -webkit-transform: translate3d(0%, 0, 0);
+ transform: translate3d(0%, 0, 0);
+}
+.ui.visible.bottom.overlay.sidebar {
+ -webkit-transform: translate3d(0%, 0, 0);
+ transform: translate3d(0%, 0, 0);
+}
+
+/* End - Pusher */
+.ui.visible.overlay.sidebar ~ .fixed,
+.ui.visible.overlay.sidebar ~ .pusher {
+ -webkit-transform: none !important;
+ transform: none !important;
+}
+
+/*--------------
+ Push
+ ---------------*/
+
+
+/* Initial */
+.ui.push.sidebar {
+ -webkit-transition: -webkit-transform 500ms ease;
+ transition: -webkit-transform 500ms ease;
+ transition: transform 500ms ease;
+ transition: transform 500ms ease, -webkit-transform 500ms ease;
+ z-index: 102;
+}
+
+/* Sidebar - Initial */
+.ui.left.push.sidebar {
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 0);
+}
+.ui.right.push.sidebar {
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0);
+}
+.ui.top.push.sidebar {
+ -webkit-transform: translate3d(0%, -100%, 0);
+ transform: translate3d(0%, -100%, 0);
+}
+.ui.bottom.push.sidebar {
+ -webkit-transform: translate3d(0%, 100%, 0);
+ transform: translate3d(0%, 100%, 0);
+}
+
+/* End */
+.ui.visible.push.sidebar {
+ -webkit-transform: translate3d(0%, 0, 0);
+ transform: translate3d(0%, 0, 0);
+}
+
+/*--------------
+ Uncover
+ ---------------*/
+
+
+/* Initial */
+.ui.uncover.sidebar {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ z-index: 1;
+}
+
+/* End */
+.ui.visible.uncover.sidebar {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ -webkit-transition: -webkit-transform 500ms ease;
+ transition: -webkit-transform 500ms ease;
+ transition: transform 500ms ease;
+ transition: transform 500ms ease, -webkit-transform 500ms ease;
+}
+
+/*--------------
+ Slide Along
+ ---------------*/
+
+
+/* Initial */
+.ui.slide.along.sidebar {
+ z-index: 1;
+}
+
+/* Sidebar - Initial */
+.ui.left.slide.along.sidebar {
+ -webkit-transform: translate3d(-50%, 0, 0);
+ transform: translate3d(-50%, 0, 0);
+}
+.ui.right.slide.along.sidebar {
+ -webkit-transform: translate3d(50%, 0, 0);
+ transform: translate3d(50%, 0, 0);
+}
+.ui.top.slide.along.sidebar {
+ -webkit-transform: translate3d(0, -50%, 0);
+ transform: translate3d(0, -50%, 0);
+}
+.ui.bottom.slide.along.sidebar {
+ -webkit-transform: translate3d(0%, 50%, 0);
+ transform: translate3d(0%, 50%, 0);
+}
+
+/* Animation */
+.ui.animating.slide.along.sidebar {
+ -webkit-transition: -webkit-transform 500ms ease;
+ transition: -webkit-transform 500ms ease;
+ transition: transform 500ms ease;
+ transition: transform 500ms ease, -webkit-transform 500ms ease;
+}
+
+/* End */
+.ui.visible.slide.along.sidebar {
+ -webkit-transform: translate3d(0%, 0, 0);
+ transform: translate3d(0%, 0, 0);
+}
+
+/*--------------
+ Slide Out
+ ---------------*/
+
+
+/* Initial */
+.ui.slide.out.sidebar {
+ z-index: 1;
+}
+
+/* Sidebar - Initial */
+.ui.left.slide.out.sidebar {
+ -webkit-transform: translate3d(50%, 0, 0);
+ transform: translate3d(50%, 0, 0);
+}
+.ui.right.slide.out.sidebar {
+ -webkit-transform: translate3d(-50%, 0, 0);
+ transform: translate3d(-50%, 0, 0);
+}
+.ui.top.slide.out.sidebar {
+ -webkit-transform: translate3d(0%, 50%, 0);
+ transform: translate3d(0%, 50%, 0);
+}
+.ui.bottom.slide.out.sidebar {
+ -webkit-transform: translate3d(0%, -50%, 0);
+ transform: translate3d(0%, -50%, 0);
+}
+
+/* Animation */
+.ui.animating.slide.out.sidebar {
+ -webkit-transition: -webkit-transform 500ms ease;
+ transition: -webkit-transform 500ms ease;
+ transition: transform 500ms ease;
+ transition: transform 500ms ease, -webkit-transform 500ms ease;
+}
+
+/* End */
+.ui.visible.slide.out.sidebar {
+ -webkit-transform: translate3d(0%, 0, 0);
+ transform: translate3d(0%, 0, 0);
+}
+
+/*--------------
+ Scale Down
+ ---------------*/
+
+
+/* Initial */
+.ui.scale.down.sidebar {
+ -webkit-transition: -webkit-transform 500ms ease;
+ transition: -webkit-transform 500ms ease;
+ transition: transform 500ms ease;
+ transition: transform 500ms ease, -webkit-transform 500ms ease;
+ z-index: 102;
+}
+.ui.left.scale.down.sidebar {
+ -webkit-transform: translate3d(-100%, 0, 0);
+ transform: translate3d(-100%, 0, 0);
+}
+.ui.right.scale.down.sidebar {
+ -webkit-transform: translate3d(100%, 0, 0);
+ transform: translate3d(100%, 0, 0);
+}
+.ui.top.scale.down.sidebar {
+ -webkit-transform: translate3d(0%, -100%, 0);
+ transform: translate3d(0%, -100%, 0);
+}
+.ui.bottom.scale.down.sidebar {
+ -webkit-transform: translate3d(0%, 100%, 0);
+ transform: translate3d(0%, 100%, 0);
+}
+
+/* Pusher - Initial */
+.ui.scale.down.left.sidebar ~ .pusher {
+ -webkit-transform-origin: 75% 50%;
+ transform-origin: 75% 50%;
+}
+.ui.scale.down.right.sidebar ~ .pusher {
+ -webkit-transform-origin: 25% 50%;
+ transform-origin: 25% 50%;
+}
+.ui.scale.down.top.sidebar ~ .pusher {
+ -webkit-transform-origin: 50% 75%;
+ transform-origin: 50% 75%;
+}
+.ui.scale.down.bottom.sidebar ~ .pusher {
+ -webkit-transform-origin: 50% 25%;
+ transform-origin: 50% 25%;
+}
+
+/* Animation */
+.ui.animating.scale.down > .visible.ui.sidebar {
+ -webkit-transition: -webkit-transform 500ms ease;
+ transition: -webkit-transform 500ms ease;
+ transition: transform 500ms ease;
+ transition: transform 500ms ease, -webkit-transform 500ms ease;
+}
+.ui.visible.scale.down.sidebar ~ .pusher,
+.ui.animating.scale.down.sidebar ~ .pusher {
+ display: block !important;
+ width: 100%;
+ height: 100%;
+ overflow: hidden !important;
+}
+
+/* End */
+.ui.visible.scale.down.sidebar {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+}
+.ui.visible.scale.down.sidebar ~ .pusher {
+ -webkit-transform: scale(0.75);
+ transform: scale(0.75);
+}
+
+
+/*******************************
+ Theme Overrides
+*******************************/
+
+
+
+/*******************************
+ Site Overrides
+*******************************/
+
diff --git a/public/dist/components/sidebar.js b/public/dist/components/sidebar.js
new file mode 100644
index 000000000..36e85f2a2
--- /dev/null
+++ b/public/dist/components/sidebar.js
@@ -0,0 +1,1036 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Sidebar
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+'use strict';
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.sidebar = function(parameters) {
+ var
+ $allModules = $(this),
+ $window = $(window),
+ $document = $(document),
+ $html = $('html'),
+ $head = $('head'),
+
+ moduleSelector = $allModules.selector || '',
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+
+ requestAnimationFrame = window.requestAnimationFrame
+ || window.mozRequestAnimationFrame
+ || window.webkitRequestAnimationFrame
+ || window.msRequestAnimationFrame
+ || function(callback) { setTimeout(callback, 0); },
+
+ returnedValue
+ ;
+
+ $allModules
+ .each(function() {
+ var
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.fn.sidebar.settings, parameters)
+ : $.extend({}, $.fn.sidebar.settings),
+
+ selector = settings.selector,
+ className = settings.className,
+ namespace = settings.namespace,
+ regExp = settings.regExp,
+ error = settings.error,
+
+ eventNamespace = '.' + namespace,
+ moduleNamespace = 'module-' + namespace,
+
+ $module = $(this),
+ $context = $(settings.context),
+
+ $sidebars = $module.children(selector.sidebar),
+ $fixed = $context.children(selector.fixed),
+ $pusher = $context.children(selector.pusher),
+ $style,
+
+ element = this,
+ instance = $module.data(moduleNamespace),
+
+ elementNamespace,
+ id,
+ currentScroll,
+ transitionEvent,
+
+ module
+ ;
+
+ module = {
+
+ initialize: function() {
+ module.debug('Initializing sidebar', parameters);
+
+ module.create.id();
+
+ transitionEvent = module.get.transitionEvent();
+
+ // avoids locking rendering if initialized in onReady
+ if(settings.delaySetup) {
+ requestAnimationFrame(module.setup.layout);
+ }
+ else {
+ module.setup.layout();
+ }
+
+ requestAnimationFrame(function() {
+ module.setup.cache();
+ });
+
+ module.instantiate();
+ },
+
+ instantiate: function() {
+ module.verbose('Storing instance of module', module);
+ instance = module;
+ $module
+ .data(moduleNamespace, module)
+ ;
+ },
+
+ create: {
+ id: function() {
+ id = (Math.random().toString(16) + '000000000').substr(2,8);
+ elementNamespace = '.' + id;
+ module.verbose('Creating unique id for element', id);
+ }
+ },
+
+ destroy: function() {
+ module.verbose('Destroying previous module for', $module);
+ $module
+ .off(eventNamespace)
+ .removeData(moduleNamespace)
+ ;
+ if(module.is.ios()) {
+ module.remove.ios();
+ }
+ // bound by uuid
+ $context.off(elementNamespace);
+ $window.off(elementNamespace);
+ $document.off(elementNamespace);
+ },
+
+ event: {
+ clickaway: function(event) {
+ if(settings.closable){
+ var
+ clickedInPusher = ($pusher.find(event.target).length > 0 || $pusher.is(event.target)),
+ clickedContext = ($context.is(event.target))
+ ;
+ if(clickedInPusher) {
+ module.verbose('User clicked on dimmed page');
+ module.hide();
+ }
+ if(clickedContext) {
+ module.verbose('User clicked on dimmable context (scaled out page)');
+ module.hide();
+ }
+ }
+ },
+ touch: function(event) {
+ //event.stopPropagation();
+ },
+ containScroll: function(event) {
+ if(element.scrollTop <= 0) {
+ element.scrollTop = 1;
+ }
+ if((element.scrollTop + element.offsetHeight) >= element.scrollHeight) {
+ element.scrollTop = element.scrollHeight - element.offsetHeight - 1;
+ }
+ },
+ scroll: function(event) {
+ if( $(event.target).closest(selector.sidebar).length === 0 ) {
+ event.preventDefault();
+ }
+ }
+ },
+
+ bind: {
+ clickaway: function() {
+ module.verbose('Adding clickaway events to context', $context);
+ $context
+ .on('click' + elementNamespace, module.event.clickaway)
+ .on('touchend' + elementNamespace, module.event.clickaway)
+ ;
+ },
+ scrollLock: function() {
+ if(settings.scrollLock) {
+ module.debug('Disabling page scroll');
+ $window
+ .on('DOMMouseScroll' + elementNamespace, module.event.scroll)
+ ;
+ }
+ module.verbose('Adding events to contain sidebar scroll');
+ $document
+ .on('touchmove' + elementNamespace, module.event.touch)
+ ;
+ $module
+ .on('scroll' + eventNamespace, module.event.containScroll)
+ ;
+ }
+ },
+ unbind: {
+ clickaway: function() {
+ module.verbose('Removing clickaway events from context', $context);
+ $context.off(elementNamespace);
+ },
+ scrollLock: function() {
+ module.verbose('Removing scroll lock from page');
+ $document.off(elementNamespace);
+ $window.off(elementNamespace);
+ $module.off('scroll' + eventNamespace);
+ }
+ },
+
+ add: {
+ inlineCSS: function() {
+ var
+ width = module.cache.width || $module.outerWidth(),
+ height = module.cache.height || $module.outerHeight(),
+ isRTL = module.is.rtl(),
+ direction = module.get.direction(),
+ distance = {
+ left : width,
+ right : -width,
+ top : height,
+ bottom : -height
+ },
+ style
+ ;
+
+ if(isRTL){
+ module.verbose('RTL detected, flipping widths');
+ distance.left = -width;
+ distance.right = width;
+ }
+
+ style = '';
+ $style = $(style)
+ .appendTo($head)
+ ;
+ module.debug('Adding sizing css to head', $style);
+ }
+ },
+
+ refresh: function() {
+ module.verbose('Refreshing selector cache');
+ $context = $(settings.context);
+ $sidebars = $context.children(selector.sidebar);
+ $pusher = $context.children(selector.pusher);
+ $fixed = $context.children(selector.fixed);
+ module.clear.cache();
+ },
+
+ refreshSidebars: function() {
+ module.verbose('Refreshing other sidebars');
+ $sidebars = $context.children(selector.sidebar);
+ },
+
+ repaint: function() {
+ module.verbose('Forcing repaint event');
+ element.style.display = 'none';
+ var ignored = element.offsetHeight;
+ element.scrollTop = element.scrollTop;
+ element.style.display = '';
+ },
+
+ setup: {
+ cache: function() {
+ module.cache = {
+ width : $module.outerWidth(),
+ height : $module.outerHeight()
+ };
+ },
+ layout: function() {
+ if( $context.children(selector.pusher).length === 0 ) {
+ module.debug('Adding wrapper element for sidebar');
+ module.error(error.pusher);
+ $pusher = $('
');
+ $context
+ .children()
+ .not(selector.omitted)
+ .not($sidebars)
+ .wrapAll($pusher)
+ ;
+ module.refresh();
+ }
+ if($module.nextAll(selector.pusher).length === 0 || $module.nextAll(selector.pusher)[0] !== $pusher[0]) {
+ module.debug('Moved sidebar to correct parent element');
+ module.error(error.movedSidebar, element);
+ $module.detach().prependTo($context);
+ module.refresh();
+ }
+ module.clear.cache();
+ module.set.pushable();
+ module.set.direction();
+ }
+ },
+
+ attachEvents: function(selector, event) {
+ var
+ $toggle = $(selector)
+ ;
+ event = $.isFunction(module[event])
+ ? module[event]
+ : module.toggle
+ ;
+ if($toggle.length > 0) {
+ module.debug('Attaching sidebar events to element', selector, event);
+ $toggle
+ .on('click' + eventNamespace, event)
+ ;
+ }
+ else {
+ module.error(error.notFound, selector);
+ }
+ },
+
+ show: function(callback) {
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ if(module.is.hidden()) {
+ module.refreshSidebars();
+ if(settings.overlay) {
+ module.error(error.overlay);
+ settings.transition = 'overlay';
+ }
+ module.refresh();
+ if(module.othersActive()) {
+ module.debug('Other sidebars currently visible');
+ if(settings.exclusive) {
+ // if not overlay queue animation after hide
+ if(settings.transition != 'overlay') {
+ module.hideOthers(module.show);
+ return;
+ }
+ else {
+ module.hideOthers();
+ }
+ }
+ else {
+ settings.transition = 'overlay';
+ }
+ }
+ module.pushPage(function() {
+ callback.call(element);
+ settings.onShow.call(element);
+ });
+ settings.onChange.call(element);
+ settings.onVisible.call(element);
+ }
+ else {
+ module.debug('Sidebar is already visible');
+ }
+ },
+
+ hide: function(callback) {
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ if(module.is.visible() || module.is.animating()) {
+ module.debug('Hiding sidebar', callback);
+ module.refreshSidebars();
+ module.pullPage(function() {
+ callback.call(element);
+ settings.onHidden.call(element);
+ });
+ settings.onChange.call(element);
+ settings.onHide.call(element);
+ }
+ },
+
+ othersAnimating: function() {
+ return ($sidebars.not($module).filter('.' + className.animating).length > 0);
+ },
+ othersVisible: function() {
+ return ($sidebars.not($module).filter('.' + className.visible).length > 0);
+ },
+ othersActive: function() {
+ return(module.othersVisible() || module.othersAnimating());
+ },
+
+ hideOthers: function(callback) {
+ var
+ $otherSidebars = $sidebars.not($module).filter('.' + className.visible),
+ sidebarCount = $otherSidebars.length,
+ callbackCount = 0
+ ;
+ callback = callback || function(){};
+ $otherSidebars
+ .sidebar('hide', function() {
+ callbackCount++;
+ if(callbackCount == sidebarCount) {
+ callback();
+ }
+ })
+ ;
+ },
+
+ toggle: function() {
+ module.verbose('Determining toggled direction');
+ if(module.is.hidden()) {
+ module.show();
+ }
+ else {
+ module.hide();
+ }
+ },
+
+ pushPage: function(callback) {
+ var
+ transition = module.get.transition(),
+ $transition = (transition === 'overlay' || module.othersActive())
+ ? $module
+ : $pusher,
+ animate,
+ dim,
+ transitionEnd
+ ;
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ if(settings.transition == 'scale down') {
+ module.scrollToTop();
+ }
+ module.set.transition(transition);
+ module.repaint();
+ animate = function() {
+ module.bind.clickaway();
+ module.add.inlineCSS();
+ module.set.animating();
+ module.set.visible();
+ };
+ dim = function() {
+ module.set.dimmed();
+ };
+ transitionEnd = function(event) {
+ if( event.target == $transition[0] ) {
+ $transition.off(transitionEvent + elementNamespace, transitionEnd);
+ module.remove.animating();
+ module.bind.scrollLock();
+ callback.call(element);
+ }
+ };
+ $transition.off(transitionEvent + elementNamespace);
+ $transition.on(transitionEvent + elementNamespace, transitionEnd);
+ requestAnimationFrame(animate);
+ if(settings.dimPage && !module.othersVisible()) {
+ requestAnimationFrame(dim);
+ }
+ },
+
+ pullPage: function(callback) {
+ var
+ transition = module.get.transition(),
+ $transition = (transition == 'overlay' || module.othersActive())
+ ? $module
+ : $pusher,
+ animate,
+ transitionEnd
+ ;
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ module.verbose('Removing context push state', module.get.direction());
+
+ module.unbind.clickaway();
+ module.unbind.scrollLock();
+
+ animate = function() {
+ module.set.transition(transition);
+ module.set.animating();
+ module.remove.visible();
+ if(settings.dimPage && !module.othersVisible()) {
+ $pusher.removeClass(className.dimmed);
+ }
+ };
+ transitionEnd = function(event) {
+ if( event.target == $transition[0] ) {
+ $transition.off(transitionEvent + elementNamespace, transitionEnd);
+ module.remove.animating();
+ module.remove.transition();
+ module.remove.inlineCSS();
+ if(transition == 'scale down' || (settings.returnScroll && module.is.mobile()) ) {
+ module.scrollBack();
+ }
+ callback.call(element);
+ }
+ };
+ $transition.off(transitionEvent + elementNamespace);
+ $transition.on(transitionEvent + elementNamespace, transitionEnd);
+ requestAnimationFrame(animate);
+ },
+
+ scrollToTop: function() {
+ module.verbose('Scrolling to top of page to avoid animation issues');
+ currentScroll = $(window).scrollTop();
+ $module.scrollTop(0);
+ window.scrollTo(0, 0);
+ },
+
+ scrollBack: function() {
+ module.verbose('Scrolling back to original page position');
+ window.scrollTo(0, currentScroll);
+ },
+
+ clear: {
+ cache: function() {
+ module.verbose('Clearing cached dimensions');
+ module.cache = {};
+ }
+ },
+
+ set: {
+
+ // ios only (scroll on html not document). This prevent auto-resize canvas/scroll in ios
+ // (This is no longer necessary in latest iOS)
+ ios: function() {
+ $html.addClass(className.ios);
+ },
+
+ // container
+ pushed: function() {
+ $context.addClass(className.pushed);
+ },
+ pushable: function() {
+ $context.addClass(className.pushable);
+ },
+
+ // pusher
+ dimmed: function() {
+ $pusher.addClass(className.dimmed);
+ },
+
+ // sidebar
+ active: function() {
+ $module.addClass(className.active);
+ },
+ animating: function() {
+ $module.addClass(className.animating);
+ },
+ transition: function(transition) {
+ transition = transition || module.get.transition();
+ $module.addClass(transition);
+ },
+ direction: function(direction) {
+ direction = direction || module.get.direction();
+ $module.addClass(className[direction]);
+ },
+ visible: function() {
+ $module.addClass(className.visible);
+ },
+ overlay: function() {
+ $module.addClass(className.overlay);
+ }
+ },
+ remove: {
+
+ inlineCSS: function() {
+ module.debug('Removing inline css styles', $style);
+ if($style && $style.length > 0) {
+ $style.remove();
+ }
+ },
+
+ // ios scroll on html not document
+ ios: function() {
+ $html.removeClass(className.ios);
+ },
+
+ // context
+ pushed: function() {
+ $context.removeClass(className.pushed);
+ },
+ pushable: function() {
+ $context.removeClass(className.pushable);
+ },
+
+ // sidebar
+ active: function() {
+ $module.removeClass(className.active);
+ },
+ animating: function() {
+ $module.removeClass(className.animating);
+ },
+ transition: function(transition) {
+ transition = transition || module.get.transition();
+ $module.removeClass(transition);
+ },
+ direction: function(direction) {
+ direction = direction || module.get.direction();
+ $module.removeClass(className[direction]);
+ },
+ visible: function() {
+ $module.removeClass(className.visible);
+ },
+ overlay: function() {
+ $module.removeClass(className.overlay);
+ }
+ },
+
+ get: {
+ direction: function() {
+ if($module.hasClass(className.top)) {
+ return className.top;
+ }
+ else if($module.hasClass(className.right)) {
+ return className.right;
+ }
+ else if($module.hasClass(className.bottom)) {
+ return className.bottom;
+ }
+ return className.left;
+ },
+ transition: function() {
+ var
+ direction = module.get.direction(),
+ transition
+ ;
+ transition = ( module.is.mobile() )
+ ? (settings.mobileTransition == 'auto')
+ ? settings.defaultTransition.mobile[direction]
+ : settings.mobileTransition
+ : (settings.transition == 'auto')
+ ? settings.defaultTransition.computer[direction]
+ : settings.transition
+ ;
+ module.verbose('Determined transition', transition);
+ return transition;
+ },
+ transitionEvent: function() {
+ var
+ element = document.createElement('element'),
+ transitions = {
+ 'transition' :'transitionend',
+ 'OTransition' :'oTransitionEnd',
+ 'MozTransition' :'transitionend',
+ 'WebkitTransition' :'webkitTransitionEnd'
+ },
+ transition
+ ;
+ for(transition in transitions){
+ if( element.style[transition] !== undefined ){
+ return transitions[transition];
+ }
+ }
+ }
+ },
+
+ is: {
+
+ ie: function() {
+ var
+ isIE11 = (!(window.ActiveXObject) && 'ActiveXObject' in window),
+ isIE = ('ActiveXObject' in window)
+ ;
+ return (isIE11 || isIE);
+ },
+
+ ios: function() {
+ var
+ userAgent = navigator.userAgent,
+ isIOS = userAgent.match(regExp.ios),
+ isMobileChrome = userAgent.match(regExp.mobileChrome)
+ ;
+ if(isIOS && !isMobileChrome) {
+ module.verbose('Browser was found to be iOS', userAgent);
+ return true;
+ }
+ else {
+ return false;
+ }
+ },
+ mobile: function() {
+ var
+ userAgent = navigator.userAgent,
+ isMobile = userAgent.match(regExp.mobile)
+ ;
+ if(isMobile) {
+ module.verbose('Browser was found to be mobile', userAgent);
+ return true;
+ }
+ else {
+ module.verbose('Browser is not mobile, using regular transition', userAgent);
+ return false;
+ }
+ },
+ hidden: function() {
+ return !module.is.visible();
+ },
+ visible: function() {
+ return $module.hasClass(className.visible);
+ },
+ // alias
+ open: function() {
+ return module.is.visible();
+ },
+ closed: function() {
+ return module.is.hidden();
+ },
+ vertical: function() {
+ return $module.hasClass(className.top);
+ },
+ animating: function() {
+ return $context.hasClass(className.animating);
+ },
+ rtl: function () {
+ if(module.cache.rtl === undefined) {
+ module.cache.rtl = $module.attr('dir') === 'rtl' || $module.css('direction') === 'rtl';
+ }
+ return module.cache.rtl;
+ }
+ },
+
+ setting: function(name, value) {
+ module.debug('Changing setting', name, value);
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ if($.isPlainObject(settings[name])) {
+ $.extend(true, settings[name], value);
+ }
+ else {
+ settings[name] = value;
+ }
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ module.error(error.method, query);
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ }
+ ;
+
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ module.invoke('destroy');
+ }
+ module.initialize();
+ }
+ });
+
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.fn.sidebar.settings = {
+
+ name : 'Sidebar',
+ namespace : 'sidebar',
+
+ silent : false,
+ debug : false,
+ verbose : false,
+ performance : true,
+
+ transition : 'auto',
+ mobileTransition : 'auto',
+
+ defaultTransition : {
+ computer: {
+ left : 'uncover',
+ right : 'uncover',
+ top : 'overlay',
+ bottom : 'overlay'
+ },
+ mobile: {
+ left : 'uncover',
+ right : 'uncover',
+ top : 'overlay',
+ bottom : 'overlay'
+ }
+ },
+
+ context : 'body',
+ exclusive : false,
+ closable : true,
+ dimPage : true,
+ scrollLock : false,
+ returnScroll : false,
+ delaySetup : false,
+
+ duration : 500,
+
+ onChange : function(){},
+ onShow : function(){},
+ onHide : function(){},
+
+ onHidden : function(){},
+ onVisible : function(){},
+
+ className : {
+ active : 'active',
+ animating : 'animating',
+ dimmed : 'dimmed',
+ ios : 'ios',
+ pushable : 'pushable',
+ pushed : 'pushed',
+ right : 'right',
+ top : 'top',
+ left : 'left',
+ bottom : 'bottom',
+ visible : 'visible'
+ },
+
+ selector: {
+ fixed : '.fixed',
+ omitted : 'script, link, style, .ui.modal, .ui.dimmer, .ui.nag, .ui.fixed',
+ pusher : '.pusher',
+ sidebar : '.ui.sidebar'
+ },
+
+ regExp: {
+ ios : /(iPad|iPhone|iPod)/g,
+ mobileChrome : /(CriOS)/g,
+ mobile : /Mobile|iP(hone|od|ad)|Android|BlackBerry|IEMobile|Kindle|NetFront|Silk-Accelerated|(hpw|web)OS|Fennec|Minimo|Opera M(obi|ini)|Blazer|Dolfin|Dolphin|Skyfire|Zune/g
+ },
+
+ error : {
+ method : 'The method you called is not defined.',
+ pusher : 'Had to add pusher element. For optimal performance make sure body content is inside a pusher element',
+ movedSidebar : 'Had to move sidebar. For optimal performance make sure sidebar and pusher are direct children of your body tag',
+ overlay : 'The overlay setting is no longer supported, use animation: overlay',
+ notFound : 'There were no elements that matched the specified selector'
+ }
+
+};
+
+
+})( jQuery, window, document );
diff --git a/public/dist/components/sidebar.min.css b/public/dist/components/sidebar.min.css
new file mode 100644
index 000000000..211281b15
--- /dev/null
+++ b/public/dist/components/sidebar.min.css
@@ -0,0 +1,9 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Sidebar
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */.ui.sidebar{position:fixed;top:0;left:0;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition:none;transition:none;will-change:transform;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);visibility:hidden;-webkit-overflow-scrolling:touch;height:100%!important;max-height:100%;border-radius:0!important;margin:0!important;overflow-y:auto!important;z-index:102}.ui.sidebar>*{-webkit-backface-visibility:hidden;backface-visibility:hidden}.ui.left.sidebar{right:auto;left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.ui.right.sidebar{right:0!important;left:auto!important;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.ui.bottom.sidebar,.ui.top.sidebar{width:100%!important;height:auto!important}.ui.top.sidebar{top:0!important;bottom:auto!important;-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.ui.bottom.sidebar{top:auto!important;bottom:0!important;-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.pushable{height:100%;overflow-x:hidden;padding:0!important}body.pushable{background:#545454}body.pushable.dimmed{background:inherit}.pushable:not(body){-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);overflow-y:hidden}.pushable:not(body)>.fixed,.pushable:not(body)>.pusher:after,.pushable:not(body)>.ui.sidebar{position:absolute}.pushable>.fixed{position:fixed;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;will-change:transform;z-index:101}.pushable>.pusher{position:relative;-webkit-backface-visibility:hidden;backface-visibility:hidden;overflow:hidden;min-height:100%;-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:2;background:inherit}body.pushable>.pusher{background:#fff}.pushable>.pusher:after{position:fixed;top:0;right:0;content:'';background:rgba(0,0,0,.4);overflow:hidden;opacity:0;-webkit-transition:opacity .5s;transition:opacity .5s;will-change:opacity;z-index:1000}.ui.sidebar.menu .item{border-radius:0!important}.pushable>.pusher.dimmed:after{width:100%!important;height:100%!important;opacity:1!important}.ui.animating.sidebar{visibility:visible}.ui.visible.sidebar{visibility:visible;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.left.visible.sidebar,.ui.right.visible.sidebar{-webkit-box-shadow:0 0 20px rgba(34,36,38,.15);box-shadow:0 0 20px rgba(34,36,38,.15)}.ui.bottom.visible.sidebar,.ui.top.visible.sidebar{-webkit-box-shadow:0 0 20px rgba(34,36,38,.15);box-shadow:0 0 20px rgba(34,36,38,.15)}.ui.visible.left.sidebar~.fixed,.ui.visible.left.sidebar~.pusher{-webkit-transform:translate3d(260px,0,0);transform:translate3d(260px,0,0)}.ui.visible.right.sidebar~.fixed,.ui.visible.right.sidebar~.pusher{-webkit-transform:translate3d(-260px,0,0);transform:translate3d(-260px,0,0)}.ui.visible.top.sidebar~.fixed,.ui.visible.top.sidebar~.pusher{-webkit-transform:translate3d(0,36px,0);transform:translate3d(0,36px,0)}.ui.visible.bottom.sidebar~.fixed,.ui.visible.bottom.sidebar~.pusher{-webkit-transform:translate3d(0,-36px,0);transform:translate3d(0,-36px,0)}.ui.visible.left.sidebar~.ui.visible.right.sidebar~.fixed,.ui.visible.left.sidebar~.ui.visible.right.sidebar~.pusher,.ui.visible.right.sidebar~.ui.visible.left.sidebar~.fixed,.ui.visible.right.sidebar~.ui.visible.left.sidebar~.pusher{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.thin.left.sidebar,.ui.thin.right.sidebar{width:150px}.ui[class*="very thin"].left.sidebar,.ui[class*="very thin"].right.sidebar{width:60px}.ui.left.sidebar,.ui.right.sidebar{width:260px}.ui.wide.left.sidebar,.ui.wide.right.sidebar{width:350px}.ui[class*="very wide"].left.sidebar,.ui[class*="very wide"].right.sidebar{width:475px}.ui.visible.thin.left.sidebar~.fixed,.ui.visible.thin.left.sidebar~.pusher{-webkit-transform:translate3d(150px,0,0);transform:translate3d(150px,0,0)}.ui.visible[class*="very thin"].left.sidebar~.fixed,.ui.visible[class*="very thin"].left.sidebar~.pusher{-webkit-transform:translate3d(60px,0,0);transform:translate3d(60px,0,0)}.ui.visible.wide.left.sidebar~.fixed,.ui.visible.wide.left.sidebar~.pusher{-webkit-transform:translate3d(350px,0,0);transform:translate3d(350px,0,0)}.ui.visible[class*="very wide"].left.sidebar~.fixed,.ui.visible[class*="very wide"].left.sidebar~.pusher{-webkit-transform:translate3d(475px,0,0);transform:translate3d(475px,0,0)}.ui.visible.thin.right.sidebar~.fixed,.ui.visible.thin.right.sidebar~.pusher{-webkit-transform:translate3d(-150px,0,0);transform:translate3d(-150px,0,0)}.ui.visible[class*="very thin"].right.sidebar~.fixed,.ui.visible[class*="very thin"].right.sidebar~.pusher{-webkit-transform:translate3d(-60px,0,0);transform:translate3d(-60px,0,0)}.ui.visible.wide.right.sidebar~.fixed,.ui.visible.wide.right.sidebar~.pusher{-webkit-transform:translate3d(-350px,0,0);transform:translate3d(-350px,0,0)}.ui.visible[class*="very wide"].right.sidebar~.fixed,.ui.visible[class*="very wide"].right.sidebar~.pusher{-webkit-transform:translate3d(-475px,0,0);transform:translate3d(-475px,0,0)}.ui.overlay.sidebar{z-index:102}.ui.left.overlay.sidebar{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.ui.right.overlay.sidebar{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.ui.top.overlay.sidebar{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.ui.bottom.overlay.sidebar{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.animating.ui.overlay.sidebar,.ui.visible.overlay.sidebar{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.ui.visible.left.overlay.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.visible.right.overlay.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.visible.top.overlay.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.visible.bottom.overlay.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.visible.overlay.sidebar~.fixed,.ui.visible.overlay.sidebar~.pusher{-webkit-transform:none!important;transform:none!important}.ui.push.sidebar{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:102}.ui.left.push.sidebar{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.ui.right.push.sidebar{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.ui.top.push.sidebar{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.ui.bottom.push.sidebar{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.ui.visible.push.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.uncover.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);z-index:1}.ui.visible.uncover.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.ui.slide.along.sidebar{z-index:1}.ui.left.slide.along.sidebar{-webkit-transform:translate3d(-50%,0,0);transform:translate3d(-50%,0,0)}.ui.right.slide.along.sidebar{-webkit-transform:translate3d(50%,0,0);transform:translate3d(50%,0,0)}.ui.top.slide.along.sidebar{-webkit-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}.ui.bottom.slide.along.sidebar{-webkit-transform:translate3d(0,50%,0);transform:translate3d(0,50%,0)}.ui.animating.slide.along.sidebar{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.ui.visible.slide.along.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.slide.out.sidebar{z-index:1}.ui.left.slide.out.sidebar{-webkit-transform:translate3d(50%,0,0);transform:translate3d(50%,0,0)}.ui.right.slide.out.sidebar{-webkit-transform:translate3d(-50%,0,0);transform:translate3d(-50%,0,0)}.ui.top.slide.out.sidebar{-webkit-transform:translate3d(0,50%,0);transform:translate3d(0,50%,0)}.ui.bottom.slide.out.sidebar{-webkit-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}.ui.animating.slide.out.sidebar{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.ui.visible.slide.out.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.scale.down.sidebar{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease;z-index:102}.ui.left.scale.down.sidebar{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.ui.right.scale.down.sidebar{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.ui.top.scale.down.sidebar{-webkit-transform:translate3d(0,-100%,0);transform:translate3d(0,-100%,0)}.ui.bottom.scale.down.sidebar{-webkit-transform:translate3d(0,100%,0);transform:translate3d(0,100%,0)}.ui.scale.down.left.sidebar~.pusher{-webkit-transform-origin:75% 50%;transform-origin:75% 50%}.ui.scale.down.right.sidebar~.pusher{-webkit-transform-origin:25% 50%;transform-origin:25% 50%}.ui.scale.down.top.sidebar~.pusher{-webkit-transform-origin:50% 75%;transform-origin:50% 75%}.ui.scale.down.bottom.sidebar~.pusher{-webkit-transform-origin:50% 25%;transform-origin:50% 25%}.ui.animating.scale.down>.visible.ui.sidebar{-webkit-transition:-webkit-transform .5s ease;transition:-webkit-transform .5s ease;transition:transform .5s ease;transition:transform .5s ease,-webkit-transform .5s ease}.ui.animating.scale.down.sidebar~.pusher,.ui.visible.scale.down.sidebar~.pusher{display:block!important;width:100%;height:100%;overflow:hidden!important}.ui.visible.scale.down.sidebar{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.ui.visible.scale.down.sidebar~.pusher{-webkit-transform:scale(.75);transform:scale(.75)}
\ No newline at end of file
diff --git a/public/dist/components/sidebar.min.js b/public/dist/components/sidebar.min.js
new file mode 100644
index 000000000..bc2a90757
--- /dev/null
+++ b/public/dist/components/sidebar.min.js
@@ -0,0 +1,11 @@
+/*
+ * # Fomantic UI - 2.8.8
+ * https://github.com/fomantic/Fomantic-UI
+ * http://fomantic-ui.com/
+ *
+ * Copyright 2021 Contributors
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+!function(D,j,R,z){"use strict";D.isFunction=D.isFunction||function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},j=void 0!==j&&j.Math==Math?j:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),D.fn.sidebar=function(C){var T,e=D(this),k=D(j),w=D(R),S=D("html"),x=D("head"),A=e.selector||"",F=(new Date).getTime(),O=[],P=C,E="string"==typeof P,H=[].slice.call(arguments,1),M=j.requestAnimationFrame||j.mozRequestAnimationFrame||j.webkitRequestAnimationFrame||j.msRequestAnimationFrame||function(e){setTimeout(e,0)};return e.each(function(){var s,a,e,i,l,c,u=D.isPlainObject(C)?D.extend(!0,{},D.fn.sidebar.settings,C):D.extend({},D.fn.sidebar.settings),n=u.selector,r=u.className,t=u.namespace,o=u.regExp,d=u.error,f="."+t,b="module-"+t,h=D(this),m=D(u.context),g=h.children(n.sidebar),v=(m.children(n.fixed),m.children(n.pusher)),p=this,y=h.data(b);c={initialize:function(){c.debug("Initializing sidebar",C),c.create.id(),l=c.get.transitionEvent(),u.delaySetup?M(c.setup.layout):c.setup.layout(),M(function(){c.setup.cache()}),c.instantiate()},instantiate:function(){c.verbose("Storing instance of module",c),y=c,h.data(b,c)},create:{id:function(){e=(Math.random().toString(16)+"000000000").substr(2,8),a="."+e,c.verbose("Creating unique id for element",e)}},destroy:function(){c.verbose("Destroying previous module for",h),h.off(f).removeData(b),c.is.ios()&&c.remove.ios(),m.off(a),k.off(a),w.off(a)},event:{clickaway:function(e){if(u.closable){var i=0=p.scrollHeight&&(p.scrollTop=p.scrollHeight-p.offsetHeight-1)},scroll:function(e){0===D(e.target).closest(n.sidebar).length&&e.preventDefault()}},bind:{clickaway:function(){c.verbose("Adding clickaway events to context",m),m.on("click"+a,c.event.clickaway).on("touchend"+a,c.event.clickaway)},scrollLock:function(){u.scrollLock&&(c.debug("Disabling page scroll"),k.on("DOMMouseScroll"+a,c.event.scroll)),c.verbose("Adding events to contain sidebar scroll"),w.on("touchmove"+a,c.event.touch),h.on("scroll"+f,c.event.containScroll)}},unbind:{clickaway:function(){c.verbose("Removing clickaway events from context",m),m.off(a)},scrollLock:function(){c.verbose("Removing scroll lock from page"),w.off(a),k.off(a),h.off("scroll"+f)}},add:{inlineCSS:function(){var e,i=c.cache.width||h.outerWidth(),n=c.cache.height||h.outerHeight(),t=c.is.rtl(),o=c.get.direction(),r={left:i,right:-i,top:n,bottom:-n};t&&(c.verbose("RTL detected, flipping widths"),r.left=-i,r.right=i),e="").appendTo(x),c.debug("Adding sizing css to head",s)}},refresh:function(){c.verbose("Refreshing selector cache"),m=D(u.context),g=m.children(n.sidebar),v=m.children(n.pusher),m.children(n.fixed),c.clear.cache()},refreshSidebars:function(){c.verbose("Refreshing other sidebars"),g=m.children(n.sidebar)},repaint:function(){c.verbose("Forcing repaint event"),p.style.display="none";p.offsetHeight;p.scrollTop=p.scrollTop,p.style.display=""},setup:{cache:function(){c.cache={width:h.outerWidth(),height:h.outerHeight()}},layout:function(){0===m.children(n.pusher).length&&(c.debug("Adding wrapper element for sidebar"),c.error(d.pusher),v=D('
'),m.children().not(n.omitted).not(g).wrapAll(v),c.refresh()),0!==h.nextAll(n.pusher).length&&h.nextAll(n.pusher)[0]===v[0]||(c.debug("Moved sidebar to correct parent element"),c.error(d.movedSidebar,p),h.detach().prependTo(m),c.refresh()),c.clear.cache(),c.set.pushable(),c.set.direction()}},attachEvents:function(e,i){var n=D(e);i=D.isFunction(c[i])?c[i]:c.toggle,0 0) {
+ module.verbose('Modifying existing settings', $existingModules);
+ $existingModules[name]('setting', setting, value);
+ }
+ }
+ }
+ });
+ },
+ settings: function(newSettings, modules, modifyExisting) {
+ modules = (typeof modules === 'string')
+ ? [modules]
+ : modules || settings.modules
+ ;
+ modifyExisting = (modifyExisting !== undefined)
+ ? modifyExisting
+ : true
+ ;
+ $.each(modules, function(index, name) {
+ var
+ $existingModules
+ ;
+ if(module.moduleExists(name)) {
+ module.verbose('Changing default setting', newSettings, name);
+ $.extend(true, $.fn[name].settings, newSettings);
+ if(modifyExisting && namespace) {
+ $existingModules = $(':data(module-' + namespace + ')');
+ if($existingModules.length > 0) {
+ module.verbose('Modifying existing settings', $existingModules);
+ $existingModules[name]('setting', newSettings);
+ }
+ }
+ }
+ });
+ }
+ },
+
+ enable: {
+ console: function() {
+ module.console(true);
+ },
+ debug: function(modules, modifyExisting) {
+ modules = modules || settings.modules;
+ module.debug('Enabling debug for modules', modules);
+ module.change.setting('debug', true, modules, modifyExisting);
+ },
+ verbose: function(modules, modifyExisting) {
+ modules = modules || settings.modules;
+ module.debug('Enabling verbose debug for modules', modules);
+ module.change.setting('verbose', true, modules, modifyExisting);
+ }
+ },
+ disable: {
+ console: function() {
+ module.console(false);
+ },
+ debug: function(modules, modifyExisting) {
+ modules = modules || settings.modules;
+ module.debug('Disabling debug for modules', modules);
+ module.change.setting('debug', false, modules, modifyExisting);
+ },
+ verbose: function(modules, modifyExisting) {
+ modules = modules || settings.modules;
+ module.debug('Disabling verbose debug for modules', modules);
+ module.change.setting('verbose', false, modules, modifyExisting);
+ }
+ },
+
+ console: function(enable) {
+ if(enable) {
+ if(instance.cache.console === undefined) {
+ module.error(error.console);
+ return;
+ }
+ module.debug('Restoring console function');
+ window.console = instance.cache.console;
+ }
+ else {
+ module.debug('Disabling console function');
+ instance.cache.console = window.console;
+ window.console = {
+ clear : function(){},
+ error : function(){},
+ group : function(){},
+ groupCollapsed : function(){},
+ groupEnd : function(){},
+ info : function(){},
+ log : function(){},
+ markTimeline : function(){},
+ warn : function(){}
+ };
+ }
+ },
+
+ destroy: function() {
+ module.verbose('Destroying previous site for', $module);
+ $module
+ .removeData(moduleNamespace)
+ ;
+ },
+
+ cache: {},
+
+ setting: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ settings[name] = value;
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Element' : element,
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ module.error(error.method, query);
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ module.destroy();
+ }
+ module.initialize();
+ }
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.site.settings = {
+
+ name : 'Site',
+ namespace : 'site',
+
+ error : {
+ console : 'Console cannot be restored, most likely it was overwritten outside of module',
+ method : 'The method you called is not defined.'
+ },
+
+ debug : false,
+ verbose : false,
+ performance : true,
+
+ modules: [
+ 'accordion',
+ 'api',
+ 'calendar',
+ 'checkbox',
+ 'dimmer',
+ 'dropdown',
+ 'embed',
+ 'form',
+ 'modal',
+ 'nag',
+ 'popup',
+ 'slider',
+ 'rating',
+ 'shape',
+ 'sidebar',
+ 'state',
+ 'sticky',
+ 'tab',
+ 'toast',
+ 'transition',
+ 'visibility',
+ 'visit'
+ ],
+
+ siteNamespace : 'site',
+ namespaceStub : {
+ cache : {},
+ config : {},
+ sections : {},
+ section : {},
+ utilities : {}
+ }
+
+};
+
+// allows for selection of elements with data attributes
+$.extend($.expr[ ":" ], {
+ data: ($.expr.createPseudo)
+ ? $.expr.createPseudo(function(dataName) {
+ return function(elem) {
+ return !!$.data(elem, dataName);
+ };
+ })
+ : function(elem, i, match) {
+ // support: jQuery < 1.8
+ return !!$.data(elem, match[ 3 ]);
+ }
+});
+
+
+})( jQuery, window, document );
diff --git a/public/dist/components/site.min.css b/public/dist/components/site.min.css
new file mode 100644
index 000000000..d5990c661
--- /dev/null
+++ b/public/dist/components/site.min.css
@@ -0,0 +1,9 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Site
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */@import url(https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,400%3B0,700%3B1,400%3B1,700&subset=latin&display=swap);body,html{height:100%}html{font-size:14px}body{margin:0;padding:0;overflow-x:hidden;min-width:320px;background:#fff;font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:14px;line-height:1.4285em;color:rgba(0,0,0,.87)}h1,h2,h3,h4,h5{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;line-height:1.28571429em;margin:calc(2rem - .1428571428571429em) 0 1rem;font-weight:700;padding:0}h1{min-height:1rem;font-size:2rem}h2{font-size:1.71428571rem}h3{font-size:1.28571429rem}h4{font-size:1.07142857rem}h5{font-size:1rem}h1:first-child,h2:first-child,h3:first-child,h4:first-child,h5:first-child{margin-top:0}h1:last-child,h2:last-child,h3:last-child,h4:last-child,h5:last-child{margin-bottom:0}p{margin:0 0 1em;line-height:1.4285em}p:first-child{margin-top:0}p:last-child{margin-bottom:0}a{color:#4183c4;text-decoration:none}a:hover{color:#1e70bf;text-decoration:none}::-webkit-selection{background-color:#cce2ff;color:rgba(0,0,0,.87)}::-moz-selection{background-color:#cce2ff;color:rgba(0,0,0,.87)}::selection{background-color:#cce2ff;color:rgba(0,0,0,.87)}input::-webkit-selection,textarea::-webkit-selection{background-color:rgba(100,100,100,.4);color:rgba(0,0,0,.87)}input::-moz-selection,textarea::-moz-selection{background-color:rgba(100,100,100,.4);color:rgba(0,0,0,.87)}input::selection,textarea::selection{background-color:rgba(100,100,100,.4);color:rgba(0,0,0,.87)}body ::-webkit-scrollbar{-webkit-appearance:none;width:10px;height:10px}body ::-webkit-scrollbar-track{background:rgba(0,0,0,.1);border-radius:0}body ::-webkit-scrollbar-thumb{cursor:pointer;border-radius:5px;background:rgba(0,0,0,.25);-webkit-transition:color .2s ease;transition:color .2s ease}body ::-webkit-scrollbar-thumb:window-inactive{background:rgba(0,0,0,.15)}body ::-webkit-scrollbar-thumb:hover{background:rgba(128,135,139,.8)}body .ui.inverted:not(.dimmer)::-webkit-scrollbar-track{background:rgba(255,255,255,.1)}body .ui.inverted:not(.dimmer)::-webkit-scrollbar-thumb{background:rgba(255,255,255,.25)}body .ui.inverted:not(.dimmer)::-webkit-scrollbar-thumb:window-inactive{background:rgba(255,255,255,.15)}body .ui.inverted:not(.dimmer)::-webkit-scrollbar-thumb:hover{background:rgba(255,255,255,.35)}
\ No newline at end of file
diff --git a/public/dist/components/site.min.js b/public/dist/components/site.min.js
new file mode 100644
index 000000000..bf9dbfbc3
--- /dev/null
+++ b/public/dist/components/site.min.js
@@ -0,0 +1,11 @@
+/*
+ * # Fomantic UI - 2.8.8
+ * https://github.com/fomantic/Fomantic-UI
+ * http://fomantic-ui.com/
+ *
+ * Copyright 2021 Contributors
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+!function(b,p,v,h){b.isFunction=b.isFunction||function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},b.site=b.fn.site=function(e){var a,c,i=(new Date).getTime(),t=[],n=e,o="string"==typeof n,l=[].slice.call(arguments,1),u=b.isPlainObject(e)?b.extend(!0,{},b.site.settings,e):b.extend({},b.site.settings),s=u.namespace,d=u.error,r="module-"+s,m=b(v),f=this,g=m.data(r);return a={initialize:function(){a.instantiate()},instantiate:function(){a.verbose("Storing instance of site",a),g=a,m.data(r,a)},normalize:function(){a.fix.console(),a.fix.requestAnimationFrame()},fix:{console:function(){a.debug("Normalizing window.console"),console!==h&&console.log!==h||(a.verbose("Console not available, normalizing events"),a.disable.console()),void 0!==console.group&&void 0!==console.groupEnd&&void 0!==console.groupCollapsed||(a.verbose("Console group not available, normalizing events"),p.console.group=function(){},p.console.groupEnd=function(){},p.console.groupCollapsed=function(){}),void 0===console.markTimeline&&(a.verbose("Mark timeline not available, normalizing events"),p.console.markTimeline=function(){})},consoleClear:function(){a.debug("Disabling programmatic console clearing"),p.console.clear=function(){}},requestAnimationFrame:function(){a.debug("Normalizing requestAnimationFrame"),p.requestAnimationFrame===h&&(a.debug("RequestAnimationFrame not available, normalizing event"),p.requestAnimationFrame=p.requestAnimationFrame||p.mozRequestAnimationFrame||p.webkitRequestAnimationFrame||p.msRequestAnimationFrame||function(e){setTimeout(e,0)})}},moduleExists:function(e){return b.fn[e]!==h&&b.fn[e].settings!==h},enabled:{modules:function(e){var o=[];return e=e||u.modules,b.each(e,function(e,n){a.moduleExists(n)&&o.push(n)}),o}},disabled:{modules:function(e){var o=[];return e=e||u.modules,b.each(e,function(e,n){a.moduleExists(n)||o.push(n)}),o}},change:{setting:function(t,s,e,r){e="string"==typeof e?"all"===e?u.modules:[e]:e||u.modules,r=r===h||r,b.each(e,function(e,n){var o,i=!a.moduleExists(n)||(b.fn[n].settings.namespace||!1);a.moduleExists(n)&&(a.verbose("Changing default setting",t,s,n),b.fn[n].settings[t]=s,r&&i&&0<(o=b(":data(module-"+i+")")).length&&(a.verbose("Modifying existing settings",o),o[n]("setting",t,s)))})},settings:function(i,e,t){e="string"==typeof e?[e]:e||u.modules,t=t===h||t,b.each(e,function(e,n){var o;a.moduleExists(n)&&(a.verbose("Changing default setting",i,n),b.extend(!0,b.fn[n].settings,i),t&&s&&0<(o=b(":data(module-"+s+")")).length&&(a.verbose("Modifying existing settings",o),o[n]("setting",i)))})}},enable:{console:function(){a.console(!0)},debug:function(e,n){e=e||u.modules,a.debug("Enabling debug for modules",e),a.change.setting("debug",!0,e,n)},verbose:function(e,n){e=e||u.modules,a.debug("Enabling verbose debug for modules",e),a.change.setting("verbose",!0,e,n)}},disable:{console:function(){a.console(!1)},debug:function(e,n){e=e||u.modules,a.debug("Disabling debug for modules",e),a.change.setting("debug",!1,e,n)},verbose:function(e,n){e=e||u.modules,a.debug("Disabling verbose debug for modules",e),a.change.setting("verbose",!1,e,n)}},console:function(e){if(e){if(g.cache.console===h)return void a.error(d.console);a.debug("Restoring console function"),p.console=g.cache.console}else a.debug("Disabling console function"),g.cache.console=p.console,p.console={clear:function(){},error:function(){},group:function(){},groupCollapsed:function(){},groupEnd:function(){},info:function(){},log:function(){},markTimeline:function(){},warn:function(){}}},destroy:function(){a.verbose("Destroying previous site for",m),m.removeData(r)},cache:{},setting:function(e,n){if(b.isPlainObject(e))b.extend(!0,u,e);else{if(n===h)return u[e];u[e]=n}},internal:function(e,n){if(b.isPlainObject(e))b.extend(!0,a,e);else{if(n===h)return a[e];a[e]=n}},debug:function(){u.debug&&(u.performance?a.performance.log(arguments):(a.debug=Function.prototype.bind.call(console.info,console,u.name+":"),a.debug.apply(console,arguments)))},verbose:function(){u.verbose&&u.debug&&(u.performance?a.performance.log(arguments):(a.verbose=Function.prototype.bind.call(console.info,console,u.name+":"),a.verbose.apply(console,arguments)))},error:function(){a.error=Function.prototype.bind.call(console.error,console,u.name+":"),a.error.apply(console,arguments)},performance:{log:function(e){var n,o;u.performance&&(o=(n=(new Date).getTime())-(i||n),i=n,t.push({Element:f,Name:e[0],Arguments:[].slice.call(e,1)||"","Execution Time":o})),clearTimeout(a.performance.timer),a.performance.timer=setTimeout(a.performance.display,500)},display:function(){var e=u.name+":",o=0;i=!1,clearTimeout(a.performance.timer),b.each(t,function(e,n){o+=n["Execution Time"]}),e+=" "+o+"ms",(console.group!==h||console.table!==h)&&0 .labels .label {
+ -webkit-transform: translate(-100%, -100%);
+ transform: translate(-100%, -100%);
+}
+
+
+/*******************************
+ Variations
+*******************************/
+
+
+/*--------------
+ Vertical
+ ---------------*/
+
+.ui.vertical.slider {
+ height: 100%;
+ width: 1.5em;
+ padding: 0.5em 1em;
+}
+.ui.vertical.slider .inner {
+ height: 100%;
+}
+.ui.vertical.slider .inner .track {
+ height: 100%;
+ width: 0.4em;
+ left: 0.55em;
+ top: 0;
+}
+.ui.vertical.slider .inner .track-fill {
+ width: 0.4em;
+ left: 0.55em;
+ top: 0;
+}
+
+/* Vertical Reversed */
+.ui.vertical.reversed.slider .inner .thumb {
+ top: auto;
+ bottom: 0;
+}
+.ui.vertical.reversed.slider .inner .track-fill {
+ top: auto;
+ bottom: 0;
+}
+
+/*--------------
+ Labeled
+ ---------------*/
+
+.ui.labeled.slider > .labels {
+ height: 1.5em;
+ width: auto;
+ margin: 0;
+ padding: 0;
+ position: absolute;
+ top: 50%;
+ left: 0;
+ right: 0;
+}
+.ui.labeled.slider:not(.vertical) > .labels {
+ -webkit-transform: translateY(-50%);
+ transform: translateY(-50%);
+}
+.ui.labeled.slider > .labels .label {
+ display: -webkit-inline-box;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ padding: 0.2em 0;
+ position: absolute;
+ -webkit-transform: translate(-50%, -100%);
+ transform: translate(-50%, -100%);
+ white-space: nowrap;
+}
+.ui.bottom.aligned.labeled.slider > .labels .label {
+ bottom: 0;
+ -webkit-transform: translate(-50%, 100%);
+ transform: translate(-50%, 100%);
+}
+.ui.labeled.ticked.slider > .labels .label:after {
+ content: ' ';
+ height: 1.5em;
+ width: 1px;
+ background: #ccc;
+ position: absolute;
+ top: 100%;
+ left: 50%;
+}
+.ui.bottom.aligned.labeled.ticked.slider > .labels .label:after {
+ top: auto;
+ bottom: 100%;
+}
+.ui.labeled.ticked.slider > .labels .halftick.label:after {
+ height: 0.75em;
+}
+
+/* Vertical Labels */
+.ui.labeled.vertical.slider > .labels {
+ width: 1.5em;
+ height: auto;
+ left: 50%;
+ top: 0;
+ bottom: 0;
+ -webkit-transform: translateX(-50%);
+ transform: translateX(-50%);
+}
+.ui.labeled.vertical.slider > .labels .label {
+ -webkit-transform: translate(-100%, -50%);
+ transform: translate(-100%, -50%);
+}
+.ui.labeled.vertical.slider > .labels .label:after {
+ width: 1.5em;
+ height: 1px;
+ left: 100%;
+ top: 50%;
+}
+.ui.labeled.vertical.slider > .labels .halftick.label:after {
+ width: 0.75em;
+ height: 1px;
+}
+
+/* Vertical Reversed Labels */
+.ui.labeled.vertical.reversed.slider > .labels .label {
+ -webkit-transform: translate(-100%, 50%);
+ transform: translate(-100%, 50%);
+}
+
+/*--------------
+ Hover
+---------------*/
+
+.ui.hover.slider .inner .thumb {
+ opacity: 0;
+ -webkit-transition: opacity 0.2s linear;
+ transition: opacity 0.2s linear;
+}
+.ui.hover.slider:not(.disabled):hover .inner .thumb,
+.ui.hover.slider:not(.disabled):focus .inner .thumb {
+ opacity: 1;
+}
+
+/*--------------
+ Inverted
+ ---------------*/
+
+.ui.inverted.slider .inner .track-fill {
+ background-color: #545454;
+}
+.ui.inverted.slider .inner .track {
+ background-color: rgba(255, 255, 255, 0.08);
+}
+
+/*--------------
+ Colors
+---------------*/
+
+
+/* Standard */
+.ui.primary.slider .inner .track-fill {
+ background-color: #2185D0;
+}
+.ui.primary.inverted.slider .inner .track-fill {
+ background-color: #54C8FF;
+}
+
+/* Basic */
+.ui.primary.slider.basic .inner .thumb {
+ background-color: #2185D0;
+}
+.ui.primary.slider.basic .inner .thumb:hover,
+.ui.primary.slider.basic:focus .inner .thumb {
+ background-color: #1678c2;
+}
+
+/* Basic Inverted */
+.ui.primary.inverted.slider.basic .inner .thumb {
+ background-color: #54C8FF;
+}
+.ui.primary.inverted.slider.basic .inner .thumb:hover,
+.ui.primary.inverted.slider.basic:focus .inner .thumb {
+ background-color: #21b8ff;
+}
+
+/* Standard */
+.ui.secondary.slider .inner .track-fill {
+ background-color: #1B1C1D;
+}
+.ui.secondary.inverted.slider .inner .track-fill {
+ background-color: #545454;
+}
+
+/* Basic */
+.ui.secondary.slider.basic .inner .thumb {
+ background-color: #1B1C1D;
+}
+.ui.secondary.slider.basic .inner .thumb:hover,
+.ui.secondary.slider.basic:focus .inner .thumb {
+ background-color: #27292a;
+}
+
+/* Basic Inverted */
+.ui.secondary.inverted.slider.basic .inner .thumb {
+ background-color: #545454;
+}
+.ui.secondary.inverted.slider.basic .inner .thumb:hover,
+.ui.secondary.inverted.slider.basic:focus .inner .thumb {
+ background-color: #6e6e6e;
+}
+
+/* Standard */
+.ui.red.slider .inner .track-fill {
+ background-color: #DB2828;
+}
+.ui.red.inverted.slider .inner .track-fill {
+ background-color: #FF695E;
+}
+
+/* Basic */
+.ui.red.slider.basic .inner .thumb {
+ background-color: #DB2828;
+}
+.ui.red.slider.basic .inner .thumb:hover,
+.ui.red.slider.basic:focus .inner .thumb {
+ background-color: #d01919;
+}
+
+/* Basic Inverted */
+.ui.red.inverted.slider.basic .inner .thumb {
+ background-color: #FF695E;
+}
+.ui.red.inverted.slider.basic .inner .thumb:hover,
+.ui.red.inverted.slider.basic:focus .inner .thumb {
+ background-color: #ff392b;
+}
+
+/* Standard */
+.ui.orange.slider .inner .track-fill {
+ background-color: #F2711C;
+}
+.ui.orange.inverted.slider .inner .track-fill {
+ background-color: #FF851B;
+}
+
+/* Basic */
+.ui.orange.slider.basic .inner .thumb {
+ background-color: #F2711C;
+}
+.ui.orange.slider.basic .inner .thumb:hover,
+.ui.orange.slider.basic:focus .inner .thumb {
+ background-color: #f26202;
+}
+
+/* Basic Inverted */
+.ui.orange.inverted.slider.basic .inner .thumb {
+ background-color: #FF851B;
+}
+.ui.orange.inverted.slider.basic .inner .thumb:hover,
+.ui.orange.inverted.slider.basic:focus .inner .thumb {
+ background-color: #e76b00;
+}
+
+/* Standard */
+.ui.yellow.slider .inner .track-fill {
+ background-color: #FBBD08;
+}
+.ui.yellow.inverted.slider .inner .track-fill {
+ background-color: #FFE21F;
+}
+
+/* Basic */
+.ui.yellow.slider.basic .inner .thumb {
+ background-color: #FBBD08;
+}
+.ui.yellow.slider.basic .inner .thumb:hover,
+.ui.yellow.slider.basic:focus .inner .thumb {
+ background-color: #eaae00;
+}
+
+/* Basic Inverted */
+.ui.yellow.inverted.slider.basic .inner .thumb {
+ background-color: #FFE21F;
+}
+.ui.yellow.inverted.slider.basic .inner .thumb:hover,
+.ui.yellow.inverted.slider.basic:focus .inner .thumb {
+ background-color: #ebcd00;
+}
+
+/* Standard */
+.ui.olive.slider .inner .track-fill {
+ background-color: #B5CC18;
+}
+.ui.olive.inverted.slider .inner .track-fill {
+ background-color: #D9E778;
+}
+
+/* Basic */
+.ui.olive.slider.basic .inner .thumb {
+ background-color: #B5CC18;
+}
+.ui.olive.slider.basic .inner .thumb:hover,
+.ui.olive.slider.basic:focus .inner .thumb {
+ background-color: #a7bd0d;
+}
+
+/* Basic Inverted */
+.ui.olive.inverted.slider.basic .inner .thumb {
+ background-color: #D9E778;
+}
+.ui.olive.inverted.slider.basic .inner .thumb:hover,
+.ui.olive.inverted.slider.basic:focus .inner .thumb {
+ background-color: #d2e745;
+}
+
+/* Standard */
+.ui.green.slider .inner .track-fill {
+ background-color: #21BA45;
+}
+.ui.green.inverted.slider .inner .track-fill {
+ background-color: #2ECC40;
+}
+
+/* Basic */
+.ui.green.slider.basic .inner .thumb {
+ background-color: #21BA45;
+}
+.ui.green.slider.basic .inner .thumb:hover,
+.ui.green.slider.basic:focus .inner .thumb {
+ background-color: #16ab39;
+}
+
+/* Basic Inverted */
+.ui.green.inverted.slider.basic .inner .thumb {
+ background-color: #2ECC40;
+}
+.ui.green.inverted.slider.basic .inner .thumb:hover,
+.ui.green.inverted.slider.basic:focus .inner .thumb {
+ background-color: #1ea92e;
+}
+
+/* Standard */
+.ui.teal.slider .inner .track-fill {
+ background-color: #00B5AD;
+}
+.ui.teal.inverted.slider .inner .track-fill {
+ background-color: #6DFFFF;
+}
+
+/* Basic */
+.ui.teal.slider.basic .inner .thumb {
+ background-color: #00B5AD;
+}
+.ui.teal.slider.basic .inner .thumb:hover,
+.ui.teal.slider.basic:focus .inner .thumb {
+ background-color: #009c95;
+}
+
+/* Basic Inverted */
+.ui.teal.inverted.slider.basic .inner .thumb {
+ background-color: #6DFFFF;
+}
+.ui.teal.inverted.slider.basic .inner .thumb:hover,
+.ui.teal.inverted.slider.basic:focus .inner .thumb {
+ background-color: #3affff;
+}
+
+/* Standard */
+.ui.blue.slider .inner .track-fill {
+ background-color: #2185D0;
+}
+.ui.blue.inverted.slider .inner .track-fill {
+ background-color: #54C8FF;
+}
+
+/* Basic */
+.ui.blue.slider.basic .inner .thumb {
+ background-color: #2185D0;
+}
+.ui.blue.slider.basic .inner .thumb:hover,
+.ui.blue.slider.basic:focus .inner .thumb {
+ background-color: #1678c2;
+}
+
+/* Basic Inverted */
+.ui.blue.inverted.slider.basic .inner .thumb {
+ background-color: #54C8FF;
+}
+.ui.blue.inverted.slider.basic .inner .thumb:hover,
+.ui.blue.inverted.slider.basic:focus .inner .thumb {
+ background-color: #21b8ff;
+}
+
+/* Standard */
+.ui.violet.slider .inner .track-fill {
+ background-color: #6435C9;
+}
+.ui.violet.inverted.slider .inner .track-fill {
+ background-color: #A291FB;
+}
+
+/* Basic */
+.ui.violet.slider.basic .inner .thumb {
+ background-color: #6435C9;
+}
+.ui.violet.slider.basic .inner .thumb:hover,
+.ui.violet.slider.basic:focus .inner .thumb {
+ background-color: #5829bb;
+}
+
+/* Basic Inverted */
+.ui.violet.inverted.slider.basic .inner .thumb {
+ background-color: #A291FB;
+}
+.ui.violet.inverted.slider.basic .inner .thumb:hover,
+.ui.violet.inverted.slider.basic:focus .inner .thumb {
+ background-color: #745aff;
+}
+
+/* Standard */
+.ui.purple.slider .inner .track-fill {
+ background-color: #A333C8;
+}
+.ui.purple.inverted.slider .inner .track-fill {
+ background-color: #DC73FF;
+}
+
+/* Basic */
+.ui.purple.slider.basic .inner .thumb {
+ background-color: #A333C8;
+}
+.ui.purple.slider.basic .inner .thumb:hover,
+.ui.purple.slider.basic:focus .inner .thumb {
+ background-color: #9627ba;
+}
+
+/* Basic Inverted */
+.ui.purple.inverted.slider.basic .inner .thumb {
+ background-color: #DC73FF;
+}
+.ui.purple.inverted.slider.basic .inner .thumb:hover,
+.ui.purple.inverted.slider.basic:focus .inner .thumb {
+ background-color: #cf40ff;
+}
+
+/* Standard */
+.ui.pink.slider .inner .track-fill {
+ background-color: #E03997;
+}
+.ui.pink.inverted.slider .inner .track-fill {
+ background-color: #FF8EDF;
+}
+
+/* Basic */
+.ui.pink.slider.basic .inner .thumb {
+ background-color: #E03997;
+}
+.ui.pink.slider.basic .inner .thumb:hover,
+.ui.pink.slider.basic:focus .inner .thumb {
+ background-color: #e61a8d;
+}
+
+/* Basic Inverted */
+.ui.pink.inverted.slider.basic .inner .thumb {
+ background-color: #FF8EDF;
+}
+.ui.pink.inverted.slider.basic .inner .thumb:hover,
+.ui.pink.inverted.slider.basic:focus .inner .thumb {
+ background-color: #ff5bd1;
+}
+
+/* Standard */
+.ui.brown.slider .inner .track-fill {
+ background-color: #A5673F;
+}
+.ui.brown.inverted.slider .inner .track-fill {
+ background-color: #D67C1C;
+}
+
+/* Basic */
+.ui.brown.slider.basic .inner .thumb {
+ background-color: #A5673F;
+}
+.ui.brown.slider.basic .inner .thumb:hover,
+.ui.brown.slider.basic:focus .inner .thumb {
+ background-color: #975b33;
+}
+
+/* Basic Inverted */
+.ui.brown.inverted.slider.basic .inner .thumb {
+ background-color: #D67C1C;
+}
+.ui.brown.inverted.slider.basic .inner .thumb:hover,
+.ui.brown.inverted.slider.basic:focus .inner .thumb {
+ background-color: #b0620f;
+}
+
+/* Standard */
+.ui.grey.slider .inner .track-fill {
+ background-color: #767676;
+}
+.ui.grey.inverted.slider .inner .track-fill {
+ background-color: #DCDDDE;
+}
+
+/* Basic */
+.ui.grey.slider.basic .inner .thumb {
+ background-color: #767676;
+}
+.ui.grey.slider.basic .inner .thumb:hover,
+.ui.grey.slider.basic:focus .inner .thumb {
+ background-color: #838383;
+}
+
+/* Basic Inverted */
+.ui.grey.inverted.slider.basic .inner .thumb {
+ background-color: #DCDDDE;
+}
+.ui.grey.inverted.slider.basic .inner .thumb:hover,
+.ui.grey.inverted.slider.basic:focus .inner .thumb {
+ background-color: #c2c4c5;
+}
+
+/* Standard */
+.ui.black.slider .inner .track-fill {
+ background-color: #1B1C1D;
+}
+.ui.black.inverted.slider .inner .track-fill {
+ background-color: #545454;
+}
+
+/* Basic */
+.ui.black.slider.basic .inner .thumb {
+ background-color: #1B1C1D;
+}
+.ui.black.slider.basic .inner .thumb:hover,
+.ui.black.slider.basic:focus .inner .thumb {
+ background-color: #27292a;
+}
+
+/* Basic Inverted */
+.ui.black.inverted.slider.basic .inner .thumb {
+ background-color: #545454;
+}
+.ui.black.inverted.slider.basic .inner .thumb:hover,
+.ui.black.inverted.slider.basic:focus .inner .thumb {
+ background-color: #000000;
+}
+
+/*--------------
+ Basic
+ ---------------*/
+
+
+/* Standard */
+.ui.slider.basic .inner .thumb {
+ background-color: #1B1C1D;
+}
+.ui.slider.basic .inner .thumb:hover,
+.ui.slider.basic:focus .inner .thumb {
+ background-color: #27292a;
+}
+
+/*--------------
+ Basic Inverted
+ ---------------*/
+
+
+/* Standard */
+.ui.inverted.slider.basic .inner .thumb {
+ background-color: #545454;
+}
+.ui.inverted.slider.basic .inner .thumb:hover,
+.ui.inverted.slider.basic:focus .inner .thumb {
+ background-color: #000000;
+}
+
+/*--------------
+ Sizing
+---------------*/
+
+.ui.slider.small .inner .thumb {
+ height: 1em;
+ width: 1em;
+}
+.ui.slider.small:not(.vertical) .inner {
+ height: 1em;
+}
+.ui.slider.small:not(.vertical) .inner .track,
+.ui.slider.small:not(.vertical) .inner .track-fill {
+ height: 0.3em;
+ top: 0.35em;
+}
+.ui.small.labeled.slider:not(.vertical) > .labels,
+.ui.small.labeled.slider:not(.vertical) > .labels .label:after {
+ height: 1em;
+}
+.ui.small.labeled.slider:not(.vertical) > .labels .halftick.label:after {
+ height: 0.5em;
+}
+
+/* Small Vertical */
+.ui.slider.small.vertical .inner {
+ width: 1em;
+}
+.ui.slider.small.vertical .inner .track,
+.ui.slider.small.vertical .inner .track-fill {
+ width: 0.3em;
+ left: 0.35em;
+}
+.ui.small.labeled.vertical.slider > .labels,
+.ui.small.labeled.vertical.slider > .labels .label:after {
+ width: 1em;
+}
+.ui.small.labeled.vertical.slider > .labels .halftick.label:after {
+ width: 0.5em;
+}
+.ui.slider.large .inner .thumb {
+ height: 2em;
+ width: 2em;
+}
+.ui.slider.large:not(.vertical) .inner {
+ height: 2em;
+}
+.ui.slider.large:not(.vertical) .inner .track,
+.ui.slider.large:not(.vertical) .inner .track-fill {
+ height: 0.5em;
+ top: 0.75em;
+}
+.ui.large.labeled.slider:not(.vertical) > .labels,
+.ui.large.labeled.slider:not(.vertical) > .labels .label:after {
+ height: 2em;
+}
+.ui.large.labeled.slider:not(.vertical) > .labels .halftick.label:after {
+ height: 1em;
+}
+
+/* Small Vertical */
+.ui.slider.large.vertical .inner {
+ width: 2em;
+}
+.ui.slider.large.vertical .inner .track,
+.ui.slider.large.vertical .inner .track-fill {
+ width: 0.5em;
+ left: 0.75em;
+}
+.ui.large.labeled.vertical.slider > .labels,
+.ui.large.labeled.vertical.slider > .labels .label:after {
+ width: 2em;
+}
+.ui.large.labeled.vertical.slider > .labels .halftick.label:after {
+ width: 1em;
+}
+.ui.slider.big .inner .thumb {
+ height: 2.5em;
+ width: 2.5em;
+}
+.ui.slider.big:not(.vertical) .inner {
+ height: 2.5em;
+}
+.ui.slider.big:not(.vertical) .inner .track,
+.ui.slider.big:not(.vertical) .inner .track-fill {
+ height: 0.6em;
+ top: 0.95em;
+}
+.ui.big.labeled.slider:not(.vertical) > .labels,
+.ui.big.labeled.slider:not(.vertical) > .labels .label:after {
+ height: 2.5em;
+}
+.ui.big.labeled.slider:not(.vertical) > .labels .halftick.label:after {
+ height: 1.25em;
+}
+
+/* Small Vertical */
+.ui.slider.big.vertical .inner {
+ width: 2.5em;
+}
+.ui.slider.big.vertical .inner .track,
+.ui.slider.big.vertical .inner .track-fill {
+ width: 0.6em;
+ left: 0.95em;
+}
+.ui.big.labeled.vertical.slider > .labels,
+.ui.big.labeled.vertical.slider > .labels .label:after {
+ width: 2.5em;
+}
+.ui.big.labeled.vertical.slider > .labels .halftick.label:after {
+ width: 1.25em;
+}
+
+
+/*******************************
+ Slider Overrides
+*******************************/
+
diff --git a/public/dist/components/slider.js b/public/dist/components/slider.js
new file mode 100644
index 000000000..7b24ff586
--- /dev/null
+++ b/public/dist/components/slider.js
@@ -0,0 +1,1338 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Slider
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ( $, window, document, undefined ) {
+
+"use strict";
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.slider = function(parameters) {
+
+ var
+ $allModules = $(this),
+ $window = $(window),
+
+ moduleSelector = $allModules.selector || '',
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+
+ alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'],
+
+ SINGLE_STEP = 1,
+ BIG_STEP = 2,
+ NO_STEP = 0,
+ SINGLE_BACKSTEP = -1,
+ BIG_BACKSTEP = -2,
+
+ // Used to manage document bound events.
+ // Use this so that we can distinguish between which document events are bound to which range.
+ currentRange = 0,
+
+ returnedValue
+ ;
+
+ $allModules
+ .each(function() {
+
+ var
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.fn.slider.settings, parameters)
+ : $.extend({}, $.fn.slider.settings),
+
+ className = settings.className,
+ metadata = settings.metadata,
+ namespace = settings.namespace,
+ error = settings.error,
+ keys = settings.keys,
+ interpretLabel = settings.interpretLabel,
+
+ isHover = false,
+ eventNamespace = '.' + namespace,
+ moduleNamespace = 'module-' + namespace,
+
+ $module = $(this),
+ $currThumb,
+ $thumb,
+ $secondThumb,
+ $track,
+ $trackFill,
+ $labels,
+
+ element = this,
+ instance = $module.data(moduleNamespace),
+
+ documentEventID,
+
+ value,
+ position,
+ secondPos,
+ offset,
+ precision,
+ isTouch,
+ gapRatio = 1,
+ previousValue,
+
+ initialPosition,
+ initialLoad,
+ module
+ ;
+
+ module = {
+
+ initialize: function() {
+ module.debug('Initializing slider', settings);
+ initialLoad = true;
+
+ currentRange += 1;
+ documentEventID = currentRange;
+
+ isTouch = module.setup.testOutTouch();
+ module.setup.layout();
+ module.setup.labels();
+
+ if(!module.is.disabled()) {
+ module.bind.events();
+ }
+
+ module.read.metadata();
+ module.read.settings();
+
+ initialLoad = false;
+ module.instantiate();
+ },
+
+ instantiate: function() {
+ module.verbose('Storing instance of slider', module);
+ instance = module;
+ $module
+ .data(moduleNamespace, module)
+ ;
+ },
+
+ destroy: function() {
+ module.verbose('Destroying previous slider for', $module);
+ clearInterval(instance.interval);
+ module.unbind.events();
+ module.unbind.slidingEvents();
+ $module.removeData(moduleNamespace);
+ instance = undefined;
+ },
+
+ setup: {
+ layout: function() {
+ if( $module.attr('tabindex') === undefined) {
+ $module.attr('tabindex', 0);
+ }
+ if($module.find('.inner').length == 0) {
+ $module.append(""
+ + "
"
+ + "
"
+ + "
"
+ + "
");
+ }
+ precision = module.get.precision();
+ $thumb = $module.find('.thumb:not(.second)');
+ $currThumb = $thumb;
+ if(module.is.range()) {
+ if($module.find('.thumb.second').length == 0) {
+ $module.find('.inner').append("
");
+ }
+ $secondThumb = $module.find('.thumb.second');
+ }
+ $track = $module.find('.track');
+ $trackFill = $module.find('.track-fill');
+ offset = $thumb.width() / 2;
+ },
+ labels: function() {
+ if(module.is.labeled()) {
+ $labels = $module.find('.labels:not(.auto)');
+ if($labels.length != 0) {
+ module.setup.customLabel();
+ } else {
+ module.setup.autoLabel();
+ }
+
+ if (settings.showLabelTicks) {
+ $module.addClass(className.ticked)
+ }
+ }
+ },
+ testOutTouch: function() {
+ try {
+ document.createEvent('TouchEvent');
+ return true;
+ } catch (e) {
+ return false;
+ }
+ },
+ customLabel: function() {
+ var
+ $children = $labels.find('.label'),
+ numChildren = $children.length,
+ min = module.get.min(),
+ max = module.get.max(),
+ ratio
+ ;
+ $children.each(function(index) {
+ var
+ $child = $(this),
+ attrValue = $child.attr('data-value')
+ ;
+ if(attrValue) {
+ attrValue = attrValue > max ? max : attrValue < min ? min : attrValue;
+ ratio = (attrValue - min) / (max - min);
+ } else {
+ ratio = (index + 1) / (numChildren + 1);
+ }
+ module.update.labelPosition(ratio, $(this));
+ });
+ },
+ autoLabel: function() {
+ $labels = $module.find('.labels');
+ if($labels.length != 0) {
+ $labels.empty();
+ }
+ else {
+ $labels = $module.append('').find('.labels');
+ }
+ for(var i = 0, len = module.get.numLabels(); i <= len; i++) {
+ var
+ labelText = module.get.label(i),
+ $label = (labelText !== "")
+ ? !(i % module.get.gapRatio())
+ ? $('' + labelText + ' ')
+ : $(' ')
+ : null,
+ ratio = i / len
+ ;
+ if($label) {
+ module.update.labelPosition(ratio, $label);
+ $labels.append($label);
+ }
+ }
+ }
+ },
+
+ bind: {
+ events: function() {
+ module.bind.globalKeyboardEvents();
+ module.bind.keyboardEvents();
+ module.bind.mouseEvents();
+ if(module.is.touch()) {
+ module.bind.touchEvents();
+ }
+ if (settings.autoAdjustLabels) {
+ module.bind.windowEvents();
+ }
+ },
+ keyboardEvents: function() {
+ module.verbose('Binding keyboard events');
+ $module.on('keydown' + eventNamespace, module.event.keydown);
+ },
+ globalKeyboardEvents: function() {
+ $(document).on('keydown' + eventNamespace + documentEventID, module.event.activateFocus);
+ },
+ mouseEvents: function() {
+ module.verbose('Binding mouse events');
+ $module.find('.track, .thumb, .inner').on('mousedown' + eventNamespace, function(event) {
+ event.stopImmediatePropagation();
+ event.preventDefault();
+ module.event.down(event);
+ });
+ $module.on('mousedown' + eventNamespace, module.event.down);
+ $module.on('mouseenter' + eventNamespace, function(event) {
+ isHover = true;
+ });
+ $module.on('mouseleave' + eventNamespace, function(event) {
+ isHover = false;
+ });
+ },
+ touchEvents: function() {
+ module.verbose('Binding touch events');
+ $module.find('.track, .thumb, .inner').on('touchstart' + eventNamespace, function(event) {
+ event.stopImmediatePropagation();
+ event.preventDefault();
+ module.event.down(event);
+ });
+ $module.on('touchstart' + eventNamespace, module.event.down);
+ },
+ slidingEvents: function() {
+ // these don't need the identifier because we only ever want one of them to be registered with document
+ module.verbose('Binding page wide events while handle is being draged');
+ if(module.is.touch()) {
+ $(document).on('touchmove' + eventNamespace, module.event.move);
+ $(document).on('touchend' + eventNamespace, module.event.up);
+ }
+ else {
+ $(document).on('mousemove' + eventNamespace, module.event.move);
+ $(document).on('mouseup' + eventNamespace, module.event.up);
+ }
+ },
+ windowEvents: function() {
+ $window.on('resize' + eventNamespace, module.event.resize);
+ }
+ },
+
+ unbind: {
+ events: function() {
+ $module.find('.track, .thumb, .inner').off('mousedown' + eventNamespace);
+ $module.find('.track, .thumb, .inner').off('touchstart' + eventNamespace);
+ $module.off('mousedown' + eventNamespace);
+ $module.off('mouseenter' + eventNamespace);
+ $module.off('mouseleave' + eventNamespace);
+ $module.off('touchstart' + eventNamespace);
+ $module.off('keydown' + eventNamespace);
+ $module.off('focusout' + eventNamespace);
+ $(document).off('keydown' + eventNamespace + documentEventID, module.event.activateFocus);
+ $window.off('resize' + eventNamespace);
+ },
+ slidingEvents: function() {
+ if(module.is.touch()) {
+ $(document).off('touchmove' + eventNamespace);
+ $(document).off('touchend' + eventNamespace);
+ } else {
+ $(document).off('mousemove' + eventNamespace);
+ $(document).off('mouseup' + eventNamespace);
+ }
+ },
+ },
+
+ event: {
+ down: function(event) {
+ event.preventDefault();
+ if(module.is.range()) {
+ var
+ eventPos = module.determine.eventPos(event),
+ newPos = module.determine.pos(eventPos)
+ ;
+ // Special handling if range mode and both thumbs have the same value
+ if(settings.preventCrossover && module.is.range() && module.thumbVal === module.secondThumbVal) {
+ initialPosition = newPos;
+ $currThumb = undefined;
+ } else {
+ $currThumb = module.determine.closestThumb(newPos);
+ }
+ if (previousValue === undefined) {
+ previousValue = module.get.currentThumbValue();
+ }
+ } else if (previousValue === undefined) {
+ previousValue = module.get.value();
+ }
+
+ if(!module.is.disabled()) {
+ module.bind.slidingEvents();
+ }
+ },
+ move: function(event) {
+ event.preventDefault();
+ var value = module.determine.valueFromEvent(event);
+ if($currThumb === undefined) {
+ var
+ eventPos = module.determine.eventPos(event),
+ newPos = module.determine.pos(eventPos)
+ ;
+ $currThumb = initialPosition > newPos ? $thumb : $secondThumb;
+ }
+ if(module.get.step() == 0 || module.is.smooth()) {
+ var
+ thumbVal = module.thumbVal,
+ secondThumbVal = module.secondThumbVal,
+ thumbSmoothVal = module.determine.smoothValueFromEvent(event)
+ ;
+ if(!$currThumb.hasClass('second')) {
+ if(settings.preventCrossover && module.is.range()) {
+ value = Math.min(secondThumbVal, value);
+ thumbSmoothVal = Math.min(secondThumbVal, thumbSmoothVal);
+ }
+ thumbVal = value;
+ } else {
+ if(settings.preventCrossover && module.is.range()) {
+ value = Math.max(thumbVal, value);
+ thumbSmoothVal = Math.max(thumbVal, thumbSmoothVal);
+ }
+ secondThumbVal = value;
+ }
+ value = Math.abs(thumbVal - (secondThumbVal || 0));
+ module.update.position(thumbSmoothVal);
+ settings.onMove.call(element, value, thumbVal, secondThumbVal);
+ } else {
+ module.update.value(value, function(value, thumbVal, secondThumbVal) {
+ settings.onMove.call(element, value, thumbVal, secondThumbVal);
+ });
+ }
+ },
+ up: function(event) {
+ event.preventDefault();
+ var value = module.determine.valueFromEvent(event);
+ module.set.value(value);
+ module.unbind.slidingEvents();
+ if (previousValue !== undefined) {
+ previousValue = undefined;
+ }
+ },
+ keydown: function(event, first) {
+ if(settings.preventCrossover && module.is.range() && module.thumbVal === module.secondThumbVal) {
+ $currThumb = undefined;
+ }
+ if(module.is.focused()) {
+ $(document).trigger(event);
+ }
+ if(first || module.is.focused()) {
+ var step = module.determine.keyMovement(event);
+ if(step != NO_STEP) {
+ event.preventDefault();
+ switch(step) {
+ case SINGLE_STEP:
+ module.takeStep();
+ break;
+ case BIG_STEP:
+ module.takeStep(module.get.multiplier());
+ break;
+ case SINGLE_BACKSTEP:
+ module.backStep();
+ break;
+ case BIG_BACKSTEP:
+ module.backStep(module.get.multiplier());
+ break;
+ }
+ }
+ }
+ },
+ activateFocus: function(event) {
+ if(!module.is.focused() && module.is.hover() && module.determine.keyMovement(event) != NO_STEP) {
+ event.preventDefault();
+ module.event.keydown(event, true);
+ $module.focus();
+ }
+ },
+ resize: function(_event) {
+ // To avoid a useless performance cost, we only call the label refresh when its necessary
+ if (gapRatio != module.get.gapRatio()) {
+ module.setup.labels();
+ gapRatio = module.get.gapRatio();
+ }
+ }
+ },
+
+ resync: function() {
+ module.verbose('Resyncing thumb position based on value');
+ if(module.is.range()) {
+ module.update.position(module.secondThumbVal, $secondThumb);
+ }
+ module.update.position(module.thumbVal, $thumb);
+ module.setup.labels();
+ },
+ takeStep: function(multiplier) {
+ var
+ multiplier = multiplier != undefined ? multiplier : 1,
+ step = module.get.step(),
+ currValue = module.get.currentThumbValue()
+ ;
+ module.verbose('Taking a step');
+ if(step > 0) {
+ module.set.value(currValue + step * multiplier);
+ } else if (step == 0){
+ var
+ precision = module.get.precision(),
+ newValue = currValue + (multiplier/precision)
+ ;
+ module.set.value(Math.round(newValue * precision) / precision);
+ }
+ },
+
+ backStep: function(multiplier) {
+ var
+ multiplier = multiplier != undefined ? multiplier : 1,
+ step = module.get.step(),
+ currValue = module.get.currentThumbValue()
+ ;
+ module.verbose('Going back a step');
+ if(step > 0) {
+ module.set.value(currValue - step * multiplier);
+ } else if (step == 0) {
+ var
+ precision = module.get.precision(),
+ newValue = currValue - (multiplier/precision)
+ ;
+ module.set.value(Math.round(newValue * precision) / precision);
+ }
+ },
+
+ is: {
+ range: function() {
+ return $module.hasClass(settings.className.range);
+ },
+ hover: function() {
+ return isHover;
+ },
+ focused: function() {
+ return $module.is(':focus');
+ },
+ disabled: function() {
+ return $module.hasClass(settings.className.disabled);
+ },
+ labeled: function() {
+ return $module.hasClass(settings.className.labeled);
+ },
+ reversed: function() {
+ return $module.hasClass(settings.className.reversed);
+ },
+ vertical: function() {
+ return $module.hasClass(settings.className.vertical);
+ },
+ smooth: function() {
+ return settings.smooth || $module.hasClass(settings.className.smooth);
+ },
+ touch: function() {
+ return isTouch;
+ }
+ },
+
+ get: {
+ trackOffset: function() {
+ if (module.is.vertical()) {
+ return $track.offset().top;
+ } else {
+ return $track.offset().left;
+ }
+ },
+ trackLength: function() {
+ if (module.is.vertical()) {
+ return $track.height();
+ } else {
+ return $track.width();
+ }
+ },
+ trackLeft: function() {
+ if (module.is.vertical()) {
+ return $track.position().top;
+ } else {
+ return $track.position().left;
+ }
+ },
+ trackStartPos: function() {
+ return module.is.reversed() ? module.get.trackLeft() + module.get.trackLength() : module.get.trackLeft();
+ },
+ trackEndPos: function() {
+ return module.is.reversed() ? module.get.trackLeft() : module.get.trackLeft() + module.get.trackLength();
+ },
+ trackStartMargin: function () {
+ var margin;
+ if (module.is.vertical()) {
+ margin = module.is.reversed() ? $module.css('padding-bottom') : $module.css('padding-top');
+ } else {
+ margin = module.is.reversed() ? $module.css('padding-right') : $module.css('padding-left');
+ }
+ return margin || '0px';
+ },
+ trackEndMargin: function () {
+ var margin;
+ if (module.is.vertical()) {
+ margin = module.is.reversed() ? $module.css('padding-top') : $module.css('padding-bottom');
+ } else {
+ margin = module.is.reversed() ? $module.css('padding-left') : $module.css('padding-right');
+ }
+ return margin || '0px';
+ },
+ precision: function() {
+ var
+ decimalPlaces,
+ step = module.get.step()
+ ;
+ if(step != 0) {
+ var split = String(step).split('.');
+ if(split.length == 2) {
+ decimalPlaces = split[1].length;
+ } else {
+ decimalPlaces = 0;
+ }
+ } else {
+ decimalPlaces = settings.decimalPlaces;
+ }
+ var precision = Math.pow(10, decimalPlaces);
+ module.debug('Precision determined', precision);
+ return precision;
+ },
+ min: function() {
+ return settings.min;
+ },
+ max: function() {
+ var step = module.get.step(),
+ min = module.get.min(),
+ quotient = step === 0 ? 0 : Math.floor((settings.max - min) / step),
+ remainder = step === 0 ? 0 : (settings.max - min) % step;
+ return remainder === 0 ? settings.max : min + quotient * step;
+ },
+ step: function() {
+ return settings.step;
+ },
+ numLabels: function() {
+ var value = Math.round((module.get.max() - module.get.min()) / (module.get.step() === 0 ? 1 : module.get.step()));
+ module.debug('Determined that there should be ' + value + ' labels');
+ return value;
+ },
+ labelType: function() {
+ return settings.labelType;
+ },
+ label: function(value) {
+ if(interpretLabel) {
+ return interpretLabel(value);
+ }
+
+ switch (settings.labelType) {
+ case settings.labelTypes.number:
+ return Math.round(((value * (module.get.step() === 0 ? 1 : module.get.step())) + module.get.min()) * precision ) / precision;
+ case settings.labelTypes.letter:
+ return alphabet[(value) % 26];
+ default:
+ return value;
+ }
+ },
+ value: function() {
+ return value;
+ },
+ currentThumbValue: function() {
+ return $currThumb !== undefined && $currThumb.hasClass('second') ? module.secondThumbVal : module.thumbVal;
+ },
+ thumbValue: function(which) {
+ switch(which) {
+ case 'second':
+ if(module.is.range()) {
+ return module.secondThumbVal;
+ }
+ else {
+ module.error(error.notrange);
+ break;
+ }
+ case 'first':
+ default:
+ return module.thumbVal;
+ }
+ },
+ multiplier: function() {
+ return settings.pageMultiplier;
+ },
+ thumbPosition: function(which) {
+ switch(which) {
+ case 'second':
+ if(module.is.range()) {
+ return secondPos;
+ }
+ else {
+ module.error(error.notrange);
+ break;
+ }
+ case 'first':
+ default:
+ return position;
+ }
+ },
+ gapRatio: function() {
+ var gapRatio = 1;
+
+ if( settings.autoAdjustLabels ) {
+ var
+ numLabels = module.get.numLabels(),
+ trackLength = module.get.trackLength(),
+ gapCounter = 1
+ ;
+
+ // While the distance between two labels is too short,
+ // we divide the number of labels at each iteration
+ // and apply only if the modulo of the operation is an odd number.
+ if(trackLength>0){
+ while ((trackLength / numLabels) * gapCounter < settings.labelDistance) {
+ if( !(numLabels % gapCounter) ) {
+ gapRatio = gapCounter;
+ }
+ gapCounter += 1;
+ }
+ }
+ }
+ return gapRatio;
+ }
+ },
+
+ determine: {
+ pos: function(pagePos) {
+ return module.is.reversed()
+ ?
+ module.get.trackStartPos() - pagePos + module.get.trackOffset()
+ :
+ pagePos - module.get.trackOffset() - module.get.trackStartPos()
+ ;
+ },
+ closestThumb: function(eventPos) {
+ var
+ thumbPos = parseFloat(module.determine.thumbPos($thumb)),
+ thumbDelta = Math.abs(eventPos - thumbPos),
+ secondThumbPos = parseFloat(module.determine.thumbPos($secondThumb)),
+ secondThumbDelta = Math.abs(eventPos - secondThumbPos)
+ ;
+ if(thumbDelta === secondThumbDelta && module.get.thumbValue() === module.get.min()) {
+ return $secondThumb;
+ }
+ return thumbDelta <= secondThumbDelta ? $thumb : $secondThumb;
+ },
+ closestThumbPos: function(eventPos) {
+ var
+ thumbPos = parseFloat(module.determine.thumbPos($thumb)),
+ thumbDelta = Math.abs(eventPos - thumbPos),
+ secondThumbPos = parseFloat(module.determine.thumbPos($secondThumb)),
+ secondThumbDelta = Math.abs(eventPos - secondThumbPos)
+ ;
+ return thumbDelta <= secondThumbDelta ? thumbPos : secondThumbPos;
+ },
+ thumbPos: function($element) {
+ var pos =
+ module.is.vertical()
+ ?
+ module.is.reversed() ? $element.css('bottom') : $element.css('top')
+ :
+ module.is.reversed() ? $element.css('right') : $element.css('left')
+ ;
+ return pos;
+ },
+ positionFromValue: function(value) {
+ var
+ min = module.get.min(),
+ max = module.get.max(),
+ value = value > max ? max : value < min ? min : value,
+ trackLength = module.get.trackLength(),
+ ratio = (value - min) / (max - min),
+ position = Math.round(ratio * trackLength)
+ ;
+ module.verbose('Determined position: ' + position + ' from value: ' + value);
+ return position;
+ },
+ positionFromRatio: function(ratio) {
+ var
+ trackLength = module.get.trackLength(),
+ step = module.get.step(),
+ position = Math.round(ratio * trackLength),
+ adjustedPos = (step == 0) ? position : Math.round(position / step) * step
+ ;
+ return adjustedPos;
+ },
+ valueFromEvent: function(event) {
+ var
+ eventPos = module.determine.eventPos(event),
+ newPos = module.determine.pos(eventPos),
+ value
+ ;
+ if(eventPos < module.get.trackOffset()) {
+ value = module.is.reversed() ? module.get.max() : module.get.min();
+ } else if(eventPos > module.get.trackOffset() + module.get.trackLength()) {
+ value = module.is.reversed() ? module.get.min() : module.get.max();
+ } else {
+ value = module.determine.value(newPos);
+ }
+ return value;
+ },
+ smoothValueFromEvent: function(event) {
+ var
+ min = module.get.min(),
+ max = module.get.max(),
+ trackLength = module.get.trackLength(),
+ eventPos = module.determine.eventPos(event),
+ newPos = eventPos - module.get.trackOffset(),
+ ratio,
+ value
+ ;
+ newPos = newPos < 0 ? 0 : newPos > trackLength ? trackLength : newPos;
+ ratio = newPos / trackLength;
+ if (module.is.reversed()) {
+ ratio = 1 - ratio;
+ }
+ value = ratio * (max - min) + min;
+ return value;
+ },
+ eventPos: function(event) {
+ if(module.is.touch()) {
+ var
+ touchEvent = event.changedTouches ? event : event.originalEvent,
+ touches = touchEvent.changedTouches[0] ? touchEvent.changedTouches : touchEvent.touches,
+ touchY = touches[0].pageY,
+ touchX = touches[0].pageX
+ ;
+ return module.is.vertical() ? touchY : touchX;
+ }
+ var
+ clickY = event.pageY || event.originalEvent.pageY,
+ clickX = event.pageX || event.originalEvent.pageX
+ ;
+ return module.is.vertical() ? clickY : clickX;
+ },
+ value: function(position) {
+ var
+ startPos = module.is.reversed() ? module.get.trackEndPos() : module.get.trackStartPos(),
+ endPos = module.is.reversed() ? module.get.trackStartPos() : module.get.trackEndPos(),
+ ratio = (position - startPos) / (endPos - startPos),
+ range = module.get.max() - module.get.min(),
+ step = module.get.step(),
+ value = (ratio * range),
+ difference = (step == 0) ? value : Math.round(value / step) * step
+ ;
+ module.verbose('Determined value based upon position: ' + position + ' as: ' + value);
+ if(value != difference) {
+ module.verbose('Rounding value to closest step: ' + difference);
+ }
+ // Use precision to avoid ugly Javascript floating point rounding issues
+ // (like 35 * .01 = 0.35000000000000003)
+ module.verbose('Cutting off additional decimal places');
+ return Math.round((difference + module.get.min()) * precision) / precision;
+ },
+ keyMovement: function(event) {
+ var
+ key = event.which,
+ downArrow =
+ module.is.vertical()
+ ?
+ module.is.reversed() ? keys.downArrow : keys.upArrow
+ :
+ keys.downArrow
+ ,
+ upArrow =
+ module.is.vertical()
+ ?
+ module.is.reversed() ? keys.upArrow : keys.downArrow
+ :
+ keys.upArrow
+ ,
+ leftArrow =
+ !module.is.vertical()
+ ?
+ module.is.reversed() ? keys.rightArrow : keys.leftArrow
+ :
+ keys.leftArrow
+ ,
+ rightArrow =
+ !module.is.vertical()
+ ?
+ module.is.reversed() ? keys.leftArrow : keys.rightArrow
+ :
+ keys.rightArrow
+ ;
+ if(key == downArrow || key == leftArrow) {
+ return SINGLE_BACKSTEP;
+ } else if(key == upArrow || key == rightArrow) {
+ return SINGLE_STEP;
+ } else if (key == keys.pageDown) {
+ return BIG_BACKSTEP;
+ } else if (key == keys.pageUp) {
+ return BIG_STEP;
+ } else {
+ return NO_STEP;
+ }
+ }
+ },
+
+ handleNewValuePosition: function(val) {
+ var
+ min = module.get.min(),
+ max = module.get.max(),
+ newPos
+ ;
+ if (val <= min) {
+ val = min;
+ } else if (val >= max) {
+ val = max;
+ }
+ newPos = module.determine.positionFromValue(val);
+ return newPos;
+ },
+
+ set: {
+ value: function(newValue, fireChange) {
+ fireChange = fireChange !== false;
+ var toReset = previousValue === undefined;
+ previousValue = previousValue === undefined ? module.get.value() : previousValue;
+ module.update.value(newValue, function(value, thumbVal, secondThumbVal) {
+ if ((!initialLoad || settings.fireOnInit) && fireChange){
+ if (newValue !== previousValue) {
+ settings.onChange.call(element, value, thumbVal, secondThumbVal);
+ }
+ settings.onMove.call(element, value, thumbVal, secondThumbVal);
+ }
+ if (toReset) {
+ previousValue = undefined;
+ }
+ });
+ },
+ rangeValue: function(first, second, fireChange) {
+ fireChange = fireChange !== false;
+ if(module.is.range()) {
+ var
+ min = module.get.min(),
+ max = module.get.max(),
+ toReset = previousValue === undefined
+ ;
+ previousValue = previousValue === undefined ? module.get.value() : previousValue;
+ if (first <= min) {
+ first = min;
+ } else if(first >= max){
+ first = max;
+ }
+ if (second <= min) {
+ second = min;
+ } else if(second >= max){
+ second = max;
+ }
+ module.thumbVal = first;
+ module.secondThumbVal = second;
+ value = Math.abs(module.thumbVal - module.secondThumbVal);
+ module.update.position(module.thumbVal, $thumb);
+ module.update.position(module.secondThumbVal, $secondThumb);
+ if ((!initialLoad || settings.fireOnInit) && fireChange) {
+ if (value !== previousValue) {
+ settings.onChange.call(element, value, module.thumbVal, module.secondThumbVal);
+ }
+ settings.onMove.call(element, value, module.thumbVal, module.secondThumbVal);
+ }
+ if (toReset) {
+ previousValue = undefined;
+ }
+ } else {
+ module.error(error.notrange);
+ }
+ },
+ position: function(position, which) {
+ var thumbVal = module.determine.value(position);
+ switch (which) {
+ case 'second':
+ module.secondThumbVal = thumbVal;
+ module.update.position(thumbVal, $secondThumb);
+ break;
+ default:
+ module.thumbVal = thumbVal;
+ module.update.position(thumbVal, $thumb);
+ }
+ value = Math.abs(module.thumbVal - (module.secondThumbVal || 0));
+ module.set.value(value);
+ }
+ },
+
+ update: {
+ value: function(newValue, callback) {
+ var
+ min = module.get.min(),
+ max = module.get.max()
+ ;
+ if (newValue <= min) {
+ newValue = min;
+ } else if(newValue >= max){
+ newValue = max;
+ }
+ if(!module.is.range()) {
+ value = newValue;
+ module.thumbVal = value;
+ } else {
+ if($currThumb === undefined) {
+ $currThumb = newValue <= module.get.currentThumbValue() ? $thumb : $secondThumb;
+ }
+ if(!$currThumb.hasClass('second')) {
+ if(settings.preventCrossover && module.is.range()) {
+ newValue = Math.min(module.secondThumbVal, newValue);
+ }
+ module.thumbVal = newValue;
+ } else {
+ if(settings.preventCrossover && module.is.range()) {
+ newValue = Math.max(module.thumbVal, newValue);
+ }
+ module.secondThumbVal = newValue;
+ }
+ value = Math.abs(module.thumbVal - module.secondThumbVal);
+ }
+ module.update.position(newValue);
+ module.debug('Setting slider value to ' + value);
+ if(typeof callback === 'function') {
+ callback(value, module.thumbVal, module.secondThumbVal);
+ }
+ },
+ position: function(newValue, $element) {
+ var
+ newPos = module.handleNewValuePosition(newValue),
+ $targetThumb = $element != undefined ? $element : $currThumb,
+ thumbVal = module.thumbVal || module.get.min(),
+ secondThumbVal = module.secondThumbVal || module.get.min()
+ ;
+ if(module.is.range()) {
+ if(!$targetThumb.hasClass('second')) {
+ position = newPos;
+ thumbVal = newValue;
+ } else {
+ secondPos = newPos;
+ secondThumbVal = newValue;
+ }
+ } else {
+ position = newPos;
+ thumbVal = newValue;
+ }
+ var
+ trackPosValue,
+ thumbPosValue,
+ min = module.get.min(),
+ max = module.get.max(),
+ thumbPosPercent = 100 * (newValue - min) / (max - min),
+ trackStartPosPercent = 100 * (Math.min(thumbVal, secondThumbVal) - min) / (max - min),
+ trackEndPosPercent = 100 * (1 - (Math.max(thumbVal, secondThumbVal) - min) / (max - min))
+ ;
+ if (module.is.vertical()) {
+ if (module.is.reversed()) {
+ thumbPosValue = {bottom: 'calc(' + thumbPosPercent + '% - ' + offset + 'px)', top: 'auto'};
+ trackPosValue = {bottom: trackStartPosPercent + '%', top: trackEndPosPercent + '%'};
+ }
+ else {
+ thumbPosValue = {top: 'calc(' + thumbPosPercent + '% - ' + offset + 'px)', bottom: 'auto'};
+ trackPosValue = {top: trackStartPosPercent + '%', bottom: trackEndPosPercent + '%'};
+ }
+ } else {
+ if (module.is.reversed()) {
+ thumbPosValue = {right: 'calc(' + thumbPosPercent + '% - ' + offset + 'px)', left: 'auto'};
+ trackPosValue = {right: trackStartPosPercent + '%', left: trackEndPosPercent + '%'};
+ }
+ else {
+ thumbPosValue = {left: 'calc(' + thumbPosPercent + '% - ' + offset + 'px)', right: 'auto'};
+ trackPosValue = {left: trackStartPosPercent + '%', right: trackEndPosPercent + '%'};
+ }
+ }
+ $targetThumb.css(thumbPosValue);
+ $trackFill.css(trackPosValue);
+ module.debug('Setting slider position to ' + newPos);
+ },
+ labelPosition: function (ratio, $label) {
+ var
+ startMargin = module.get.trackStartMargin(),
+ endMargin = module.get.trackEndMargin(),
+ posDir =
+ module.is.vertical()
+ ?
+ module.is.reversed() ? 'bottom' : 'top'
+ :
+ module.is.reversed() ? 'right' : 'left',
+ startMarginMod = module.is.reversed() && !module.is.vertical() ? ' - ' : ' + '
+ ;
+ var position = '(100% - ' + startMargin + ' - ' + endMargin + ') * ' + ratio;
+ $label.css(posDir, 'calc(' + position + startMarginMod + startMargin + ')');
+ }
+ },
+
+ goto: {
+ max: function() {
+ module.set.value(module.get.max());
+ },
+ min: function() {
+ module.set.value(module.get.min());
+ },
+ },
+
+ read: {
+ metadata: function() {
+ var
+ data = {
+ thumbVal : $module.data(metadata.thumbVal),
+ secondThumbVal : $module.data(metadata.secondThumbVal)
+ }
+ ;
+ if(data.thumbVal) {
+ if(module.is.range() && data.secondThumbVal) {
+ module.debug('Current value set from metadata', data.thumbVal, data.secondThumbVal);
+ module.set.rangeValue(data.thumbVal, data.secondThumbVal);
+ } else {
+ module.debug('Current value set from metadata', data.thumbVal);
+ module.set.value(data.thumbVal);
+ }
+ }
+ },
+ settings: function() {
+ if(settings.start !== false) {
+ if(module.is.range()) {
+ module.debug('Start position set from settings', settings.start, settings.end);
+ module.set.rangeValue(settings.start, settings.end);
+ } else {
+ module.debug('Start position set from settings', settings.start);
+ module.set.value(settings.start);
+ }
+ }
+ }
+ },
+
+ setting: function(name, value) {
+ module.debug('Changing setting', name, value);
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ if($.isPlainObject(settings[name])) {
+ $.extend(true, settings[name], value);
+ }
+ else {
+ settings[name] = value;
+ }
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ module.error(error.method, query);
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if($.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ }
+ })
+ ;
+
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+
+};
+
+$.fn.slider.settings = {
+
+ silent : false,
+ debug : false,
+ verbose : false,
+ performance : true,
+
+ name : 'Slider',
+ namespace : 'slider',
+
+ error : {
+ method : 'The method you called is not defined.',
+ notrange : 'This slider is not a range slider'
+ },
+
+ metadata: {
+ thumbVal : 'thumbVal',
+ secondThumbVal : 'secondThumbVal'
+ },
+
+ min : 0,
+ max : 20,
+ step : 1,
+ start : 0,
+ end : 20,
+ labelType : 'number',
+ showLabelTicks : false,
+ smooth : false,
+ autoAdjustLabels : true,
+ labelDistance : 100,
+ preventCrossover : true,
+ fireOnInit : false,
+ interpretLabel : false,
+
+ //the decimal place to round to if step is undefined
+ decimalPlaces : 2,
+
+ // page up/down multiplier. How many more times the steps to take on page up/down press
+ pageMultiplier : 2,
+
+ selector: {
+
+ },
+
+ className : {
+ reversed : 'reversed',
+ disabled : 'disabled',
+ labeled : 'labeled',
+ ticked : 'ticked',
+ vertical : 'vertical',
+ range : 'range',
+ smooth : 'smooth'
+ },
+
+ keys : {
+ pageUp : 33,
+ pageDown : 34,
+ leftArrow : 37,
+ upArrow : 38,
+ rightArrow : 39,
+ downArrow : 40
+ },
+
+ labelTypes : {
+ number : 'number',
+ letter : 'letter'
+ },
+
+ onChange : function(value, thumbVal, secondThumbVal){},
+ onMove : function(value, thumbVal, secondThumbVal){},
+};
+
+
+})( jQuery, window, document );
diff --git a/public/dist/components/slider.min.css b/public/dist/components/slider.min.css
new file mode 100644
index 000000000..484405f54
--- /dev/null
+++ b/public/dist/components/slider.min.css
@@ -0,0 +1 @@
+.ui.slider:not(.vertical):not(.checkbox){width:100%;padding:1em .5em}.ui.slider:not(.checkbox){position:relative}.ui.slider:not(.checkbox):focus{outline:0}.ui.slider .inner{position:relative;z-index:2}.ui.slider:not(.vertical) .inner{height:1.5em}.ui.slider .inner:hover{cursor:auto}.ui.slider .inner .track{position:absolute;border-radius:4px;background-color:rgba(0,0,0,.05)}.ui.slider:not(.vertical) .inner .track{width:100%;height:.4em;top:.55em;left:0}.ui.slider .inner .track-fill{position:absolute;border-radius:4px;background-color:#1b1c1d}.ui.slider:not(.vertical) .inner .track-fill{height:.4em;top:.55em;left:0}.ui.slider .inner .thumb{position:absolute;left:0;top:0;height:1.5em;width:1.5em;background:#fff -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:#fff -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:#fff linear-gradient(transparent,rgba(0,0,0,.05));border-radius:100%;-webkit-box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;box-shadow:0 1px 2px 0 rgba(34,36,38,.15),0 0 0 1px rgba(34,36,38,.15) inset;-webkit-transition:background .3s ease;transition:background .3s ease}.ui.slider:not(.disabled) .inner .thumb:hover{cursor:pointer;background:#f2f2f2 -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:#f2f2f2 -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:#f2f2f2 linear-gradient(transparent,rgba(0,0,0,.05))}.ui.slider:not(.disabled):focus .inner .thumb{background:#f2f2f2 -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:#f2f2f2 -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:#f2f2f2 linear-gradient(transparent,rgba(0,0,0,.05))}.ui.disabled.slider:not(.checkbox){opacity:.5}.ui.disabled.slider .inner:hover{cursor:auto}.ui.disabled.slider .inner .track-fill{background:#ccc}.ui.reversed.slider .inner .track-fill{left:auto;right:0}.ui.reversed.slider:not(.vertical) .inner .thumb{left:auto;right:0}.ui.reversed.vertical.slider .inner .thumb{left:.03em}.ui.labeled.reversed.slider>.labels .label{-webkit-transform:translate(-100%,-100%);transform:translate(-100%,-100%)}.ui.vertical.slider{height:100%;width:1.5em;padding:.5em 1em}.ui.vertical.slider .inner{height:100%}.ui.vertical.slider .inner .track{height:100%;width:.4em;left:.55em;top:0}.ui.vertical.slider .inner .track-fill{width:.4em;left:.55em;top:0}.ui.vertical.reversed.slider .inner .thumb{top:auto;bottom:0}.ui.vertical.reversed.slider .inner .track-fill{top:auto;bottom:0}.ui.labeled.slider>.labels{height:1.5em;width:auto;margin:0;padding:0;position:absolute;top:50%;left:0;right:0}.ui.labeled.slider:not(.vertical)>.labels{-webkit-transform:translateY(-50%);transform:translateY(-50%)}.ui.labeled.slider>.labels .label{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;padding:.2em 0;position:absolute;-webkit-transform:translate(-50%,-100%);transform:translate(-50%,-100%);white-space:nowrap}.ui.bottom.aligned.labeled.slider>.labels .label{bottom:0;-webkit-transform:translate(-50%,100%);transform:translate(-50%,100%)}.ui.labeled.ticked.slider>.labels .label:after{content:' ';height:1.5em;width:1px;background:#ccc;position:absolute;top:100%;left:50%}.ui.bottom.aligned.labeled.ticked.slider>.labels .label:after{top:auto;bottom:100%}.ui.labeled.ticked.slider>.labels .halftick.label:after{height:.75em}.ui.labeled.vertical.slider>.labels{width:1.5em;height:auto;left:50%;top:0;bottom:0;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.ui.labeled.vertical.slider>.labels .label{-webkit-transform:translate(-100%,-50%);transform:translate(-100%,-50%)}.ui.labeled.vertical.slider>.labels .label:after{width:1.5em;height:1px;left:100%;top:50%}.ui.labeled.vertical.slider>.labels .halftick.label:after{width:.75em;height:1px}.ui.labeled.vertical.reversed.slider>.labels .label{-webkit-transform:translate(-100%,50%);transform:translate(-100%,50%)}.ui.hover.slider .inner .thumb{opacity:0;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.ui.hover.slider:not(.disabled):focus .inner .thumb,.ui.hover.slider:not(.disabled):hover .inner .thumb{opacity:1}.ui.inverted.slider .inner .track-fill{background-color:#545454}.ui.inverted.slider .inner .track{background-color:rgba(255,255,255,.08)}.ui.primary.slider .inner .track-fill{background-color:#2185d0}.ui.primary.inverted.slider .inner .track-fill{background-color:#54c8ff}.ui.primary.slider.basic .inner .thumb{background-color:#2185d0}.ui.primary.slider.basic .inner .thumb:hover,.ui.primary.slider.basic:focus .inner .thumb{background-color:#1678c2}.ui.primary.inverted.slider.basic .inner .thumb{background-color:#54c8ff}.ui.primary.inverted.slider.basic .inner .thumb:hover,.ui.primary.inverted.slider.basic:focus .inner .thumb{background-color:#21b8ff}.ui.secondary.slider .inner .track-fill{background-color:#1b1c1d}.ui.secondary.inverted.slider .inner .track-fill{background-color:#545454}.ui.secondary.slider.basic .inner .thumb{background-color:#1b1c1d}.ui.secondary.slider.basic .inner .thumb:hover,.ui.secondary.slider.basic:focus .inner .thumb{background-color:#27292a}.ui.secondary.inverted.slider.basic .inner .thumb{background-color:#545454}.ui.secondary.inverted.slider.basic .inner .thumb:hover,.ui.secondary.inverted.slider.basic:focus .inner .thumb{background-color:#6e6e6e}.ui.red.slider .inner .track-fill{background-color:#db2828}.ui.red.inverted.slider .inner .track-fill{background-color:#ff695e}.ui.red.slider.basic .inner .thumb{background-color:#db2828}.ui.red.slider.basic .inner .thumb:hover,.ui.red.slider.basic:focus .inner .thumb{background-color:#d01919}.ui.red.inverted.slider.basic .inner .thumb{background-color:#ff695e}.ui.red.inverted.slider.basic .inner .thumb:hover,.ui.red.inverted.slider.basic:focus .inner .thumb{background-color:#ff392b}.ui.orange.slider .inner .track-fill{background-color:#f2711c}.ui.orange.inverted.slider .inner .track-fill{background-color:#ff851b}.ui.orange.slider.basic .inner .thumb{background-color:#f2711c}.ui.orange.slider.basic .inner .thumb:hover,.ui.orange.slider.basic:focus .inner .thumb{background-color:#f26202}.ui.orange.inverted.slider.basic .inner .thumb{background-color:#ff851b}.ui.orange.inverted.slider.basic .inner .thumb:hover,.ui.orange.inverted.slider.basic:focus .inner .thumb{background-color:#e76b00}.ui.yellow.slider .inner .track-fill{background-color:#fbbd08}.ui.yellow.inverted.slider .inner .track-fill{background-color:#ffe21f}.ui.yellow.slider.basic .inner .thumb{background-color:#fbbd08}.ui.yellow.slider.basic .inner .thumb:hover,.ui.yellow.slider.basic:focus .inner .thumb{background-color:#eaae00}.ui.yellow.inverted.slider.basic .inner .thumb{background-color:#ffe21f}.ui.yellow.inverted.slider.basic .inner .thumb:hover,.ui.yellow.inverted.slider.basic:focus .inner .thumb{background-color:#ebcd00}.ui.olive.slider .inner .track-fill{background-color:#b5cc18}.ui.olive.inverted.slider .inner .track-fill{background-color:#d9e778}.ui.olive.slider.basic .inner .thumb{background-color:#b5cc18}.ui.olive.slider.basic .inner .thumb:hover,.ui.olive.slider.basic:focus .inner .thumb{background-color:#a7bd0d}.ui.olive.inverted.slider.basic .inner .thumb{background-color:#d9e778}.ui.olive.inverted.slider.basic .inner .thumb:hover,.ui.olive.inverted.slider.basic:focus .inner .thumb{background-color:#d2e745}.ui.green.slider .inner .track-fill{background-color:#21ba45}.ui.green.inverted.slider .inner .track-fill{background-color:#2ecc40}.ui.green.slider.basic .inner .thumb{background-color:#21ba45}.ui.green.slider.basic .inner .thumb:hover,.ui.green.slider.basic:focus .inner .thumb{background-color:#16ab39}.ui.green.inverted.slider.basic .inner .thumb{background-color:#2ecc40}.ui.green.inverted.slider.basic .inner .thumb:hover,.ui.green.inverted.slider.basic:focus .inner .thumb{background-color:#1ea92e}.ui.teal.slider .inner .track-fill{background-color:#00b5ad}.ui.teal.inverted.slider .inner .track-fill{background-color:#6dffff}.ui.teal.slider.basic .inner .thumb{background-color:#00b5ad}.ui.teal.slider.basic .inner .thumb:hover,.ui.teal.slider.basic:focus .inner .thumb{background-color:#009c95}.ui.teal.inverted.slider.basic .inner .thumb{background-color:#6dffff}.ui.teal.inverted.slider.basic .inner .thumb:hover,.ui.teal.inverted.slider.basic:focus .inner .thumb{background-color:#3affff}.ui.blue.slider .inner .track-fill{background-color:#2185d0}.ui.blue.inverted.slider .inner .track-fill{background-color:#54c8ff}.ui.blue.slider.basic .inner .thumb{background-color:#2185d0}.ui.blue.slider.basic .inner .thumb:hover,.ui.blue.slider.basic:focus .inner .thumb{background-color:#1678c2}.ui.blue.inverted.slider.basic .inner .thumb{background-color:#54c8ff}.ui.blue.inverted.slider.basic .inner .thumb:hover,.ui.blue.inverted.slider.basic:focus .inner .thumb{background-color:#21b8ff}.ui.violet.slider .inner .track-fill{background-color:#6435c9}.ui.violet.inverted.slider .inner .track-fill{background-color:#a291fb}.ui.violet.slider.basic .inner .thumb{background-color:#6435c9}.ui.violet.slider.basic .inner .thumb:hover,.ui.violet.slider.basic:focus .inner .thumb{background-color:#5829bb}.ui.violet.inverted.slider.basic .inner .thumb{background-color:#a291fb}.ui.violet.inverted.slider.basic .inner .thumb:hover,.ui.violet.inverted.slider.basic:focus .inner .thumb{background-color:#745aff}.ui.purple.slider .inner .track-fill{background-color:#a333c8}.ui.purple.inverted.slider .inner .track-fill{background-color:#dc73ff}.ui.purple.slider.basic .inner .thumb{background-color:#a333c8}.ui.purple.slider.basic .inner .thumb:hover,.ui.purple.slider.basic:focus .inner .thumb{background-color:#9627ba}.ui.purple.inverted.slider.basic .inner .thumb{background-color:#dc73ff}.ui.purple.inverted.slider.basic .inner .thumb:hover,.ui.purple.inverted.slider.basic:focus .inner .thumb{background-color:#cf40ff}.ui.pink.slider .inner .track-fill{background-color:#e03997}.ui.pink.inverted.slider .inner .track-fill{background-color:#ff8edf}.ui.pink.slider.basic .inner .thumb{background-color:#e03997}.ui.pink.slider.basic .inner .thumb:hover,.ui.pink.slider.basic:focus .inner .thumb{background-color:#e61a8d}.ui.pink.inverted.slider.basic .inner .thumb{background-color:#ff8edf}.ui.pink.inverted.slider.basic .inner .thumb:hover,.ui.pink.inverted.slider.basic:focus .inner .thumb{background-color:#ff5bd1}.ui.brown.slider .inner .track-fill{background-color:#a5673f}.ui.brown.inverted.slider .inner .track-fill{background-color:#d67c1c}.ui.brown.slider.basic .inner .thumb{background-color:#a5673f}.ui.brown.slider.basic .inner .thumb:hover,.ui.brown.slider.basic:focus .inner .thumb{background-color:#975b33}.ui.brown.inverted.slider.basic .inner .thumb{background-color:#d67c1c}.ui.brown.inverted.slider.basic .inner .thumb:hover,.ui.brown.inverted.slider.basic:focus .inner .thumb{background-color:#b0620f}.ui.grey.slider .inner .track-fill{background-color:#767676}.ui.grey.inverted.slider .inner .track-fill{background-color:#dcddde}.ui.grey.slider.basic .inner .thumb{background-color:#767676}.ui.grey.slider.basic .inner .thumb:hover,.ui.grey.slider.basic:focus .inner .thumb{background-color:#838383}.ui.grey.inverted.slider.basic .inner .thumb{background-color:#dcddde}.ui.grey.inverted.slider.basic .inner .thumb:hover,.ui.grey.inverted.slider.basic:focus .inner .thumb{background-color:#c2c4c5}.ui.black.slider .inner .track-fill{background-color:#1b1c1d}.ui.black.inverted.slider .inner .track-fill{background-color:#545454}.ui.black.slider.basic .inner .thumb{background-color:#1b1c1d}.ui.black.slider.basic .inner .thumb:hover,.ui.black.slider.basic:focus .inner .thumb{background-color:#27292a}.ui.black.inverted.slider.basic .inner .thumb{background-color:#545454}.ui.black.inverted.slider.basic .inner .thumb:hover,.ui.black.inverted.slider.basic:focus .inner .thumb{background-color:#000}.ui.slider.basic .inner .thumb{background-color:#1b1c1d}.ui.slider.basic .inner .thumb:hover,.ui.slider.basic:focus .inner .thumb{background-color:#27292a}.ui.inverted.slider.basic .inner .thumb{background-color:#545454}.ui.inverted.slider.basic .inner .thumb:hover,.ui.inverted.slider.basic:focus .inner .thumb{background-color:#000}.ui.slider.small .inner .thumb{height:1em;width:1em}.ui.slider.small:not(.vertical) .inner{height:1em}.ui.slider.small:not(.vertical) .inner .track,.ui.slider.small:not(.vertical) .inner .track-fill{height:.3em;top:.35em}.ui.small.labeled.slider:not(.vertical)>.labels,.ui.small.labeled.slider:not(.vertical)>.labels .label:after{height:1em}.ui.small.labeled.slider:not(.vertical)>.labels .halftick.label:after{height:.5em}.ui.slider.small.vertical .inner{width:1em}.ui.slider.small.vertical .inner .track,.ui.slider.small.vertical .inner .track-fill{width:.3em;left:.35em}.ui.small.labeled.vertical.slider>.labels,.ui.small.labeled.vertical.slider>.labels .label:after{width:1em}.ui.small.labeled.vertical.slider>.labels .halftick.label:after{width:.5em}.ui.slider.large .inner .thumb{height:2em;width:2em}.ui.slider.large:not(.vertical) .inner{height:2em}.ui.slider.large:not(.vertical) .inner .track,.ui.slider.large:not(.vertical) .inner .track-fill{height:.5em;top:.75em}.ui.large.labeled.slider:not(.vertical)>.labels,.ui.large.labeled.slider:not(.vertical)>.labels .label:after{height:2em}.ui.large.labeled.slider:not(.vertical)>.labels .halftick.label:after{height:1em}.ui.slider.large.vertical .inner{width:2em}.ui.slider.large.vertical .inner .track,.ui.slider.large.vertical .inner .track-fill{width:.5em;left:.75em}.ui.large.labeled.vertical.slider>.labels,.ui.large.labeled.vertical.slider>.labels .label:after{width:2em}.ui.large.labeled.vertical.slider>.labels .halftick.label:after{width:1em}.ui.slider.big .inner .thumb{height:2.5em;width:2.5em}.ui.slider.big:not(.vertical) .inner{height:2.5em}.ui.slider.big:not(.vertical) .inner .track,.ui.slider.big:not(.vertical) .inner .track-fill{height:.6em;top:.95em}.ui.big.labeled.slider:not(.vertical)>.labels,.ui.big.labeled.slider:not(.vertical)>.labels .label:after{height:2.5em}.ui.big.labeled.slider:not(.vertical)>.labels .halftick.label:after{height:1.25em}.ui.slider.big.vertical .inner{width:2.5em}.ui.slider.big.vertical .inner .track,.ui.slider.big.vertical .inner .track-fill{width:.6em;left:.95em}.ui.big.labeled.vertical.slider>.labels,.ui.big.labeled.vertical.slider>.labels .label:after{width:2.5em}.ui.big.labeled.vertical.slider>.labels .halftick.label:after{width:1.25em}
\ No newline at end of file
diff --git a/public/dist/components/slider.min.js b/public/dist/components/slider.min.js
new file mode 100644
index 000000000..6b733f5f6
--- /dev/null
+++ b/public/dist/components/slider.min.js
@@ -0,0 +1,11 @@
+/*
+ * # Fomantic UI - 2.8.8
+ * https://github.com/fomantic/Fomantic-UI
+ * http://fomantic-ui.com/
+ *
+ * Copyright 2021 Contributors
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+!function(X,t,Y,K){"use strict";t=void 0!==t&&t.Math==Math?t:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),X.fn.slider=function(F){var S,e=X(this),D=X(t),O=e.selector||"",N=(new Date).getTime(),j=[],z=F,I="string"==typeof z,R=[].slice.call(arguments,1),B=["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"],U=0;return e.each(function(){var f,i,u,e,v,o,t,l,g,h,b,c,n,d,m,p,k,V=X.isPlainObject(F)?X.extend(!0,{},X.fn.slider.settings,F):X.extend({},X.fn.slider.settings),a=V.className,r=V.metadata,s=V.namespace,w=V.error,T=V.keys,y=V.interpretLabel,M=!1,x="."+s,P="module-"+s,E=X(this),C=this,L=E.data(P),A=1;k={initialize:function(){k.debug("Initializing slider",V),p=!0,t=U+=1,n=k.setup.testOutTouch(),k.setup.layout(),k.setup.labels(),k.is.disabled()||k.bind.events(),k.read.metadata(),k.read.settings(),p=!1,k.instantiate()},instantiate:function(){k.verbose("Storing instance of slider",k),L=k,E.data(P,k)},destroy:function(){k.verbose("Destroying previous slider for",E),clearInterval(L.interval),k.unbind.events(),k.unbind.slidingEvents(),E.removeData(P),L=K},setup:{layout:function(){E.attr("tabindex")===K&&E.attr("tabindex",0),0==E.find(".inner").length&&E.append(""),c=k.get.precision(),i=E.find(".thumb:not(.second)"),f=i,k.is.range()&&(0==E.find(".thumb.second").length&&E.find(".inner").append("
"),u=E.find(".thumb.second")),e=E.find(".track"),v=E.find(".track-fill"),b=i.width()/2},labels:function(){k.is.labeled()&&(0!=(o=E.find(".labels:not(.auto)")).length?k.setup.customLabel():k.setup.autoLabel(),V.showLabelTicks&&E.addClass(a.ticked))},testOutTouch:function(){try{return Y.createEvent("TouchEvent"),!0}catch(e){return!1}},customLabel:function(){var n,e=o.find(".label"),a=e.length,r=k.get.min(),s=k.get.max();e.each(function(e){var t=X(this).attr("data-value");n=t?((t=s').find(".labels");for(var e=0,t=k.get.numLabels();e<=t;e++){var n=k.get.label(e),a=""!==n?e%k.get.gapRatio()?X(' '):X(''+n+" "):null,r=e/t;a&&(k.update.labelPosition(r,a),o.append(a))}}},bind:{events:function(){k.bind.globalKeyboardEvents(),k.bind.keyboardEvents(),k.bind.mouseEvents(),k.is.touch()&&k.bind.touchEvents(),V.autoAdjustLabels&&k.bind.windowEvents()},keyboardEvents:function(){k.verbose("Binding keyboard events"),E.on("keydown"+x,k.event.keydown)},globalKeyboardEvents:function(){X(Y).on("keydown"+x+t,k.event.activateFocus)},mouseEvents:function(){k.verbose("Binding mouse events"),E.find(".track, .thumb, .inner").on("mousedown"+x,function(e){e.stopImmediatePropagation(),e.preventDefault(),k.event.down(e)}),E.on("mousedown"+x,k.event.down),E.on("mouseenter"+x,function(e){M=!0}),E.on("mouseleave"+x,function(e){M=!1})},touchEvents:function(){k.verbose("Binding touch events"),E.find(".track, .thumb, .inner").on("touchstart"+x,function(e){e.stopImmediatePropagation(),e.preventDefault(),k.event.down(e)}),E.on("touchstart"+x,k.event.down)},slidingEvents:function(){k.verbose("Binding page wide events while handle is being draged"),k.is.touch()?(X(Y).on("touchmove"+x,k.event.move),X(Y).on("touchend"+x,k.event.up)):(X(Y).on("mousemove"+x,k.event.move),X(Y).on("mouseup"+x,k.event.up))},windowEvents:function(){D.on("resize"+x,k.event.resize)}},unbind:{events:function(){E.find(".track, .thumb, .inner").off("mousedown"+x),E.find(".track, .thumb, .inner").off("touchstart"+x),E.off("mousedown"+x),E.off("mouseenter"+x),E.off("mouseleave"+x),E.off("touchstart"+x),E.off("keydown"+x),E.off("focusout"+x),X(Y).off("keydown"+x+t,k.event.activateFocus),D.off("resize"+x)},slidingEvents:function(){k.is.touch()?(X(Y).off("touchmove"+x),X(Y).off("touchend"+x)):(X(Y).off("mousemove"+x),X(Y).off("mouseup"+x))}},event:{down:function(e){if(e.preventDefault(),k.is.range()){var t=k.determine.eventPos(e),n=k.determine.pos(t);f=V.preventCrossover&&k.is.range()&&k.thumbVal===k.secondThumbVal?(m=n,K):k.determine.closestThumb(n),d===K&&(d=k.get.currentThumbValue())}else d===K&&(d=k.get.value());k.is.disabled()||k.bind.slidingEvents()},move:function(e){e.preventDefault();var t=k.determine.valueFromEvent(e);if(f===K){var n=k.determine.eventPos(e),a=k.determine.pos(n);f=ak.get.trackOffset()+k.get.trackLength()?k.is.reversed()?k.get.min():k.get.max():k.determine.value(n)},smoothValueFromEvent:function(e){var t,n=k.get.min(),a=k.get.max(),r=k.get.trackLength(),s=k.determine.eventPos(e)-k.get.trackOffset();return t=(s=s<0?0:r 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ module.error(error.method, query);
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ }
+ })
+ ;
+
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.fn.state.settings = {
+
+ // module info
+ name : 'State',
+
+ // debug output
+ debug : false,
+
+ // verbose debug output
+ verbose : false,
+
+ // namespace for events
+ namespace : 'state',
+
+ // debug data includes performance
+ performance : true,
+
+ // callback occurs on state change
+ onActivate : function() {},
+ onDeactivate : function() {},
+ onChange : function() {},
+
+ // state test functions
+ activateTest : function() { return true; },
+ deactivateTest : function() { return true; },
+
+ // whether to automatically map default states
+ automatic : true,
+
+ // activate / deactivate changes all elements instantiated at same time
+ sync : false,
+
+ // default flash text duration, used for temporarily changing text of an element
+ flashDuration : 1000,
+
+ // selector filter
+ filter : {
+ text : '.loading, .disabled',
+ active : '.disabled'
+ },
+
+ context : false,
+
+ // error
+ error: {
+ beforeSend : 'The before send function has cancelled state change',
+ method : 'The method you called is not defined.'
+ },
+
+ // metadata
+ metadata: {
+ promise : 'promise',
+ storedText : 'stored-text'
+ },
+
+ // change class on state
+ className: {
+ active : 'active',
+ disabled : 'disabled',
+ error : 'error',
+ loading : 'loading',
+ success : 'success',
+ warning : 'warning'
+ },
+
+ selector: {
+ // selector for text node
+ text: false
+ },
+
+ defaults : {
+ input: {
+ disabled : true,
+ loading : true,
+ active : true
+ },
+ button: {
+ disabled : true,
+ loading : true,
+ active : true,
+ },
+ progress: {
+ active : true,
+ success : true,
+ warning : true,
+ error : true
+ }
+ },
+
+ states : {
+ active : true,
+ disabled : true,
+ error : true,
+ loading : true,
+ success : true,
+ warning : true
+ },
+
+ text : {
+ disabled : false,
+ flash : false,
+ hover : false,
+ active : false,
+ inactive : false,
+ activate : false,
+ deactivate : false
+ }
+
+};
+
+
+
+})( jQuery, window, document );
diff --git a/public/dist/components/state.min.js b/public/dist/components/state.min.js
new file mode 100644
index 000000000..a53c1bbfc
--- /dev/null
+++ b/public/dist/components/state.min.js
@@ -0,0 +1,11 @@
+/*
+ * # Fomantic UI - 2.8.8
+ * https://github.com/fomantic/Fomantic-UI
+ * http://fomantic-ui.com/
+ *
+ * Copyright 2021 Contributors
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+!function(w,e,t,C){"use strict";w.isFunction=w.isFunction||function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},e=void 0!==e&&e.Math==Math?e:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),w.fn.state=function(v){var g,b=w(this),x=b.selector||"",p=(new Date).getTime(),h=[],m=v,T="string"==typeof m,y=[].slice.call(arguments,1);return b.each(function(){var c,i=w.isPlainObject(v)?w.extend(!0,{},w.fn.state.settings,v):w.extend({},w.fn.state.settings),r=i.error,n=i.metadata,t=i.className,e=i.namespace,a=i.states,o=i.text,s="."+e,l=e+"-module",u=w(this),d=this,f=u.data(l);c={initialize:function(){c.verbose("Initializing module"),i.automatic&&c.add.defaults(),i.context&&""!==x?w(i.context).on(x,"mouseenter"+s,c.change.text).on(x,"mouseleave"+s,c.reset.text).on(x,"click"+s,c.toggle.state):u.on("mouseenter"+s,c.change.text).on("mouseleave"+s,c.reset.text).on("click"+s,c.toggle.state),c.instantiate()},instantiate:function(){c.verbose("Storing instance of module",c),f=c,u.data(l,c)},destroy:function(){c.verbose("Destroying previous module",f),u.off(s).removeData(l)},refresh:function(){c.verbose("Refreshing selector cache"),u=w(d)},add:{defaults:function(){var n=v&&w.isPlainObject(v.states)?v.states:{};w.each(i.defaults,function(e,t){c.is[e]!==C&&c.is[e]()&&(c.verbose("Adding default states",e,d),w.extend(i.states,t,n))})}},is:{active:function(){return u.hasClass(t.active)},loading:function(){return u.hasClass(t.loading)},inactive:function(){return!u.hasClass(t.active)},state:function(e){return t[e]!==C&&u.hasClass(t[e])},enabled:function(){return!u.is(i.filter.active)},disabled:function(){return u.is(i.filter.active)},textEnabled:function(){return!u.is(i.filter.text)},button:function(){return u.is(".button:not(a, .submit)")},input:function(){return u.is("input")},progress:function(){return u.is(".ui.progress")}},allow:function(e){c.debug("Now allowing state",e),a[e]=!0},disallow:function(e){c.debug("No longer allowing",e),a[e]=!1},allows:function(e){return a[e]||!1},enable:function(){u.removeClass(t.disabled)},disable:function(){u.addClass(t.disabled)},setState:function(e){c.allows(e)&&u.addClass(t[e])},removeState:function(e){c.allows(e)&&u.removeClass(t[e])},toggle:{state:function(){var e;if(c.allows("active")&&c.is.enabled()){if(c.refresh(),w.fn.api!==C)if(e=u.api("get request"),u.api("was cancelled"))c.debug("API Request cancelled by beforesend"),i.activateTest=function(){return!1},i.deactivateTest=function(){return!1};else if(e)return void c.listenTo(e);c.change.state()}}},listenTo:function(e){c.debug("API request detected, waiting for state signal",e),e&&(o.loading&&c.update.text(o.loading),w.when(e).then(function(){"resolved"==e.state()?(c.debug("API request succeeded"),i.activateTest=function(){return!0},i.deactivateTest=function(){return!0}):(c.debug("API request failed"),i.activateTest=function(){return!1},i.deactivateTest=function(){return!1}),c.change.state()}))},change:{state:function(){c.debug("Determining state change direction"),c.is.inactive()?c.activate():c.deactivate(),i.sync&&c.sync(),i.onChange.call(d)},text:function(){c.is.textEnabled()&&(c.is.disabled()?(c.verbose("Changing text to disabled text",o.hover),c.update.text(o.disabled)):c.is.active()?o.hover?(c.verbose("Changing text to hover text",o.hover),c.update.text(o.hover)):o.deactivate&&(c.verbose("Changing text to deactivating text",o.deactivate),c.update.text(o.deactivate)):o.hover?(c.verbose("Changing text to hover text",o.hover),c.update.text(o.hover)):o.activate&&(c.verbose("Changing text to activating text",o.activate),c.update.text(o.activate)))}},activate:function(){i.activateTest.call(d)&&(c.debug("Setting state to active"),u.addClass(t.active),c.update.text(o.active),i.onActivate.call(d))},deactivate:function(){i.deactivateTest.call(d)&&(c.debug("Setting state to inactive"),u.removeClass(t.active),c.update.text(o.inactive),i.onDeactivate.call(d))},sync:function(){c.verbose("Syncing other buttons to current state"),c.is.active()?b.not(u).state("activate"):b.not(u).state("deactivate")},get:{text:function(){return i.selector.text?u.find(i.selector.text).text():u.html()},textFor:function(e){return o[e]||!1}},flash:{text:function(e,t,n){var a=c.get.text();c.debug("Flashing text message",e,t),e=e||i.text.flash,t=t||i.flashDuration,n=n||function(){},c.update.text(e),setTimeout(function(){c.update.text(a),n.call(d)},t)}},reset:{text:function(){var e=o.active||u.data(n.storedText),t=o.inactive||u.data(n.storedText);c.is.textEnabled()&&(c.is.active()&&e?(c.verbose("Resetting active text",e),c.update.text(e)):t&&(c.verbose("Resetting inactive text",e),c.update.text(t)))}},update:{text:function(e){var t=c.get.text();e&&e!==t?(c.debug("Updating text",e),i.selector.text?u.data(n.storedText,e).find(i.selector.text).text(e):u.data(n.storedText,e).html(e)):c.debug("Text is already set, ignoring update",e)}},setting:function(e,t){if(c.debug("Changing setting",e,t),w.isPlainObject(e))w.extend(!0,i,e);else{if(t===C)return i[e];w.isPlainObject(i[e])?w.extend(!0,i[e],t):i[e]=t}},internal:function(e,t){if(w.isPlainObject(e))w.extend(!0,c,e);else{if(t===C)return c[e];c[e]=t}},debug:function(){!i.silent&&i.debug&&(i.performance?c.performance.log(arguments):(c.debug=Function.prototype.bind.call(console.info,console,i.name+":"),c.debug.apply(console,arguments)))},verbose:function(){!i.silent&&i.verbose&&i.debug&&(i.performance?c.performance.log(arguments):(c.verbose=Function.prototype.bind.call(console.info,console,i.name+":"),c.verbose.apply(console,arguments)))},error:function(){i.silent||(c.error=Function.prototype.bind.call(console.error,console,i.name+":"),c.error.apply(console,arguments))},performance:{log:function(e){var t,n;i.performance&&(n=(t=(new Date).getTime())-(p||t),p=t,h.push({Name:e[0],Arguments:[].slice.call(e,1)||"",Element:d,"Execution Time":n})),clearTimeout(c.performance.timer),c.performance.timer=setTimeout(c.performance.display,500)},display:function(){var e=i.name+":",n=0;p=!1,clearTimeout(c.performance.timer),w.each(h,function(e,t){n+=t["Execution Time"]}),e+=" "+n+"ms",x&&(e+=" '"+x+"'"),(console.group!==C||console.table!==C)&&0 .statistic {
+ display: -webkit-inline-box;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ -webkit-box-flex: 0;
+ -ms-flex: 0 1 auto;
+ flex: 0 1 auto;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ margin: 0 1.5em 1em;
+ max-width: none;
+}
+.ui.statistics {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ margin: 1em -1.5em -1em;
+}
+
+/* Clearing */
+.ui.statistics:after {
+ display: block;
+ content: ' ';
+ height: 0;
+ clear: both;
+ overflow: hidden;
+ visibility: hidden;
+}
+.ui.statistics:first-child {
+ margin-top: 0;
+}
+
+
+/*******************************
+ Content
+*******************************/
+
+
+/*--------------
+ Value
+---------------*/
+
+.ui.statistics .statistic > .value,
+.ui.statistic > .value {
+ font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
+ font-size: 4rem;
+ font-weight: normal;
+ line-height: 1em;
+ color: #1B1C1D;
+ text-transform: uppercase;
+ text-align: center;
+}
+
+/*--------------
+ Label
+---------------*/
+
+.ui.statistics .statistic > .label,
+.ui.statistic > .label {
+ font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
+ font-size: 1em;
+ font-weight: bold;
+ color: rgba(0, 0, 0, 0.87);
+ text-transform: uppercase;
+ text-align: center;
+}
+
+/* Top Label */
+.ui.statistics .statistic > .label ~ .value,
+.ui.statistic > .label ~ .value {
+ margin-top: 0;
+}
+
+/* Bottom Label */
+.ui.statistics .statistic > .value ~ .label,
+.ui.statistic > .value ~ .label {
+ margin-top: 0;
+}
+
+
+/*******************************
+ Types
+*******************************/
+
+
+/*--------------
+ Icon Value
+---------------*/
+
+.ui.statistics .statistic > .value > i.icon,
+.ui.statistic > .value > i.icon {
+ opacity: 1;
+ width: auto;
+ margin: 0;
+}
+
+/*--------------
+ Text Value
+---------------*/
+
+.ui.statistics .statistic > .text.value,
+.ui.statistic > .text.value {
+ line-height: 1em;
+ min-height: 2em;
+ font-weight: bold;
+ text-align: center;
+}
+.ui.statistics .statistic > .text.value + .label,
+.ui.statistic > .text.value + .label {
+ text-align: center;
+}
+
+/*--------------
+ Image Value
+---------------*/
+
+.ui.statistics .statistic > .value img,
+.ui.statistic > .value img {
+ max-height: 3rem;
+ vertical-align: baseline;
+}
+
+
+/*******************************
+ Variations
+*******************************/
+
+
+/*--------------
+ Count
+---------------*/
+
+.ui.ten.statistics {
+ margin: 0 0 -1em;
+}
+.ui.ten.statistics .statistic {
+ min-width: 10%;
+ margin: 0 0 1em;
+}
+.ui.nine.statistics {
+ margin: 0 0 -1em;
+}
+.ui.nine.statistics .statistic {
+ min-width: 11.11111111%;
+ margin: 0 0 1em;
+}
+.ui.eight.statistics {
+ margin: 0 0 -1em;
+}
+.ui.eight.statistics .statistic {
+ min-width: 12.5%;
+ margin: 0 0 1em;
+}
+.ui.seven.statistics {
+ margin: 0 0 -1em;
+}
+.ui.seven.statistics .statistic {
+ min-width: 14.28571429%;
+ margin: 0 0 1em;
+}
+.ui.six.statistics {
+ margin: 0 0 -1em;
+}
+.ui.six.statistics .statistic {
+ min-width: 16.66666667%;
+ margin: 0 0 1em;
+}
+.ui.five.statistics {
+ margin: 0 0 -1em;
+}
+.ui.five.statistics .statistic {
+ min-width: 20%;
+ margin: 0 0 1em;
+}
+.ui.four.statistics {
+ margin: 0 0 -1em;
+}
+.ui.four.statistics .statistic {
+ min-width: 25%;
+ margin: 0 0 1em;
+}
+.ui.three.statistics {
+ margin: 0 0 -1em;
+}
+.ui.three.statistics .statistic {
+ min-width: 33.33333333%;
+ margin: 0 0 1em;
+}
+.ui.two.statistics {
+ margin: 0 0 -1em;
+}
+.ui.two.statistics .statistic {
+ min-width: 50%;
+ margin: 0 0 1em;
+}
+.ui.one.statistics {
+ margin: 0 0 -1em;
+}
+.ui.one.statistics .statistic {
+ min-width: 100%;
+ margin: 0 0 1em;
+}
+
+/*--------------
+ Horizontal
+ ---------------*/
+
+.ui.horizontal.statistic {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+}
+.ui.horizontal.statistics {
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ margin: 0;
+ max-width: none;
+}
+.ui.horizontal.statistics .statistic {
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ max-width: none;
+ margin: 1em 0;
+}
+.ui.horizontal.statistic > .text.value,
+.ui.horizontal.statistics > .statistic > .text.value {
+ min-height: 0 !important;
+}
+.ui.horizontal.statistics .statistic > .value > i.icon,
+.ui.horizontal.statistic > .value > i.icon {
+ width: 1.18em;
+}
+.ui.horizontal.statistics .statistic > .value,
+.ui.horizontal.statistic > .value {
+ display: inline-block;
+ vertical-align: middle;
+}
+.ui.horizontal.statistics .statistic > .label,
+.ui.horizontal.statistic > .label {
+ display: inline-block;
+ vertical-align: middle;
+ margin: 0 0 0 0.75em;
+}
+
+/*--------------
+ Inverted
+ ---------------*/
+
+.ui.inverted.statistics .statistic > .value,
+.ui.inverted.statistic .value {
+ color: #FFFFFF;
+}
+.ui.inverted.statistics .statistic > .label,
+.ui.inverted.statistic .label {
+ color: rgba(255, 255, 255, 0.9);
+}
+
+/*--------------
+ Colors
+---------------*/
+
+.ui.primary.statistics .statistic > .value,
+.ui.statistics .primary.statistic > .value,
+.ui.primary.statistic > .value {
+ color: #2185D0;
+}
+.ui.inverted.primary.statistics .statistic > .value,
+.ui.statistics .inverted.primary.statistic > .value,
+.ui.inverted.primary.statistic > .value {
+ color: #54C8FF;
+}
+.ui.secondary.statistics .statistic > .value,
+.ui.statistics .secondary.statistic > .value,
+.ui.secondary.statistic > .value {
+ color: #1B1C1D;
+}
+.ui.inverted.secondary.statistics .statistic > .value,
+.ui.statistics .inverted.secondary.statistic > .value,
+.ui.inverted.secondary.statistic > .value {
+ color: #545454;
+}
+.ui.red.statistics .statistic > .value,
+.ui.statistics .red.statistic > .value,
+.ui.red.statistic > .value {
+ color: #DB2828;
+}
+.ui.inverted.red.statistics .statistic > .value,
+.ui.statistics .inverted.red.statistic > .value,
+.ui.inverted.red.statistic > .value {
+ color: #FF695E;
+}
+.ui.orange.statistics .statistic > .value,
+.ui.statistics .orange.statistic > .value,
+.ui.orange.statistic > .value {
+ color: #F2711C;
+}
+.ui.inverted.orange.statistics .statistic > .value,
+.ui.statistics .inverted.orange.statistic > .value,
+.ui.inverted.orange.statistic > .value {
+ color: #FF851B;
+}
+.ui.yellow.statistics .statistic > .value,
+.ui.statistics .yellow.statistic > .value,
+.ui.yellow.statistic > .value {
+ color: #FBBD08;
+}
+.ui.inverted.yellow.statistics .statistic > .value,
+.ui.statistics .inverted.yellow.statistic > .value,
+.ui.inverted.yellow.statistic > .value {
+ color: #FFE21F;
+}
+.ui.olive.statistics .statistic > .value,
+.ui.statistics .olive.statistic > .value,
+.ui.olive.statistic > .value {
+ color: #B5CC18;
+}
+.ui.inverted.olive.statistics .statistic > .value,
+.ui.statistics .inverted.olive.statistic > .value,
+.ui.inverted.olive.statistic > .value {
+ color: #D9E778;
+}
+.ui.green.statistics .statistic > .value,
+.ui.statistics .green.statistic > .value,
+.ui.green.statistic > .value {
+ color: #21BA45;
+}
+.ui.inverted.green.statistics .statistic > .value,
+.ui.statistics .inverted.green.statistic > .value,
+.ui.inverted.green.statistic > .value {
+ color: #2ECC40;
+}
+.ui.teal.statistics .statistic > .value,
+.ui.statistics .teal.statistic > .value,
+.ui.teal.statistic > .value {
+ color: #00B5AD;
+}
+.ui.inverted.teal.statistics .statistic > .value,
+.ui.statistics .inverted.teal.statistic > .value,
+.ui.inverted.teal.statistic > .value {
+ color: #6DFFFF;
+}
+.ui.blue.statistics .statistic > .value,
+.ui.statistics .blue.statistic > .value,
+.ui.blue.statistic > .value {
+ color: #2185D0;
+}
+.ui.inverted.blue.statistics .statistic > .value,
+.ui.statistics .inverted.blue.statistic > .value,
+.ui.inverted.blue.statistic > .value {
+ color: #54C8FF;
+}
+.ui.violet.statistics .statistic > .value,
+.ui.statistics .violet.statistic > .value,
+.ui.violet.statistic > .value {
+ color: #6435C9;
+}
+.ui.inverted.violet.statistics .statistic > .value,
+.ui.statistics .inverted.violet.statistic > .value,
+.ui.inverted.violet.statistic > .value {
+ color: #A291FB;
+}
+.ui.purple.statistics .statistic > .value,
+.ui.statistics .purple.statistic > .value,
+.ui.purple.statistic > .value {
+ color: #A333C8;
+}
+.ui.inverted.purple.statistics .statistic > .value,
+.ui.statistics .inverted.purple.statistic > .value,
+.ui.inverted.purple.statistic > .value {
+ color: #DC73FF;
+}
+.ui.pink.statistics .statistic > .value,
+.ui.statistics .pink.statistic > .value,
+.ui.pink.statistic > .value {
+ color: #E03997;
+}
+.ui.inverted.pink.statistics .statistic > .value,
+.ui.statistics .inverted.pink.statistic > .value,
+.ui.inverted.pink.statistic > .value {
+ color: #FF8EDF;
+}
+.ui.brown.statistics .statistic > .value,
+.ui.statistics .brown.statistic > .value,
+.ui.brown.statistic > .value {
+ color: #A5673F;
+}
+.ui.inverted.brown.statistics .statistic > .value,
+.ui.statistics .inverted.brown.statistic > .value,
+.ui.inverted.brown.statistic > .value {
+ color: #D67C1C;
+}
+.ui.grey.statistics .statistic > .value,
+.ui.statistics .grey.statistic > .value,
+.ui.grey.statistic > .value {
+ color: #767676;
+}
+.ui.inverted.grey.statistics .statistic > .value,
+.ui.statistics .inverted.grey.statistic > .value,
+.ui.inverted.grey.statistic > .value {
+ color: #DCDDDE;
+}
+.ui.black.statistics .statistic > .value,
+.ui.statistics .black.statistic > .value,
+.ui.black.statistic > .value {
+ color: #1B1C1D;
+}
+.ui.inverted.black.statistics .statistic > .value,
+.ui.statistics .inverted.black.statistic > .value,
+.ui.inverted.black.statistic > .value {
+ color: #545454;
+}
+
+/*--------------
+ Floated
+ ---------------*/
+
+.ui[class*="left floated"].statistic {
+ float: left;
+ margin: 0 2em 1em 0;
+}
+.ui[class*="right floated"].statistic {
+ float: right;
+ margin: 0 0 1em 2em;
+}
+.ui.floated.statistic:last-child {
+ margin-bottom: 0;
+}
+
+/*--------------
+ Stackable
+ ---------------*/
+
+@media only screen and (max-width: 767.98px) {
+ .ui.stackable.statistics {
+ width: auto;
+ margin-left: 0 !important;
+ margin-right: 0 !important;
+ }
+ .ui.stackable.statistics > .statistic {
+ width: 100% !important;
+ margin: 0 0 !important;
+ padding: 1rem 1rem !important;
+ }
+}
+
+/*--------------
+ Sizes
+---------------*/
+
+
+/* Medium */
+.ui.statistics .statistic > .value,
+.ui.statistic > .value {
+ font-size: 4rem;
+}
+.ui.horizontal.statistics .statistic > .value,
+.ui.horizontal.statistic > .value {
+ font-size: 3rem;
+}
+.ui.statistics .statistic > .text.value,
+.ui.statistic > .text.value {
+ font-size: 2rem;
+}
+.ui.mini.statistics .statistic > .value,
+.ui.mini.statistic > .value {
+ font-size: 1.5rem;
+}
+.ui.mini.horizontal.statistics .statistic > .value,
+.ui.mini.horizontal.statistic > .value {
+ font-size: 1.5rem;
+}
+.ui.mini.statistics .statistic > .text.value,
+.ui.mini.statistic > .text.value {
+ font-size: 1rem;
+}
+.ui.tiny.statistics .statistic > .value,
+.ui.tiny.statistic > .value {
+ font-size: 2rem;
+}
+.ui.tiny.horizontal.statistics .statistic > .value,
+.ui.tiny.horizontal.statistic > .value {
+ font-size: 2rem;
+}
+.ui.tiny.statistics .statistic > .text.value,
+.ui.tiny.statistic > .text.value {
+ font-size: 1rem;
+}
+.ui.small.statistics .statistic > .value,
+.ui.small.statistic > .value {
+ font-size: 3rem;
+}
+.ui.small.horizontal.statistics .statistic > .value,
+.ui.small.horizontal.statistic > .value {
+ font-size: 2rem;
+}
+.ui.small.statistics .statistic > .text.value,
+.ui.small.statistic > .text.value {
+ font-size: 1rem;
+}
+.ui.large.statistics .statistic > .value,
+.ui.large.statistic > .value {
+ font-size: 5rem;
+}
+.ui.large.horizontal.statistics .statistic > .value,
+.ui.large.horizontal.statistic > .value {
+ font-size: 4rem;
+}
+.ui.large.statistics .statistic > .text.value,
+.ui.large.statistic > .text.value {
+ font-size: 2.5rem;
+}
+.ui.big.statistics .statistic > .value,
+.ui.big.statistic > .value {
+ font-size: 5.5rem;
+}
+.ui.big.horizontal.statistics .statistic > .value,
+.ui.big.horizontal.statistic > .value {
+ font-size: 4.5rem;
+}
+.ui.big.statistics .statistic > .text.value,
+.ui.big.statistic > .text.value {
+ font-size: 2.5rem;
+}
+.ui.huge.statistics .statistic > .value,
+.ui.huge.statistic > .value {
+ font-size: 6rem;
+}
+.ui.huge.horizontal.statistics .statistic > .value,
+.ui.huge.horizontal.statistic > .value {
+ font-size: 5rem;
+}
+.ui.huge.statistics .statistic > .text.value,
+.ui.huge.statistic > .text.value {
+ font-size: 2.5rem;
+}
+.ui.massive.statistics .statistic > .value,
+.ui.massive.statistic > .value {
+ font-size: 7rem;
+}
+.ui.massive.horizontal.statistics .statistic > .value,
+.ui.massive.horizontal.statistic > .value {
+ font-size: 6rem;
+}
+.ui.massive.statistics .statistic > .text.value,
+.ui.massive.statistic > .text.value {
+ font-size: 3rem;
+}
+
+
+/*******************************
+ Theme Overrides
+*******************************/
+
+
+
+/*******************************
+ User Variable Overrides
+*******************************/
+
diff --git a/public/dist/components/statistic.min.css b/public/dist/components/statistic.min.css
new file mode 100644
index 000000000..946527130
--- /dev/null
+++ b/public/dist/components/statistic.min.css
@@ -0,0 +1,9 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Statistic
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */.ui.statistic{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:1em 0;max-width:none}.ui.statistic+.ui.statistic{margin:0 0 0 1.5em}.ui.statistic:first-child{margin-top:0}.ui.statistic:last-child{margin-bottom:0}.ui.statistics{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start;-ms-flex-wrap:wrap;flex-wrap:wrap}.ui.statistics>.statistic{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:0 1.5em 1em;max-width:none}.ui.statistics{display:-webkit-box;display:-ms-flexbox;display:flex;margin:1em -1.5em -1em}.ui.statistics:after{display:block;content:' ';height:0;clear:both;overflow:hidden;visibility:hidden}.ui.statistics:first-child{margin-top:0}.ui.statistic>.value,.ui.statistics .statistic>.value{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:4rem;font-weight:400;line-height:1em;color:#1b1c1d;text-transform:uppercase;text-align:center}.ui.statistic>.label,.ui.statistics .statistic>.label{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1em;font-weight:700;color:rgba(0,0,0,.87);text-transform:uppercase;text-align:center}.ui.statistic>.label~.value,.ui.statistics .statistic>.label~.value{margin-top:0}.ui.statistic>.value~.label,.ui.statistics .statistic>.value~.label{margin-top:0}.ui.statistic>.value>i.icon,.ui.statistics .statistic>.value>i.icon{opacity:1;width:auto;margin:0}.ui.statistic>.text.value,.ui.statistics .statistic>.text.value{line-height:1em;min-height:2em;font-weight:700;text-align:center}.ui.statistic>.text.value+.label,.ui.statistics .statistic>.text.value+.label{text-align:center}.ui.statistic>.value img,.ui.statistics .statistic>.value img{max-height:3rem;vertical-align:baseline}.ui.ten.statistics{margin:0 0 -1em}.ui.ten.statistics .statistic{min-width:10%;margin:0 0 1em}.ui.nine.statistics{margin:0 0 -1em}.ui.nine.statistics .statistic{min-width:11.11111111%;margin:0 0 1em}.ui.eight.statistics{margin:0 0 -1em}.ui.eight.statistics .statistic{min-width:12.5%;margin:0 0 1em}.ui.seven.statistics{margin:0 0 -1em}.ui.seven.statistics .statistic{min-width:14.28571429%;margin:0 0 1em}.ui.six.statistics{margin:0 0 -1em}.ui.six.statistics .statistic{min-width:16.66666667%;margin:0 0 1em}.ui.five.statistics{margin:0 0 -1em}.ui.five.statistics .statistic{min-width:20%;margin:0 0 1em}.ui.four.statistics{margin:0 0 -1em}.ui.four.statistics .statistic{min-width:25%;margin:0 0 1em}.ui.three.statistics{margin:0 0 -1em}.ui.three.statistics .statistic{min-width:33.33333333%;margin:0 0 1em}.ui.two.statistics{margin:0 0 -1em}.ui.two.statistics .statistic{min-width:50%;margin:0 0 1em}.ui.one.statistics{margin:0 0 -1em}.ui.one.statistics .statistic{min-width:100%;margin:0 0 1em}.ui.horizontal.statistic{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ui.horizontal.statistics{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;margin:0;max-width:none}.ui.horizontal.statistics .statistic{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:center;-ms-flex-align:center;align-items:center;max-width:none;margin:1em 0}.ui.horizontal.statistic>.text.value,.ui.horizontal.statistics>.statistic>.text.value{min-height:0!important}.ui.horizontal.statistic>.value>i.icon,.ui.horizontal.statistics .statistic>.value>i.icon{width:1.18em}.ui.horizontal.statistic>.value,.ui.horizontal.statistics .statistic>.value{display:inline-block;vertical-align:middle}.ui.horizontal.statistic>.label,.ui.horizontal.statistics .statistic>.label{display:inline-block;vertical-align:middle;margin:0 0 0 .75em}.ui.inverted.statistic .value,.ui.inverted.statistics .statistic>.value{color:#fff}.ui.inverted.statistic .label,.ui.inverted.statistics .statistic>.label{color:rgba(255,255,255,.9)}.ui.primary.statistic>.value,.ui.primary.statistics .statistic>.value,.ui.statistics .primary.statistic>.value{color:#2185d0}.ui.inverted.primary.statistic>.value,.ui.inverted.primary.statistics .statistic>.value,.ui.statistics .inverted.primary.statistic>.value{color:#54c8ff}.ui.secondary.statistic>.value,.ui.secondary.statistics .statistic>.value,.ui.statistics .secondary.statistic>.value{color:#1b1c1d}.ui.inverted.secondary.statistic>.value,.ui.inverted.secondary.statistics .statistic>.value,.ui.statistics .inverted.secondary.statistic>.value{color:#545454}.ui.red.statistic>.value,.ui.red.statistics .statistic>.value,.ui.statistics .red.statistic>.value{color:#db2828}.ui.inverted.red.statistic>.value,.ui.inverted.red.statistics .statistic>.value,.ui.statistics .inverted.red.statistic>.value{color:#ff695e}.ui.orange.statistic>.value,.ui.orange.statistics .statistic>.value,.ui.statistics .orange.statistic>.value{color:#f2711c}.ui.inverted.orange.statistic>.value,.ui.inverted.orange.statistics .statistic>.value,.ui.statistics .inverted.orange.statistic>.value{color:#ff851b}.ui.statistics .yellow.statistic>.value,.ui.yellow.statistic>.value,.ui.yellow.statistics .statistic>.value{color:#fbbd08}.ui.inverted.yellow.statistic>.value,.ui.inverted.yellow.statistics .statistic>.value,.ui.statistics .inverted.yellow.statistic>.value{color:#ffe21f}.ui.olive.statistic>.value,.ui.olive.statistics .statistic>.value,.ui.statistics .olive.statistic>.value{color:#b5cc18}.ui.inverted.olive.statistic>.value,.ui.inverted.olive.statistics .statistic>.value,.ui.statistics .inverted.olive.statistic>.value{color:#d9e778}.ui.green.statistic>.value,.ui.green.statistics .statistic>.value,.ui.statistics .green.statistic>.value{color:#21ba45}.ui.inverted.green.statistic>.value,.ui.inverted.green.statistics .statistic>.value,.ui.statistics .inverted.green.statistic>.value{color:#2ecc40}.ui.statistics .teal.statistic>.value,.ui.teal.statistic>.value,.ui.teal.statistics .statistic>.value{color:#00b5ad}.ui.inverted.teal.statistic>.value,.ui.inverted.teal.statistics .statistic>.value,.ui.statistics .inverted.teal.statistic>.value{color:#6dffff}.ui.blue.statistic>.value,.ui.blue.statistics .statistic>.value,.ui.statistics .blue.statistic>.value{color:#2185d0}.ui.inverted.blue.statistic>.value,.ui.inverted.blue.statistics .statistic>.value,.ui.statistics .inverted.blue.statistic>.value{color:#54c8ff}.ui.statistics .violet.statistic>.value,.ui.violet.statistic>.value,.ui.violet.statistics .statistic>.value{color:#6435c9}.ui.inverted.violet.statistic>.value,.ui.inverted.violet.statistics .statistic>.value,.ui.statistics .inverted.violet.statistic>.value{color:#a291fb}.ui.purple.statistic>.value,.ui.purple.statistics .statistic>.value,.ui.statistics .purple.statistic>.value{color:#a333c8}.ui.inverted.purple.statistic>.value,.ui.inverted.purple.statistics .statistic>.value,.ui.statistics .inverted.purple.statistic>.value{color:#dc73ff}.ui.pink.statistic>.value,.ui.pink.statistics .statistic>.value,.ui.statistics .pink.statistic>.value{color:#e03997}.ui.inverted.pink.statistic>.value,.ui.inverted.pink.statistics .statistic>.value,.ui.statistics .inverted.pink.statistic>.value{color:#ff8edf}.ui.brown.statistic>.value,.ui.brown.statistics .statistic>.value,.ui.statistics .brown.statistic>.value{color:#a5673f}.ui.inverted.brown.statistic>.value,.ui.inverted.brown.statistics .statistic>.value,.ui.statistics .inverted.brown.statistic>.value{color:#d67c1c}.ui.grey.statistic>.value,.ui.grey.statistics .statistic>.value,.ui.statistics .grey.statistic>.value{color:#767676}.ui.inverted.grey.statistic>.value,.ui.inverted.grey.statistics .statistic>.value,.ui.statistics .inverted.grey.statistic>.value{color:#dcddde}.ui.black.statistic>.value,.ui.black.statistics .statistic>.value,.ui.statistics .black.statistic>.value{color:#1b1c1d}.ui.inverted.black.statistic>.value,.ui.inverted.black.statistics .statistic>.value,.ui.statistics .inverted.black.statistic>.value{color:#545454}.ui[class*="left floated"].statistic{float:left;margin:0 2em 1em 0}.ui[class*="right floated"].statistic{float:right;margin:0 0 1em 2em}.ui.floated.statistic:last-child{margin-bottom:0}@media only screen and (max-width:767.98px){.ui.stackable.statistics{width:auto;margin-left:0!important;margin-right:0!important}.ui.stackable.statistics>.statistic{width:100%!important;margin:0 0!important;padding:1rem 1rem!important}}.ui.statistic>.value,.ui.statistics .statistic>.value{font-size:4rem}.ui.horizontal.statistic>.value,.ui.horizontal.statistics .statistic>.value{font-size:3rem}.ui.statistic>.text.value,.ui.statistics .statistic>.text.value{font-size:2rem}.ui.mini.statistic>.value,.ui.mini.statistics .statistic>.value{font-size:1.5rem}.ui.mini.horizontal.statistic>.value,.ui.mini.horizontal.statistics .statistic>.value{font-size:1.5rem}.ui.mini.statistic>.text.value,.ui.mini.statistics .statistic>.text.value{font-size:1rem}.ui.tiny.statistic>.value,.ui.tiny.statistics .statistic>.value{font-size:2rem}.ui.tiny.horizontal.statistic>.value,.ui.tiny.horizontal.statistics .statistic>.value{font-size:2rem}.ui.tiny.statistic>.text.value,.ui.tiny.statistics .statistic>.text.value{font-size:1rem}.ui.small.statistic>.value,.ui.small.statistics .statistic>.value{font-size:3rem}.ui.small.horizontal.statistic>.value,.ui.small.horizontal.statistics .statistic>.value{font-size:2rem}.ui.small.statistic>.text.value,.ui.small.statistics .statistic>.text.value{font-size:1rem}.ui.large.statistic>.value,.ui.large.statistics .statistic>.value{font-size:5rem}.ui.large.horizontal.statistic>.value,.ui.large.horizontal.statistics .statistic>.value{font-size:4rem}.ui.large.statistic>.text.value,.ui.large.statistics .statistic>.text.value{font-size:2.5rem}.ui.big.statistic>.value,.ui.big.statistics .statistic>.value{font-size:5.5rem}.ui.big.horizontal.statistic>.value,.ui.big.horizontal.statistics .statistic>.value{font-size:4.5rem}.ui.big.statistic>.text.value,.ui.big.statistics .statistic>.text.value{font-size:2.5rem}.ui.huge.statistic>.value,.ui.huge.statistics .statistic>.value{font-size:6rem}.ui.huge.horizontal.statistic>.value,.ui.huge.horizontal.statistics .statistic>.value{font-size:5rem}.ui.huge.statistic>.text.value,.ui.huge.statistics .statistic>.text.value{font-size:2.5rem}.ui.massive.statistic>.value,.ui.massive.statistics .statistic>.value{font-size:7rem}.ui.massive.horizontal.statistic>.value,.ui.massive.horizontal.statistics .statistic>.value{font-size:6rem}.ui.massive.statistic>.text.value,.ui.massive.statistics .statistic>.text.value{font-size:3rem}
\ No newline at end of file
diff --git a/public/dist/components/step.css b/public/dist/components/step.css
new file mode 100644
index 000000000..ed93ea1ab
--- /dev/null
+++ b/public/dist/components/step.css
@@ -0,0 +1,700 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Step
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+
+/*******************************
+ Plural
+*******************************/
+
+.ui.steps {
+ display: -webkit-inline-box;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ -webkit-box-align: stretch;
+ -ms-flex-align: stretch;
+ align-items: stretch;
+ margin: 1em 0;
+ background: '';
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ line-height: 1.14285714em;
+ border-radius: 0.28571429rem;
+ border: 1px solid rgba(34, 36, 38, 0.15);
+}
+.ui.steps:not(.unstackable) {
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+}
+
+/* First Steps */
+.ui.steps:first-child {
+ margin-top: 0;
+}
+
+/* Last Steps */
+.ui.steps:last-child {
+ margin-bottom: 0;
+}
+
+
+/*******************************
+ Singular
+*******************************/
+
+.ui.steps .step {
+ position: relative;
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-flex: 1;
+ -ms-flex: 1 0 auto;
+ flex: 1 0 auto;
+ -ms-flex-wrap: wrap;
+ flex-wrap: wrap;
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: row;
+ flex-direction: row;
+ vertical-align: middle;
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+ -webkit-box-pack: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+ margin: 0 0;
+ padding: 1.14285714em 2em;
+ background: #FFFFFF;
+ color: rgba(0, 0, 0, 0.87);
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ border-radius: 0;
+ border: none;
+ border-right: 1px solid rgba(34, 36, 38, 0.15);
+ -webkit-transition: background-color 0.1s ease, opacity 0.1s ease, color 0.1s ease, -webkit-box-shadow 0.1s ease;
+ transition: background-color 0.1s ease, opacity 0.1s ease, color 0.1s ease, -webkit-box-shadow 0.1s ease;
+ transition: background-color 0.1s ease, opacity 0.1s ease, color 0.1s ease, box-shadow 0.1s ease;
+ transition: background-color 0.1s ease, opacity 0.1s ease, color 0.1s ease, box-shadow 0.1s ease, -webkit-box-shadow 0.1s ease;
+}
+
+/* Arrow */
+.ui.steps .step:after {
+ display: none;
+ position: absolute;
+ z-index: 2;
+ content: '';
+ top: 50%;
+ right: 0;
+ background-color: #FFFFFF;
+ width: 1.14285714em;
+ height: 1.14285714em;
+ border-style: solid;
+ border-color: rgba(34, 36, 38, 0.15);
+ border-width: 0 1px 1px 0;
+ -webkit-transition: background-color 0.1s ease, opacity 0.1s ease, color 0.1s ease, -webkit-box-shadow 0.1s ease;
+ transition: background-color 0.1s ease, opacity 0.1s ease, color 0.1s ease, -webkit-box-shadow 0.1s ease;
+ transition: background-color 0.1s ease, opacity 0.1s ease, color 0.1s ease, box-shadow 0.1s ease;
+ transition: background-color 0.1s ease, opacity 0.1s ease, color 0.1s ease, box-shadow 0.1s ease, -webkit-box-shadow 0.1s ease;
+ -webkit-transform: translateY(-50%) translateX(50%) rotate(-45deg);
+ transform: translateY(-50%) translateX(50%) rotate(-45deg);
+}
+
+/* First Step */
+.ui.steps .step:first-child {
+ padding-left: 2em;
+ border-radius: 0.28571429rem 0 0 0.28571429rem;
+}
+
+/* Last Step */
+.ui.steps .step:last-child {
+ border-radius: 0 0.28571429rem 0.28571429rem 0;
+ border-right: none;
+ margin-right: 0;
+}
+
+/* Only Step */
+.ui.steps .step:only-child {
+ border-radius: 0.28571429rem;
+}
+
+
+/*******************************
+ Content
+*******************************/
+
+
+/* Title */
+.ui.steps .step .title {
+ font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
+ font-size: 1.14285714em;
+ font-weight: bold;
+}
+.ui.steps .step > .title {
+ width: 100%;
+}
+
+/* Description */
+.ui.steps .step .description {
+ font-weight: normal;
+ font-size: 0.92857143em;
+ color: rgba(0, 0, 0, 0.87);
+}
+.ui.steps .step > .description {
+ width: 100%;
+}
+.ui.steps .step .title ~ .description {
+ margin-top: 0.25em;
+}
+
+/* Icon */
+.ui.steps .step > i.icon {
+ line-height: 1;
+ font-size: 2.5em;
+ margin: 0 1rem 0 0;
+}
+.ui.steps .step > i.icon,
+.ui.steps .step > i.icon ~ .content {
+ display: block;
+ -webkit-box-flex: 0;
+ -ms-flex: 0 1 auto;
+ flex: 0 1 auto;
+ -ms-flex-item-align: middle;
+ align-self: middle;
+}
+
+/* Horizontal Icon */
+.ui.steps:not(.vertical) .step > i.icon {
+ width: auto;
+}
+
+/* Link */
+.ui.steps .link.step,
+.ui.steps a.step {
+ cursor: pointer;
+}
+
+
+/*******************************
+ Types
+*******************************/
+
+
+/*--------------
+ Ordered
+ ---------------*/
+
+.ui.ordered.steps {
+ counter-reset: ordered;
+}
+.ui.ordered.steps .step:before {
+ display: block;
+ position: static;
+ text-align: center;
+ content: counter(ordered);
+ -ms-flex-item-align: middle;
+ align-self: middle;
+ margin-right: 1rem;
+ font-size: 2.5em;
+ counter-increment: ordered;
+ font-family: inherit;
+ font-weight: bold;
+}
+.ui.ordered.steps .step > * {
+ display: block;
+ -ms-flex-item-align: middle;
+ align-self: middle;
+}
+
+/*--------------
+ Vertical
+ ---------------*/
+
+.ui.vertical.steps {
+ display: -webkit-inline-box;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ overflow: visible;
+}
+.ui.vertical.steps .step {
+ -webkit-box-pack: start;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+ border-radius: 0;
+ padding: 1.14285714em 2em;
+ border-right: none;
+ border-bottom: 1px solid rgba(34, 36, 38, 0.15);
+}
+.ui.vertical.steps .step:first-child {
+ padding: 1.14285714em 2em;
+ border-radius: 0.28571429rem 0.28571429rem 0 0;
+}
+.ui.vertical.steps .step:last-child {
+ border-bottom: none;
+ border-radius: 0 0 0.28571429rem 0.28571429rem;
+}
+.ui.vertical.steps .step:only-child {
+ border-radius: 0.28571429rem;
+}
+
+/* Arrow */
+.ui.vertical.steps .step:after {
+ top: 50%;
+ right: 0;
+ border-width: 0 1px 1px 0;
+ display: none;
+}
+.ui.right.vertical.steps .step:after {
+ border-width: 1px 0 0 1px;
+ left: 0;
+ right: 100%;
+ -webkit-transform: translateY(-50%) translateX(-50%) rotate(-45deg);
+ transform: translateY(-50%) translateX(-50%) rotate(-45deg);
+}
+.ui.vertical.steps .active.step:after {
+ display: block;
+}
+.ui.vertical.steps .step:last-child:after {
+ display: none;
+}
+.ui.vertical.steps .active.step:last-child:after {
+ display: block;
+}
+
+/*---------------
+ Responsive
+----------------*/
+
+
+/* Mobile (Default) */
+@media only screen and (max-width: 767.98px) {
+ .ui.steps:not(.unstackable) {
+ display: -webkit-inline-box;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ overflow: visible;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ }
+ .ui.steps:not(.unstackable) .step {
+ width: 100% !important;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ border-radius: 0;
+ padding: 1.14285714em 2em;
+ border-right: none;
+ border-bottom: 1px solid rgba(34, 36, 38, 0.15);
+ }
+ .ui.steps:not(.unstackable) .step:first-child {
+ padding: 1.14285714em 2em;
+ border-radius: 0.28571429rem 0.28571429rem 0 0;
+ }
+ .ui.steps:not(.unstackable) .step:last-child {
+ border-radius: 0 0 0.28571429rem 0.28571429rem;
+ border-bottom: none;
+ }
+
+/* Arrow */
+ .ui.steps:not(.unstackable) .step:after {
+ top: unset;
+ bottom: -1.14285714em;
+ right: 50%;
+ -webkit-transform: translateY(-50%) translateX(50%) rotate(45deg);
+ transform: translateY(-50%) translateX(50%) rotate(45deg);
+ }
+ .ui.vertical.steps .active.step:last-child:after {
+ display: none;
+ }
+
+/* Content */
+ .ui.steps:not(.unstackable) .step .content {
+ text-align: center;
+ }
+
+/* Icon */
+ .ui.steps:not(.unstackable) .step > i.icon,
+ .ui.ordered.steps:not(.unstackable) .step:before {
+ margin: 0 0 1rem 0;
+ }
+}
+
+
+/*******************************
+ States
+*******************************/
+
+
+/* Link Hover */
+.ui.steps .link.step:hover::after,
+.ui.steps .link.step:hover,
+.ui.steps a.step:hover::after,
+.ui.steps a.step:hover {
+ background: #F9FAFB;
+ color: rgba(0, 0, 0, 0.8);
+}
+
+/* Link Down */
+.ui.steps .link.step:active::after,
+.ui.steps .link.step:active,
+.ui.steps a.step:active::after,
+.ui.steps a.step:active {
+ background: #F3F4F5;
+ color: rgba(0, 0, 0, 0.9);
+}
+
+/* Active */
+.ui.steps .step.active {
+ cursor: auto;
+ background: #F3F4F5;
+}
+.ui.steps .step.active:after {
+ background: #F3F4F5;
+}
+.ui.steps .step.active .title {
+ color: #4183C4;
+}
+.ui.ordered.steps .step.active:before,
+.ui.steps .active.step i.icon {
+ color: rgba(0, 0, 0, 0.85);
+}
+
+/* Active Arrow */
+.ui.steps .step:after {
+ display: block;
+}
+.ui.steps .active.step:after {
+ display: block;
+}
+.ui.steps .step:last-child:after {
+ display: none;
+}
+.ui.steps .active.step:last-child:after {
+ display: none;
+}
+
+/* Active Hover */
+.ui.steps .link.active.step:hover::after,
+.ui.steps .link.active.step:hover,
+.ui.steps a.active.step:hover::after,
+.ui.steps a.active.step:hover {
+ cursor: pointer;
+ background: #DCDDDE;
+ color: rgba(0, 0, 0, 0.87);
+}
+
+/* Completed */
+.ui.steps .step.completed > i.icon:before,
+.ui.ordered.steps .step.completed:before {
+ color: #21BA45;
+}
+
+/* Disabled */
+.ui.steps .disabled.step {
+ cursor: auto;
+ background: #FFFFFF;
+ pointer-events: none;
+}
+.ui.steps .disabled.step,
+.ui.steps .disabled.step .title,
+.ui.steps .disabled.step .description {
+ color: rgba(40, 40, 40, 0.3);
+}
+.ui.steps .disabled.step:after {
+ background: #FFFFFF;
+}
+
+
+/*******************************
+ Variations
+*******************************/
+
+
+/*--------------
+ Stackable
+ ---------------*/
+
+
+/* Tablet Or Below */
+@media only screen and (max-width: 991.98px) {
+ .ui[class*="tablet stackable"].steps {
+ display: -webkit-inline-box;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ overflow: visible;
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ }
+
+/* Steps */
+ .ui[class*="tablet stackable"].steps .step {
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: column;
+ flex-direction: column;
+ border-radius: 0;
+ padding: 1.14285714em 2em;
+ border-right: none;
+ border-bottom: 1px solid rgba(34, 36, 38, 0.15);
+ }
+ .ui[class*="tablet stackable"].steps .step:first-child {
+ padding: 1.14285714em 2em;
+ border-radius: 0.28571429rem 0.28571429rem 0 0;
+ }
+ .ui[class*="tablet stackable"].steps .step:last-child {
+ border-radius: 0 0 0.28571429rem 0.28571429rem;
+ border-bottom: none;
+ }
+
+/* Arrow */
+ .ui[class*="tablet stackable"].steps .step:after {
+ top: unset;
+ bottom: -1.14285714em;
+ right: 50%;
+ -webkit-transform: translateY(-50%) translateX(50%) rotate(45deg);
+ transform: translateY(-50%) translateX(50%) rotate(45deg);
+ }
+
+/* Content */
+ .ui[class*="tablet stackable"].steps .step .content {
+ text-align: center;
+ }
+
+/* Icon */
+ .ui[class*="tablet stackable"].steps .step > i.icon,
+ .ui[class*="tablet stackable"].ordered.steps .step:before {
+ margin: 0 0 1rem 0;
+ }
+}
+
+/*--------------
+ Fluid
+ ---------------*/
+
+
+/* Fluid */
+.ui.fluid.steps {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ width: 100%;
+}
+
+/*--------------
+ Attached
+ ---------------*/
+
+
+/* Top */
+.ui.attached.steps {
+ width: calc(100% + 2px) !important;
+ margin: 0 -1px 0;
+ max-width: calc(100% + 2px);
+ border-radius: 0.28571429rem 0.28571429rem 0 0;
+}
+.ui.attached.steps .step:first-child {
+ border-radius: 0.28571429rem 0 0 0;
+}
+.ui.attached.steps .step:last-child {
+ border-radius: 0 0.28571429rem 0 0;
+}
+
+/* Bottom */
+.ui.bottom.attached.steps {
+ margin: 0 -1px 0;
+ border-radius: 0 0 0.28571429rem 0.28571429rem;
+}
+.ui.bottom.attached.steps .step:first-child {
+ border-radius: 0 0 0 0.28571429rem;
+}
+.ui.bottom.attached.steps .step:last-child {
+ border-radius: 0 0 0.28571429rem 0;
+}
+
+/*-------------------
+ Evenly Divided
+--------------------*/
+
+.ui.one.steps,
+.ui.two.steps,
+.ui.three.steps,
+.ui.four.steps,
+.ui.five.steps,
+.ui.six.steps,
+.ui.seven.steps,
+.ui.eight.steps {
+ width: 100%;
+}
+.ui.one.steps > .step,
+.ui.two.steps > .step,
+.ui.three.steps > .step,
+.ui.four.steps > .step,
+.ui.five.steps > .step,
+.ui.six.steps > .step,
+.ui.seven.steps > .step,
+.ui.eight.steps > .step {
+ -ms-flex-wrap: nowrap;
+ flex-wrap: nowrap;
+}
+.ui.one.steps > .step {
+ width: 100%;
+}
+.ui.two.steps > .step {
+ width: 50%;
+}
+.ui.three.steps > .step {
+ width: 33.333%;
+}
+.ui.four.steps > .step {
+ width: 25%;
+}
+.ui.five.steps > .step {
+ width: 20%;
+}
+.ui.six.steps > .step {
+ width: 16.666%;
+}
+.ui.seven.steps > .step {
+ width: 14.285%;
+}
+.ui.eight.steps > .step {
+ width: 12.5%;
+}
+
+/*-------------------
+ Sizes
+--------------------*/
+
+.ui.steps .step,
+.ui.step {
+ font-size: 1rem;
+}
+.ui.mini.steps .step,
+.ui.mini.step {
+ font-size: 0.78571429rem;
+}
+.ui.tiny.steps .step,
+.ui.tiny.step {
+ font-size: 0.85714286rem;
+}
+.ui.small.steps .step,
+.ui.small.step {
+ font-size: 0.92857143rem;
+}
+.ui.large.steps .step,
+.ui.large.step {
+ font-size: 1.14285714rem;
+}
+.ui.big.steps .step,
+.ui.big.step {
+ font-size: 1.28571429rem;
+}
+.ui.huge.steps .step,
+.ui.huge.step {
+ font-size: 1.42857143rem;
+}
+.ui.massive.steps .step,
+.ui.massive.step {
+ font-size: 1.71428571rem;
+}
+
+/*--------------
+ Inverted
+ ---------------*/
+
+.ui.inverted.steps {
+ border: 1px solid #555555;
+}
+.ui.inverted.steps .step {
+ color: rgba(255, 255, 255, 0.9);
+ background: #1B1C1D;
+ border-color: #555555;
+}
+.ui.inverted.steps .step:after {
+ background-color: #1B1C1D;
+ border-color: #555555;
+}
+.ui.inverted.steps .step .description {
+ color: rgba(255, 255, 255, 0.9);
+}
+
+/* Active */
+.ui.inverted.steps .step.active,
+.ui.inverted.steps .step.active:after {
+ background: #333333;
+}
+.ui.inverted.ordered.steps .step.active:before,
+.ui.inverted.steps .active.step i.icon {
+ color: #ffffff;
+}
+
+/* Disabled */
+.ui.inverted.steps .disabled.step,
+.ui.inverted.steps .disabled.step:after {
+ background: #222222;
+}
+.ui.inverted.steps .disabled.step,
+.ui.inverted.steps .disabled.step .title,
+.ui.inverted.steps .disabled.step .description {
+ color: rgba(225, 225, 225, 0.3);
+}
+
+/* Link Hover */
+.ui.inverted.steps .link.step:hover::after,
+.ui.inverted.steps .link.step:hover,
+.ui.inverted.steps a.step:hover::after,
+.ui.inverted.steps a.step:hover {
+ background: #3F3F3F;
+ color: #ffffff;
+}
+
+/* Link Down */
+.ui.inverted.steps .link.step:active::after,
+.ui.inverted.steps .link.step:active,
+.ui.inverted.steps a.step:active::after,
+.ui.inverted.steps a.step:active {
+ background: #444444;
+ color: #ffffff;
+}
+
+
+/*******************************
+ Theme Overrides
+*******************************/
+
+@font-face {
+ font-family: 'Step';
+ src: url(data:application/x-font-ttf;charset=utf-8;;base64,AAEAAAAOAIAAAwBgT1MvMj3hSQEAAADsAAAAVmNtYXDQEhm3AAABRAAAAUpjdnQgBkn/lAAABuwAAAAcZnBnbYoKeDsAAAcIAAAJkWdhc3AAAAAQAAAG5AAAAAhnbHlm32cEdgAAApAAAAC2aGVhZAErPHsAAANIAAAANmhoZWEHUwNNAAADgAAAACRobXR4CykAAAAAA6QAAAAMbG9jYQA4AFsAAAOwAAAACG1heHAApgm8AAADuAAAACBuYW1lzJ0aHAAAA9gAAALNcG9zdK69QJgAAAaoAAAAO3ByZXCSoZr/AAAQnAAAAFYAAQO4AZAABQAIAnoCvAAAAIwCegK8AAAB4AAxAQIAAAIABQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUGZFZABA6ADoAQNS/2oAWgMLAE8AAAABAAAAAAAAAAAAAwAAAAMAAAAcAAEAAAAAAEQAAwABAAAAHAAEACgAAAAGAAQAAQACAADoAf//AAAAAOgA//8AABgBAAEAAAAAAAAAAAEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAADpAKYABUAHEAZDwEAAQFCAAIBAmoAAQABagAAAGEUFxQDEisBFAcBBiInASY0PwE2Mh8BATYyHwEWA6QP/iAQLBD+6g8PTBAsEKQBbhAsEEwPAhYWEP4gDw8BFhAsEEwQEKUBbxAQTBAAAAH//f+xA18DCwAMABJADwABAQpDAAAACwBEFRMCESsBFA4BIi4CPgEyHgEDWXLG6MhuBnq89Lp+AV51xHR0xOrEdHTEAAAAAAEAAAABAADDeRpdXw889QALA+gAAAAAzzWYjQAAAADPNWBN//3/sQOkAwsAAAAIAAIAAAAAAAAAAQAAA1L/agBaA+gAAP/3A6QAAQAAAAAAAAAAAAAAAAAAAAMD6AAAA+gAAANZAAAAAAAAADgAWwABAAAAAwAWAAEAAAAAAAIABgATAG4AAAAtCZEAAAAAAAAAEgDeAAEAAAAAAAAANQAAAAEAAAAAAAEACAA1AAEAAAAAAAIABwA9AAEAAAAAAAMACABEAAEAAAAAAAQACABMAAEAAAAAAAUACwBUAAEAAAAAAAYACABfAAEAAAAAAAoAKwBnAAEAAAAAAAsAEwCSAAMAAQQJAAAAagClAAMAAQQJAAEAEAEPAAMAAQQJAAIADgEfAAMAAQQJAAMAEAEtAAMAAQQJAAQAEAE9AAMAAQQJAAUAFgFNAAMAAQQJAAYAEAFjAAMAAQQJAAoAVgFzAAMAAQQJAAsAJgHJQ29weXJpZ2h0IChDKSAyMDE0IGJ5IG9yaWdpbmFsIGF1dGhvcnMgQCBmb250ZWxsby5jb21mb250ZWxsb1JlZ3VsYXJmb250ZWxsb2ZvbnRlbGxvVmVyc2lvbiAxLjBmb250ZWxsb0dlbmVyYXRlZCBieSBzdmcydHRmIGZyb20gRm9udGVsbG8gcHJvamVjdC5odHRwOi8vZm9udGVsbG8uY29tAEMAbwBwAHkAcgBpAGcAaAB0ACAAKABDACkAIAAyADAAMQA0ACAAYgB5ACAAbwByAGkAZwBpAG4AYQBsACAAYQB1AHQAaABvAHIAcwAgAEAAIABmAG8AbgB0AGUAbABsAG8ALgBjAG8AbQBmAG8AbgB0AGUAbABsAG8AUgBlAGcAdQBsAGEAcgBmAG8AbgB0AGUAbABsAG8AZgBvAG4AdABlAGwAbABvAFYAZQByAHMAaQBvAG4AIAAxAC4AMABmAG8AbgB0AGUAbABsAG8ARwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABzAHYAZwAyAHQAdABmACAAZgByAG8AbQAgAEYAbwBuAHQAZQBsAGwAbwAgAHAAcgBvAGoAZQBjAHQALgBoAHQAdABwADoALwAvAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAAAAAAIAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAQIBAwljaGVja21hcmsGY2lyY2xlAAAAAAEAAf//AA8AAAAAAAAAAAAAAAAAAAAAADIAMgML/7EDC/+xsAAssCBgZi2wASwgZCCwwFCwBCZasARFW1ghIyEbilggsFBQWCGwQFkbILA4UFghsDhZWSCwCkVhZLAoUFghsApFILAwUFghsDBZGyCwwFBYIGYgiophILAKUFhgGyCwIFBYIbAKYBsgsDZQWCGwNmAbYFlZWRuwACtZWSOwAFBYZVlZLbACLCBFILAEJWFkILAFQ1BYsAUjQrAGI0IbISFZsAFgLbADLCMhIyEgZLEFYkIgsAYjQrIKAAIqISCwBkMgiiCKsAArsTAFJYpRWGBQG2FSWVgjWSEgsEBTWLAAKxshsEBZI7AAUFhlWS2wBCywB0MrsgACAENgQi2wBSywByNCIyCwACNCYbCAYrABYLAEKi2wBiwgIEUgsAJFY7ABRWJgRLABYC2wBywgIEUgsAArI7ECBCVgIEWKI2EgZCCwIFBYIbAAG7AwUFiwIBuwQFlZI7AAUFhlWbADJSNhRESwAWAtsAgssQUFRbABYUQtsAkssAFgICCwCUNKsABQWCCwCSNCWbAKQ0qwAFJYILAKI0JZLbAKLCC4BABiILgEAGOKI2GwC0NgIIpgILALI0IjLbALLEtUWLEHAURZJLANZSN4LbAMLEtRWEtTWLEHAURZGyFZJLATZSN4LbANLLEADENVWLEMDEOwAWFCsAorWbAAQ7ACJUKxCQIlQrEKAiVCsAEWIyCwAyVQWLEBAENgsAQlQoqKIIojYbAJKiEjsAFhIIojYbAJKiEbsQEAQ2CwAiVCsAIlYbAJKiFZsAlDR7AKQ0dgsIBiILACRWOwAUViYLEAABMjRLABQ7AAPrIBAQFDYEItsA4ssQAFRVRYALAMI0IgYLABYbUNDQEACwBCQopgsQ0FK7BtKxsiWS2wDyyxAA4rLbAQLLEBDistsBEssQIOKy2wEiyxAw4rLbATLLEEDistsBQssQUOKy2wFSyxBg4rLbAWLLEHDistsBcssQgOKy2wGCyxCQ4rLbAZLLAIK7EABUVUWACwDCNCIGCwAWG1DQ0BAAsAQkKKYLENBSuwbSsbIlktsBossQAZKy2wGyyxARkrLbAcLLECGSstsB0ssQMZKy2wHiyxBBkrLbAfLLEFGSstsCAssQYZKy2wISyxBxkrLbAiLLEIGSstsCMssQkZKy2wJCwgPLABYC2wJSwgYLANYCBDI7ABYEOwAiVhsAFgsCQqIS2wJiywJSuwJSotsCcsICBHICCwAkVjsAFFYmAjYTgjIIpVWCBHICCwAkVjsAFFYmAjYTgbIVktsCgssQAFRVRYALABFrAnKrABFTAbIlktsCkssAgrsQAFRVRYALABFrAnKrABFTAbIlktsCosIDWwAWAtsCssALADRWOwAUVisAArsAJFY7ABRWKwACuwABa0AAAAAABEPiM4sSoBFSotsCwsIDwgRyCwAkVjsAFFYmCwAENhOC2wLSwuFzwtsC4sIDwgRyCwAkVjsAFFYmCwAENhsAFDYzgtsC8ssQIAFiUgLiBHsAAjQrACJUmKikcjRyNhIFhiGyFZsAEjQrIuAQEVFCotsDAssAAWsAQlsAQlRyNHI2GwBkUrZYouIyAgPIo4LbAxLLAAFrAEJbAEJSAuRyNHI2EgsAQjQrAGRSsgsGBQWCCwQFFYswIgAyAbswImAxpZQkIjILAIQyCKI0cjRyNhI0ZgsARDsIBiYCCwACsgiophILACQ2BkI7ADQ2FkUFiwAkNhG7ADQ2BZsAMlsIBiYSMgILAEJiNGYTgbI7AIQ0awAiWwCENHI0cjYWAgsARDsIBiYCMgsAArI7AEQ2CwACuwBSVhsAUlsIBisAQmYSCwBCVgZCOwAyVgZFBYIRsjIVkjICCwBCYjRmE4WS2wMiywABYgICCwBSYgLkcjRyNhIzw4LbAzLLAAFiCwCCNCICAgRiNHsAArI2E4LbA0LLAAFrADJbACJUcjRyNhsABUWC4gPCMhG7ACJbACJUcjRyNhILAFJbAEJUcjRyNhsAYlsAUlSbACJWGwAUVjIyBYYhshWWOwAUViYCMuIyAgPIo4IyFZLbA1LLAAFiCwCEMgLkcjRyNhIGCwIGBmsIBiIyAgPIo4LbA2LCMgLkawAiVGUlggPFkusSYBFCstsDcsIyAuRrACJUZQWCA8WS6xJgEUKy2wOCwjIC5GsAIlRlJYIDxZIyAuRrACJUZQWCA8WS6xJgEUKy2wOSywMCsjIC5GsAIlRlJYIDxZLrEmARQrLbA6LLAxK4ogIDywBCNCijgjIC5GsAIlRlJYIDxZLrEmARQrsARDLrAmKy2wOyywABawBCWwBCYgLkcjRyNhsAZFKyMgPCAuIzixJgEUKy2wPCyxCAQlQrAAFrAEJbAEJSAuRyNHI2EgsAQjQrAGRSsgsGBQWCCwQFFYswIgAyAbswImAxpZQkIjIEewBEOwgGJgILAAKyCKimEgsAJDYGQjsANDYWRQWLACQ2EbsANDYFmwAyWwgGJhsAIlRmE4IyA8IzgbISAgRiNHsAArI2E4IVmxJgEUKy2wPSywMCsusSYBFCstsD4ssDErISMgIDywBCNCIzixJgEUK7AEQy6wJistsD8ssAAVIEewACNCsgABARUUEy6wLCotsEAssAAVIEewACNCsgABARUUEy6wLCotsEEssQABFBOwLSotsEIssC8qLbBDLLAAFkUjIC4gRoojYTixJgEUKy2wRCywCCNCsEMrLbBFLLIAADwrLbBGLLIAATwrLbBHLLIBADwrLbBILLIBATwrLbBJLLIAAD0rLbBKLLIAAT0rLbBLLLIBAD0rLbBMLLIBAT0rLbBNLLIAADkrLbBOLLIAATkrLbBPLLIBADkrLbBQLLIBATkrLbBRLLIAADsrLbBSLLIAATsrLbBTLLIBADsrLbBULLIBATsrLbBVLLIAAD4rLbBWLLIAAT4rLbBXLLIBAD4rLbBYLLIBAT4rLbBZLLIAADorLbBaLLIAATorLbBbLLIBADorLbBcLLIBATorLbBdLLAyKy6xJgEUKy2wXiywMiuwNistsF8ssDIrsDcrLbBgLLAAFrAyK7A4Ky2wYSywMysusSYBFCstsGIssDMrsDYrLbBjLLAzK7A3Ky2wZCywMyuwOCstsGUssDQrLrEmARQrLbBmLLA0K7A2Ky2wZyywNCuwNystsGgssDQrsDgrLbBpLLA1Ky6xJgEUKy2waiywNSuwNistsGsssDUrsDcrLbBsLLA1K7A4Ky2wbSwrsAhlsAMkUHiwARUwLQAAAEu4AMhSWLEBAY5ZuQgACABjILABI0SwAyNwsgQoCUVSRLIKAgcqsQYBRLEkAYhRWLBAiFixBgNEsSYBiFFYuAQAiFixBgFEWVlZWbgB/4WwBI2xBQBEAAA=) format('truetype'), url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAoUAA4AAAAAEPQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABRAAAAEQAAABWPeFJAWNtYXAAAAGIAAAAOgAAAUrQEhm3Y3Z0IAAAAcQAAAAUAAAAHAZJ/5RmcGdtAAAB2AAABPkAAAmRigp4O2dhc3AAAAbUAAAACAAAAAgAAAAQZ2x5ZgAABtwAAACuAAAAtt9nBHZoZWFkAAAHjAAAADUAAAA2ASs8e2hoZWEAAAfEAAAAIAAAACQHUwNNaG10eAAAB+QAAAAMAAAADAspAABsb2NhAAAH8AAAAAgAAAAIADgAW21heHAAAAf4AAAAIAAAACAApgm8bmFtZQAACBgAAAF3AAACzcydGhxwb3N0AAAJkAAAACoAAAA7rr1AmHByZXAAAAm8AAAAVgAAAFaSoZr/eJxjYGTewTiBgZWBg6mKaQ8DA0MPhGZ8wGDIyMTAwMTAysyAFQSkuaYwOLxgeMHIHPQ/iyGKmZvBHyjMCJIDAPe9C2B4nGNgYGBmgGAZBkYGEHAB8hjBfBYGDSDNBqQZGZgYGF4w/v8PUvCCAURLMELVAwEjG8OIBwBk5AavAAB4nGNgQANGDEbM3P83gjAAELQD4XicnVXZdtNWFJU8ZHASOmSgoA7X3DhQ68qEKRgwaSrFdiEdHAitBB2kDHTkncc+62uOQrtWH/m07n09JLR0rbYsls++R1tn2DrnRhwjKn0aiGvUoZKXA6msPZZK90lc13Uvj5UMBnFdthJPSZuonSRKat3sUC7xWOsqWSdYJ+PlIFZPVZ5noAziFB5lSUQbRBuplyZJ4onjJ4kWZxAfJUkgJaMQp9LIUEI1GsRS1aFM6dCr1xNx00DKRqMedVhU90PFJ8c1p9SsA0YqVznCFevVRr4bpwMve5DEOsGzrYcxHnisfpQqkIqR6cg/dkpOlIaBVHHUoVbi6DCTX/eRTCrNQKaMYkWl7oG43f102xYxPXQ6vi5KlUaqurnOKJrt0fGogygP2cbppNzQ2fbw5RlTVKtdcbPtQGYNXErJbHSfRAAdJlLj6QFONZwCqRn1R8XZ588BEslclKo8VTKHegOZMzt7cTHtbiersnCknwcyb3Z2452HQ6dXh3/R+hdM4cxHj+Jifj5C+lBqfiJOJKVGWMzyp4YfcVcgQrkxiAsXyuBThDl0RdrZZl3jtTH2hs/5SqlhPQna6KP4fgr9TiQrHGdRo/VInM1j13Wt3GdQS7W7Fzsyr0OVIu7vCwuuM+eEYZ4WC1VfnvneBTT/Bohn/EDeNIVL+5YpSrRvm6JMu2iKCu0SVKVdNsUU7YoppmnPmmKG9h1TzNKeMzLj/8vc55H7HN7xkJv2XeSmfQ+5ad9HbtoPkJtWITdtHblpLyA3rUZu2lWjOnYEGgZpF1IVQdA0svph3Fab9UDWjDR8aWDyLmLI+upER521tcofxX914gsHcmmip7siF5viLq/bFj483e6rj5pG3bDV+MaR8jAeRnocmtBZ+c3hv+1N3S6a7jKqMugBFUwKwABl7UAC0zrbCaT1mqf48gdgXIZ4zkpDtVSfO4am7+V5X/exOfG+x+3GLrdcd3kJWdYNcmP28N9SZKrrH+UtrVQnR6wrJ49VaxhDKrwour6SlHu0tRu/KKmy8l6U1srnk5CbPYMbQlu27mGwI0xpyiUeXlOlKD3UUo6yQyxvKco84JSLC1qGxLgOdQ9qa8TpoXoYGwshhqG0vRBwSCldFd+0ynfxHqtr2Oj4xRXh6XpyEhGf4ir7UfBU10b96A7avGbdMoMpVaqn+4xPsa/b9lFZaaSOsxe3VAfXNOsaORXTT+Rr4HRvOGjdAz1UfDRBI1U1x+jGKGM0ljXl3wR0MVZ+w2jVYvs93E+dpFWsuUuY7JsT9+C0u/0q+7WcW0bW/dcGvW3kip8jMb8tCvw7B2K3ZA3UO5OBGAvIWdAYxhYmdxiug23EbfY/Jqf/34aFRXJXOxq7eerD1ZNRJXfZ8rjLTXZZ16M2R9VOGvsIjS0PN+bY4XIstsRgQbb+wf8x7gF3aVEC4NDIZZiI2nShnurh6h6rsW04VxIBds2x43QAegAuQd8cu9bzCYD13CPnLsB9cgh2yCH4lByCz8i5BfA5OQRfkEMwIIdgl5w7AA/IIXhIDsEeOQSPyNkE+JIcgq/IIYjJIUjIuQ3wmByCJ+QQfE0OwTdGrk5k/pYH2QD6zqKbQKmdGhzaOGRGrk3Y+zxY9oFFZB9aROqRkesT6lMeLPV7i0j9wSJSfzRyY0L9iQdL/dkiUn+xiNRnxpeZIymvDp7zjg7+BJfqrV4AAAAAAQAB//8AD3icY2BkAALmJUwzGEQZZBwk+RkZGBmdGJgYmbIYgMwsoGSiiLgIs5A2owg7I5uSOqOaiT2jmZE8I5gQY17C/09BQEfg3yt+fh8gvYQxD0j68DOJiQn8U+DnZxQDcQUEljLmCwBpBgbG/3//b2SOZ+Zm4GEQcuAH2sblDLSEm8FFVJhJEGgLH6OSHpMdo5EcI3Nk0bEXJ/LYqvZ82VXHGFd6pKTkyCsQwQAAq+QkqAAAeJxjYGRgYADiw5VSsfH8Nl8ZuJlfAEUYzpvO6IXQCb7///7fyLyEmRvI5WBgAokCAFb/DJAAAAB4nGNgZGBgDvqfxRDF/IKB4f935iUMQBEUwAwAi5YFpgPoAAAD6AAAA1kAAAAAAAAAOABbAAEAAAADABYAAQAAAAAAAgAGABMAbgAAAC0JkQAAAAB4nHWQy2rCQBSG//HSi0JbWui2sypKabxgN4IgWHTTbqS4LTHGJBIzMhkFX6Pv0IfpS/RZ+puMpShNmMx3vjlz5mQAXOMbAvnzxJGzwBmjnAs4Rc9ykf7Zcon8YrmMKt4sn9C/W67gAYHlKm7wwQqidM5ogU/LAlfi0nIBF+LOcpH+0XKJ3LNcxq14tXxC71muYCJSy1Xci6+BWm11FIRG1gZ12W62OnK6lYoqStxYumsTKp3KvpyrxPhxrBxPLfc89oN17Op9uJ8nvk4jlciW09yrkZ/42jX+bFc93QRtY+ZyrtVSDm2GXGm18D3jhMasuo3G3/MwgMIKW2hEvKoQBhI12jrnNppooUOaMkMyM8+KkMBFTONizR1htpIy7nPMGSW0PjNisgOP3+WRH5MC7o9ZRR+tHsYT0u6MKPOSfTns7jBrREqyTDezs9/eU2x4WpvWcNeuS511JTE8qCF5H7u1BY1H72S3Ymi7aPD95/9+AN1fhEsAeJxjYGKAAC4G7ICZgYGRiZGZMzkjNTk7N7Eomy05syg5J5WBAQBE1QZBAABLuADIUlixAQGOWbkIAAgAYyCwASNEsAMjcLIEKAlFUkSyCgIHKrEGAUSxJAGIUViwQIhYsQYDRLEmAYhRWLgEAIhYsQYBRFlZWVm4Af+FsASNsQUARAAA) format('woff');
+}
+.ui.steps .step.completed > .icon:before,
+.ui.ordered.steps .step.completed:before {
+ font-family: 'Step';
+ content: '\e800';
+
+/* 'î €' */
+}
+
+
+/*******************************
+ Site Overrides
+*******************************/
+
diff --git a/public/dist/components/step.min.css b/public/dist/components/step.min.css
new file mode 100644
index 000000000..f50aeeb17
--- /dev/null
+++ b/public/dist/components/step.min.css
@@ -0,0 +1,9 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Step
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */.ui.steps{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;margin:1em 0;background:'';-webkit-box-shadow:none;box-shadow:none;line-height:1.14285714em;border-radius:.28571429rem;border:1px solid rgba(34,36,38,.15)}.ui.steps:not(.unstackable){-ms-flex-wrap:wrap;flex-wrap:wrap}.ui.steps:first-child{margin-top:0}.ui.steps:last-child{margin-bottom:0}.ui.steps .step{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 0 auto;flex:1 0 auto;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row;vertical-align:middle;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;margin:0 0;padding:1.14285714em 2em;background:#fff;color:rgba(0,0,0,.87);-webkit-box-shadow:none;box-shadow:none;border-radius:0;border:none;border-right:1px solid rgba(34,36,38,.15);-webkit-transition:background-color .1s ease,opacity .1s ease,color .1s ease,-webkit-box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,-webkit-box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,box-shadow .1s ease,-webkit-box-shadow .1s ease}.ui.steps .step:after{display:none;position:absolute;z-index:2;content:'';top:50%;right:0;background-color:#fff;width:1.14285714em;height:1.14285714em;border-style:solid;border-color:rgba(34,36,38,.15);border-width:0 1px 1px 0;-webkit-transition:background-color .1s ease,opacity .1s ease,color .1s ease,-webkit-box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,-webkit-box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,box-shadow .1s ease;transition:background-color .1s ease,opacity .1s ease,color .1s ease,box-shadow .1s ease,-webkit-box-shadow .1s ease;-webkit-transform:translateY(-50%) translateX(50%) rotate(-45deg);transform:translateY(-50%) translateX(50%) rotate(-45deg)}.ui.steps .step:first-child{padding-left:2em;border-radius:.28571429rem 0 0 .28571429rem}.ui.steps .step:last-child{border-radius:0 .28571429rem .28571429rem 0;border-right:none;margin-right:0}.ui.steps .step:only-child{border-radius:.28571429rem}.ui.steps .step .title{font-family:Lato,'Helvetica Neue',Arial,Helvetica,sans-serif;font-size:1.14285714em;font-weight:700}.ui.steps .step>.title{width:100%}.ui.steps .step .description{font-weight:400;font-size:.92857143em;color:rgba(0,0,0,.87)}.ui.steps .step>.description{width:100%}.ui.steps .step .title~.description{margin-top:.25em}.ui.steps .step>i.icon{line-height:1;font-size:2.5em;margin:0 1rem 0 0}.ui.steps .step>i.icon,.ui.steps .step>i.icon~.content{display:block;-webkit-box-flex:0;-ms-flex:0 1 auto;flex:0 1 auto;-ms-flex-item-align:middle;align-self:middle}.ui.steps:not(.vertical) .step>i.icon{width:auto}.ui.steps .link.step,.ui.steps a.step{cursor:pointer}.ui.ordered.steps{counter-reset:ordered}.ui.ordered.steps .step:before{display:block;position:static;text-align:center;content:counter(ordered);-ms-flex-item-align:middle;align-self:middle;margin-right:1rem;font-size:2.5em;counter-increment:ordered;font-family:inherit;font-weight:700}.ui.ordered.steps .step>*{display:block;-ms-flex-item-align:middle;align-self:middle}.ui.vertical.steps{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;overflow:visible}.ui.vertical.steps .step{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start;border-radius:0;padding:1.14285714em 2em;border-right:none;border-bottom:1px solid rgba(34,36,38,.15)}.ui.vertical.steps .step:first-child{padding:1.14285714em 2em;border-radius:.28571429rem .28571429rem 0 0}.ui.vertical.steps .step:last-child{border-bottom:none;border-radius:0 0 .28571429rem .28571429rem}.ui.vertical.steps .step:only-child{border-radius:.28571429rem}.ui.vertical.steps .step:after{top:50%;right:0;border-width:0 1px 1px 0;display:none}.ui.right.vertical.steps .step:after{border-width:1px 0 0 1px;left:0;right:100%;-webkit-transform:translateY(-50%) translateX(-50%) rotate(-45deg);transform:translateY(-50%) translateX(-50%) rotate(-45deg)}.ui.vertical.steps .active.step:after{display:block}.ui.vertical.steps .step:last-child:after{display:none}.ui.vertical.steps .active.step:last-child:after{display:block}@media only screen and (max-width:767.98px){.ui.steps:not(.unstackable){display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;overflow:visible;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.ui.steps:not(.unstackable) .step{width:100%!important;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;border-radius:0;padding:1.14285714em 2em;border-right:none;border-bottom:1px solid rgba(34,36,38,.15)}.ui.steps:not(.unstackable) .step:first-child{padding:1.14285714em 2em;border-radius:.28571429rem .28571429rem 0 0}.ui.steps:not(.unstackable) .step:last-child{border-radius:0 0 .28571429rem .28571429rem;border-bottom:none}.ui.steps:not(.unstackable) .step:after{top:unset;bottom:-1.14285714em;right:50%;-webkit-transform:translateY(-50%) translateX(50%) rotate(45deg);transform:translateY(-50%) translateX(50%) rotate(45deg)}.ui.vertical.steps .active.step:last-child:after{display:none}.ui.steps:not(.unstackable) .step .content{text-align:center}.ui.ordered.steps:not(.unstackable) .step:before,.ui.steps:not(.unstackable) .step>i.icon{margin:0 0 1rem 0}}.ui.steps .link.step:hover,.ui.steps .link.step:hover::after,.ui.steps a.step:hover,.ui.steps a.step:hover::after{background:#f9fafb;color:rgba(0,0,0,.8)}.ui.steps .link.step:active,.ui.steps .link.step:active::after,.ui.steps a.step:active,.ui.steps a.step:active::after{background:#f3f4f5;color:rgba(0,0,0,.9)}.ui.steps .step.active{cursor:auto;background:#f3f4f5}.ui.steps .step.active:after{background:#f3f4f5}.ui.steps .step.active .title{color:#4183c4}.ui.ordered.steps .step.active:before,.ui.steps .active.step i.icon{color:rgba(0,0,0,.85)}.ui.steps .step:after{display:block}.ui.steps .active.step:after{display:block}.ui.steps .step:last-child:after{display:none}.ui.steps .active.step:last-child:after{display:none}.ui.steps .link.active.step:hover,.ui.steps .link.active.step:hover::after,.ui.steps a.active.step:hover,.ui.steps a.active.step:hover::after{cursor:pointer;background:#dcddde;color:rgba(0,0,0,.87)}.ui.ordered.steps .step.completed:before,.ui.steps .step.completed>i.icon:before{color:#21ba45}.ui.steps .disabled.step{cursor:auto;background:#fff;pointer-events:none}.ui.steps .disabled.step,.ui.steps .disabled.step .description,.ui.steps .disabled.step .title{color:rgba(40,40,40,.3)}.ui.steps .disabled.step:after{background:#fff}@media only screen and (max-width:991.98px){.ui[class*="tablet stackable"].steps{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;overflow:visible;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.ui[class*="tablet stackable"].steps .step{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;border-radius:0;padding:1.14285714em 2em;border-right:none;border-bottom:1px solid rgba(34,36,38,.15)}.ui[class*="tablet stackable"].steps .step:first-child{padding:1.14285714em 2em;border-radius:.28571429rem .28571429rem 0 0}.ui[class*="tablet stackable"].steps .step:last-child{border-radius:0 0 .28571429rem .28571429rem;border-bottom:none}.ui[class*="tablet stackable"].steps .step:after{top:unset;bottom:-1.14285714em;right:50%;-webkit-transform:translateY(-50%) translateX(50%) rotate(45deg);transform:translateY(-50%) translateX(50%) rotate(45deg)}.ui[class*="tablet stackable"].steps .step .content{text-align:center}.ui[class*="tablet stackable"].ordered.steps .step:before,.ui[class*="tablet stackable"].steps .step>i.icon{margin:0 0 1rem 0}}.ui.fluid.steps{display:-webkit-box;display:-ms-flexbox;display:flex;width:100%}.ui.attached.steps{width:calc(100% + 2px)!important;margin:0 -1px 0;max-width:calc(100% + 2px);border-radius:.28571429rem .28571429rem 0 0}.ui.attached.steps .step:first-child{border-radius:.28571429rem 0 0 0}.ui.attached.steps .step:last-child{border-radius:0 .28571429rem 0 0}.ui.bottom.attached.steps{margin:0 -1px 0;border-radius:0 0 .28571429rem .28571429rem}.ui.bottom.attached.steps .step:first-child{border-radius:0 0 0 .28571429rem}.ui.bottom.attached.steps .step:last-child{border-radius:0 0 .28571429rem 0}.ui.eight.steps,.ui.five.steps,.ui.four.steps,.ui.one.steps,.ui.seven.steps,.ui.six.steps,.ui.three.steps,.ui.two.steps{width:100%}.ui.eight.steps>.step,.ui.five.steps>.step,.ui.four.steps>.step,.ui.one.steps>.step,.ui.seven.steps>.step,.ui.six.steps>.step,.ui.three.steps>.step,.ui.two.steps>.step{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.ui.one.steps>.step{width:100%}.ui.two.steps>.step{width:50%}.ui.three.steps>.step{width:33.333%}.ui.four.steps>.step{width:25%}.ui.five.steps>.step{width:20%}.ui.six.steps>.step{width:16.666%}.ui.seven.steps>.step{width:14.285%}.ui.eight.steps>.step{width:12.5%}.ui.step,.ui.steps .step{font-size:1rem}.ui.mini.step,.ui.mini.steps .step{font-size:.78571429rem}.ui.tiny.step,.ui.tiny.steps .step{font-size:.85714286rem}.ui.small.step,.ui.small.steps .step{font-size:.92857143rem}.ui.large.step,.ui.large.steps .step{font-size:1.14285714rem}.ui.big.step,.ui.big.steps .step{font-size:1.28571429rem}.ui.huge.step,.ui.huge.steps .step{font-size:1.42857143rem}.ui.massive.step,.ui.massive.steps .step{font-size:1.71428571rem}.ui.inverted.steps{border:1px solid #555}.ui.inverted.steps .step{color:rgba(255,255,255,.9);background:#1b1c1d;border-color:#555}.ui.inverted.steps .step:after{background-color:#1b1c1d;border-color:#555}.ui.inverted.steps .step .description{color:rgba(255,255,255,.9)}.ui.inverted.steps .step.active,.ui.inverted.steps .step.active:after{background:#333}.ui.inverted.ordered.steps .step.active:before,.ui.inverted.steps .active.step i.icon{color:#fff}.ui.inverted.steps .disabled.step,.ui.inverted.steps .disabled.step:after{background:#222}.ui.inverted.steps .disabled.step,.ui.inverted.steps .disabled.step .description,.ui.inverted.steps .disabled.step .title{color:rgba(225,225,225,.3)}.ui.inverted.steps .link.step:hover,.ui.inverted.steps .link.step:hover::after,.ui.inverted.steps a.step:hover,.ui.inverted.steps a.step:hover::after{background:#3f3f3f;color:#fff}.ui.inverted.steps .link.step:active,.ui.inverted.steps .link.step:active::after,.ui.inverted.steps a.step:active,.ui.inverted.steps a.step:active::after{background:#444;color:#fff}@font-face{font-family:Step;src:url(data:application/x-font-ttf;charset=utf-8;;base64,AAEAAAAOAIAAAwBgT1MvMj3hSQEAAADsAAAAVmNtYXDQEhm3AAABRAAAAUpjdnQgBkn/lAAABuwAAAAcZnBnbYoKeDsAAAcIAAAJkWdhc3AAAAAQAAAG5AAAAAhnbHlm32cEdgAAApAAAAC2aGVhZAErPHsAAANIAAAANmhoZWEHUwNNAAADgAAAACRobXR4CykAAAAAA6QAAAAMbG9jYQA4AFsAAAOwAAAACG1heHAApgm8AAADuAAAACBuYW1lzJ0aHAAAA9gAAALNcG9zdK69QJgAAAaoAAAAO3ByZXCSoZr/AAAQnAAAAFYAAQO4AZAABQAIAnoCvAAAAIwCegK8AAAB4AAxAQIAAAIABQMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUGZFZABA6ADoAQNS/2oAWgMLAE8AAAABAAAAAAAAAAAAAwAAAAMAAAAcAAEAAAAAAEQAAwABAAAAHAAEACgAAAAGAAQAAQACAADoAf//AAAAAOgA//8AABgBAAEAAAAAAAAAAAEGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAADpAKYABUAHEAZDwEAAQFCAAIBAmoAAQABagAAAGEUFxQDEisBFAcBBiInASY0PwE2Mh8BATYyHwEWA6QP/iAQLBD+6g8PTBAsEKQBbhAsEEwPAhYWEP4gDw8BFhAsEEwQEKUBbxAQTBAAAAH//f+xA18DCwAMABJADwABAQpDAAAACwBEFRMCESsBFA4BIi4CPgEyHgEDWXLG6MhuBnq89Lp+AV51xHR0xOrEdHTEAAAAAAEAAAABAADDeRpdXw889QALA+gAAAAAzzWYjQAAAADPNWBN//3/sQOkAwsAAAAIAAIAAAAAAAAAAQAAA1L/agBaA+gAAP/3A6QAAQAAAAAAAAAAAAAAAAAAAAMD6AAAA+gAAANZAAAAAAAAADgAWwABAAAAAwAWAAEAAAAAAAIABgATAG4AAAAtCZEAAAAAAAAAEgDeAAEAAAAAAAAANQAAAAEAAAAAAAEACAA1AAEAAAAAAAIABwA9AAEAAAAAAAMACABEAAEAAAAAAAQACABMAAEAAAAAAAUACwBUAAEAAAAAAAYACABfAAEAAAAAAAoAKwBnAAEAAAAAAAsAEwCSAAMAAQQJAAAAagClAAMAAQQJAAEAEAEPAAMAAQQJAAIADgEfAAMAAQQJAAMAEAEtAAMAAQQJAAQAEAE9AAMAAQQJAAUAFgFNAAMAAQQJAAYAEAFjAAMAAQQJAAoAVgFzAAMAAQQJAAsAJgHJQ29weXJpZ2h0IChDKSAyMDE0IGJ5IG9yaWdpbmFsIGF1dGhvcnMgQCBmb250ZWxsby5jb21mb250ZWxsb1JlZ3VsYXJmb250ZWxsb2ZvbnRlbGxvVmVyc2lvbiAxLjBmb250ZWxsb0dlbmVyYXRlZCBieSBzdmcydHRmIGZyb20gRm9udGVsbG8gcHJvamVjdC5odHRwOi8vZm9udGVsbG8uY29tAEMAbwBwAHkAcgBpAGcAaAB0ACAAKABDACkAIAAyADAAMQA0ACAAYgB5ACAAbwByAGkAZwBpAG4AYQBsACAAYQB1AHQAaABvAHIAcwAgAEAAIABmAG8AbgB0AGUAbABsAG8ALgBjAG8AbQBmAG8AbgB0AGUAbABsAG8AUgBlAGcAdQBsAGEAcgBmAG8AbgB0AGUAbABsAG8AZgBvAG4AdABlAGwAbABvAFYAZQByAHMAaQBvAG4AIAAxAC4AMABmAG8AbgB0AGUAbABsAG8ARwBlAG4AZQByAGEAdABlAGQAIABiAHkAIABzAHYAZwAyAHQAdABmACAAZgByAG8AbQAgAEYAbwBuAHQAZQBsAGwAbwAgAHAAcgBvAGoAZQBjAHQALgBoAHQAdABwADoALwAvAGYAbwBuAHQAZQBsAGwAbwAuAGMAbwBtAAAAAAIAAAAAAAAACgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwAAAQIBAwljaGVja21hcmsGY2lyY2xlAAAAAAEAAf//AA8AAAAAAAAAAAAAAAAAAAAAADIAMgML/7EDC/+xsAAssCBgZi2wASwgZCCwwFCwBCZasARFW1ghIyEbilggsFBQWCGwQFkbILA4UFghsDhZWSCwCkVhZLAoUFghsApFILAwUFghsDBZGyCwwFBYIGYgiophILAKUFhgGyCwIFBYIbAKYBsgsDZQWCGwNmAbYFlZWRuwACtZWSOwAFBYZVlZLbACLCBFILAEJWFkILAFQ1BYsAUjQrAGI0IbISFZsAFgLbADLCMhIyEgZLEFYkIgsAYjQrIKAAIqISCwBkMgiiCKsAArsTAFJYpRWGBQG2FSWVgjWSEgsEBTWLAAKxshsEBZI7AAUFhlWS2wBCywB0MrsgACAENgQi2wBSywByNCIyCwACNCYbCAYrABYLAEKi2wBiwgIEUgsAJFY7ABRWJgRLABYC2wBywgIEUgsAArI7ECBCVgIEWKI2EgZCCwIFBYIbAAG7AwUFiwIBuwQFlZI7AAUFhlWbADJSNhRESwAWAtsAgssQUFRbABYUQtsAkssAFgICCwCUNKsABQWCCwCSNCWbAKQ0qwAFJYILAKI0JZLbAKLCC4BABiILgEAGOKI2GwC0NgIIpgILALI0IjLbALLEtUWLEHAURZJLANZSN4LbAMLEtRWEtTWLEHAURZGyFZJLATZSN4LbANLLEADENVWLEMDEOwAWFCsAorWbAAQ7ACJUKxCQIlQrEKAiVCsAEWIyCwAyVQWLEBAENgsAQlQoqKIIojYbAJKiEjsAFhIIojYbAJKiEbsQEAQ2CwAiVCsAIlYbAJKiFZsAlDR7AKQ0dgsIBiILACRWOwAUViYLEAABMjRLABQ7AAPrIBAQFDYEItsA4ssQAFRVRYALAMI0IgYLABYbUNDQEACwBCQopgsQ0FK7BtKxsiWS2wDyyxAA4rLbAQLLEBDistsBEssQIOKy2wEiyxAw4rLbATLLEEDistsBQssQUOKy2wFSyxBg4rLbAWLLEHDistsBcssQgOKy2wGCyxCQ4rLbAZLLAIK7EABUVUWACwDCNCIGCwAWG1DQ0BAAsAQkKKYLENBSuwbSsbIlktsBossQAZKy2wGyyxARkrLbAcLLECGSstsB0ssQMZKy2wHiyxBBkrLbAfLLEFGSstsCAssQYZKy2wISyxBxkrLbAiLLEIGSstsCMssQkZKy2wJCwgPLABYC2wJSwgYLANYCBDI7ABYEOwAiVhsAFgsCQqIS2wJiywJSuwJSotsCcsICBHICCwAkVjsAFFYmAjYTgjIIpVWCBHICCwAkVjsAFFYmAjYTgbIVktsCgssQAFRVRYALABFrAnKrABFTAbIlktsCkssAgrsQAFRVRYALABFrAnKrABFTAbIlktsCosIDWwAWAtsCssALADRWOwAUVisAArsAJFY7ABRWKwACuwABa0AAAAAABEPiM4sSoBFSotsCwsIDwgRyCwAkVjsAFFYmCwAENhOC2wLSwuFzwtsC4sIDwgRyCwAkVjsAFFYmCwAENhsAFDYzgtsC8ssQIAFiUgLiBHsAAjQrACJUmKikcjRyNhIFhiGyFZsAEjQrIuAQEVFCotsDAssAAWsAQlsAQlRyNHI2GwBkUrZYouIyAgPIo4LbAxLLAAFrAEJbAEJSAuRyNHI2EgsAQjQrAGRSsgsGBQWCCwQFFYswIgAyAbswImAxpZQkIjILAIQyCKI0cjRyNhI0ZgsARDsIBiYCCwACsgiophILACQ2BkI7ADQ2FkUFiwAkNhG7ADQ2BZsAMlsIBiYSMgILAEJiNGYTgbI7AIQ0awAiWwCENHI0cjYWAgsARDsIBiYCMgsAArI7AEQ2CwACuwBSVhsAUlsIBisAQmYSCwBCVgZCOwAyVgZFBYIRsjIVkjICCwBCYjRmE4WS2wMiywABYgICCwBSYgLkcjRyNhIzw4LbAzLLAAFiCwCCNCICAgRiNHsAArI2E4LbA0LLAAFrADJbACJUcjRyNhsABUWC4gPCMhG7ACJbACJUcjRyNhILAFJbAEJUcjRyNhsAYlsAUlSbACJWGwAUVjIyBYYhshWWOwAUViYCMuIyAgPIo4IyFZLbA1LLAAFiCwCEMgLkcjRyNhIGCwIGBmsIBiIyAgPIo4LbA2LCMgLkawAiVGUlggPFkusSYBFCstsDcsIyAuRrACJUZQWCA8WS6xJgEUKy2wOCwjIC5GsAIlRlJYIDxZIyAuRrACJUZQWCA8WS6xJgEUKy2wOSywMCsjIC5GsAIlRlJYIDxZLrEmARQrLbA6LLAxK4ogIDywBCNCijgjIC5GsAIlRlJYIDxZLrEmARQrsARDLrAmKy2wOyywABawBCWwBCYgLkcjRyNhsAZFKyMgPCAuIzixJgEUKy2wPCyxCAQlQrAAFrAEJbAEJSAuRyNHI2EgsAQjQrAGRSsgsGBQWCCwQFFYswIgAyAbswImAxpZQkIjIEewBEOwgGJgILAAKyCKimEgsAJDYGQjsANDYWRQWLACQ2EbsANDYFmwAyWwgGJhsAIlRmE4IyA8IzgbISAgRiNHsAArI2E4IVmxJgEUKy2wPSywMCsusSYBFCstsD4ssDErISMgIDywBCNCIzixJgEUK7AEQy6wJistsD8ssAAVIEewACNCsgABARUUEy6wLCotsEAssAAVIEewACNCsgABARUUEy6wLCotsEEssQABFBOwLSotsEIssC8qLbBDLLAAFkUjIC4gRoojYTixJgEUKy2wRCywCCNCsEMrLbBFLLIAADwrLbBGLLIAATwrLbBHLLIBADwrLbBILLIBATwrLbBJLLIAAD0rLbBKLLIAAT0rLbBLLLIBAD0rLbBMLLIBAT0rLbBNLLIAADkrLbBOLLIAATkrLbBPLLIBADkrLbBQLLIBATkrLbBRLLIAADsrLbBSLLIAATsrLbBTLLIBADsrLbBULLIBATsrLbBVLLIAAD4rLbBWLLIAAT4rLbBXLLIBAD4rLbBYLLIBAT4rLbBZLLIAADorLbBaLLIAATorLbBbLLIBADorLbBcLLIBATorLbBdLLAyKy6xJgEUKy2wXiywMiuwNistsF8ssDIrsDcrLbBgLLAAFrAyK7A4Ky2wYSywMysusSYBFCstsGIssDMrsDYrLbBjLLAzK7A3Ky2wZCywMyuwOCstsGUssDQrLrEmARQrLbBmLLA0K7A2Ky2wZyywNCuwNystsGgssDQrsDgrLbBpLLA1Ky6xJgEUKy2waiywNSuwNistsGsssDUrsDcrLbBsLLA1K7A4Ky2wbSwrsAhlsAMkUHiwARUwLQAAAEu4AMhSWLEBAY5ZuQgACABjILABI0SwAyNwsgQoCUVSRLIKAgcqsQYBRLEkAYhRWLBAiFixBgNEsSYBiFFYuAQAiFixBgFEWVlZWbgB/4WwBI2xBQBEAAA=) format('truetype'),url(data:application/font-woff;charset=utf-8;base64,d09GRgABAAAAAAoUAA4AAAAAEPQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABPUy8yAAABRAAAAEQAAABWPeFJAWNtYXAAAAGIAAAAOgAAAUrQEhm3Y3Z0IAAAAcQAAAAUAAAAHAZJ/5RmcGdtAAAB2AAABPkAAAmRigp4O2dhc3AAAAbUAAAACAAAAAgAAAAQZ2x5ZgAABtwAAACuAAAAtt9nBHZoZWFkAAAHjAAAADUAAAA2ASs8e2hoZWEAAAfEAAAAIAAAACQHUwNNaG10eAAAB+QAAAAMAAAADAspAABsb2NhAAAH8AAAAAgAAAAIADgAW21heHAAAAf4AAAAIAAAACAApgm8bmFtZQAACBgAAAF3AAACzcydGhxwb3N0AAAJkAAAACoAAAA7rr1AmHByZXAAAAm8AAAAVgAAAFaSoZr/eJxjYGTewTiBgZWBg6mKaQ8DA0MPhGZ8wGDIyMTAwMTAysyAFQSkuaYwOLxgeMHIHPQ/iyGKmZvBHyjMCJIDAPe9C2B4nGNgYGBmgGAZBkYGEHAB8hjBfBYGDSDNBqQZGZgYGF4w/v8PUvCCAURLMELVAwEjG8OIBwBk5AavAAB4nGNgQANGDEbM3P83gjAAELQD4XicnVXZdtNWFJU8ZHASOmSgoA7X3DhQ68qEKRgwaSrFdiEdHAitBB2kDHTkncc+62uOQrtWH/m07n09JLR0rbYsls++R1tn2DrnRhwjKn0aiGvUoZKXA6msPZZK90lc13Uvj5UMBnFdthJPSZuonSRKat3sUC7xWOsqWSdYJ+PlIFZPVZ5noAziFB5lSUQbRBuplyZJ4onjJ4kWZxAfJUkgJaMQp9LIUEI1GsRS1aFM6dCr1xNx00DKRqMedVhU90PFJ8c1p9SsA0YqVznCFevVRr4bpwMve5DEOsGzrYcxHnisfpQqkIqR6cg/dkpOlIaBVHHUoVbi6DCTX/eRTCrNQKaMYkWl7oG43f102xYxPXQ6vi5KlUaqurnOKJrt0fGogygP2cbppNzQ2fbw5RlTVKtdcbPtQGYNXErJbHSfRAAdJlLj6QFONZwCqRn1R8XZ588BEslclKo8VTKHegOZMzt7cTHtbiersnCknwcyb3Z2452HQ6dXh3/R+hdM4cxHj+Jifj5C+lBqfiJOJKVGWMzyp4YfcVcgQrkxiAsXyuBThDl0RdrZZl3jtTH2hs/5SqlhPQna6KP4fgr9TiQrHGdRo/VInM1j13Wt3GdQS7W7Fzsyr0OVIu7vCwuuM+eEYZ4WC1VfnvneBTT/Bohn/EDeNIVL+5YpSrRvm6JMu2iKCu0SVKVdNsUU7YoppmnPmmKG9h1TzNKeMzLj/8vc55H7HN7xkJv2XeSmfQ+5ad9HbtoPkJtWITdtHblpLyA3rUZu2lWjOnYEGgZpF1IVQdA0svph3Fab9UDWjDR8aWDyLmLI+upER521tcofxX914gsHcmmip7siF5viLq/bFj483e6rj5pG3bDV+MaR8jAeRnocmtBZ+c3hv+1N3S6a7jKqMugBFUwKwABl7UAC0zrbCaT1mqf48gdgXIZ4zkpDtVSfO4am7+V5X/exOfG+x+3GLrdcd3kJWdYNcmP28N9SZKrrH+UtrVQnR6wrJ49VaxhDKrwour6SlHu0tRu/KKmy8l6U1srnk5CbPYMbQlu27mGwI0xpyiUeXlOlKD3UUo6yQyxvKco84JSLC1qGxLgOdQ9qa8TpoXoYGwshhqG0vRBwSCldFd+0ynfxHqtr2Oj4xRXh6XpyEhGf4ir7UfBU10b96A7avGbdMoMpVaqn+4xPsa/b9lFZaaSOsxe3VAfXNOsaORXTT+Rr4HRvOGjdAz1UfDRBI1U1x+jGKGM0ljXl3wR0MVZ+w2jVYvs93E+dpFWsuUuY7JsT9+C0u/0q+7WcW0bW/dcGvW3kip8jMb8tCvw7B2K3ZA3UO5OBGAvIWdAYxhYmdxiug23EbfY/Jqf/34aFRXJXOxq7eerD1ZNRJXfZ8rjLTXZZ16M2R9VOGvsIjS0PN+bY4XIstsRgQbb+wf8x7gF3aVEC4NDIZZiI2nShnurh6h6rsW04VxIBds2x43QAegAuQd8cu9bzCYD13CPnLsB9cgh2yCH4lByCz8i5BfA5OQRfkEMwIIdgl5w7AA/IIXhIDsEeOQSPyNkE+JIcgq/IIYjJIUjIuQ3wmByCJ+QQfE0OwTdGrk5k/pYH2QD6zqKbQKmdGhzaOGRGrk3Y+zxY9oFFZB9aROqRkesT6lMeLPV7i0j9wSJSfzRyY0L9iQdL/dkiUn+xiNRnxpeZIymvDp7zjg7+BJfqrV4AAAAAAQAB//8AD3icY2BkAALmJUwzGEQZZBwk+RkZGBmdGJgYmbIYgMwsoGSiiLgIs5A2owg7I5uSOqOaiT2jmZE8I5gQY17C/09BQEfg3yt+fh8gvYQxD0j68DOJiQn8U+DnZxQDcQUEljLmCwBpBgbG/3//b2SOZ+Zm4GEQcuAH2sblDLSEm8FFVJhJEGgLH6OSHpMdo5EcI3Nk0bEXJ/LYqvZ82VXHGFd6pKTkyCsQwQAAq+QkqAAAeJxjYGRgYADiw5VSsfH8Nl8ZuJlfAEUYzpvO6IXQCb7///7fyLyEmRvI5WBgAokCAFb/DJAAAAB4nGNgZGBgDvqfxRDF/IKB4f935iUMQBEUwAwAi5YFpgPoAAAD6AAAA1kAAAAAAAAAOABbAAEAAAADABYAAQAAAAAAAgAGABMAbgAAAC0JkQAAAAB4nHWQy2rCQBSG//HSi0JbWui2sypKabxgN4IgWHTTbqS4LTHGJBIzMhkFX6Pv0IfpS/RZ+puMpShNmMx3vjlz5mQAXOMbAvnzxJGzwBmjnAs4Rc9ykf7Zcon8YrmMKt4sn9C/W67gAYHlKm7wwQqidM5ogU/LAlfi0nIBF+LOcpH+0XKJ3LNcxq14tXxC71muYCJSy1Xci6+BWm11FIRG1gZ12W62OnK6lYoqStxYumsTKp3KvpyrxPhxrBxPLfc89oN17Op9uJ8nvk4jlciW09yrkZ/42jX+bFc93QRtY+ZyrtVSDm2GXGm18D3jhMasuo3G3/MwgMIKW2hEvKoQBhI12jrnNppooUOaMkMyM8+KkMBFTONizR1htpIy7nPMGSW0PjNisgOP3+WRH5MC7o9ZRR+tHsYT0u6MKPOSfTns7jBrREqyTDezs9/eU2x4WpvWcNeuS511JTE8qCF5H7u1BY1H72S3Ymi7aPD95/9+AN1fhEsAeJxjYGKAAC4G7ICZgYGRiZGZMzkjNTk7N7Eomy05syg5J5WBAQBE1QZBAABLuADIUlixAQGOWbkIAAgAYyCwASNEsAMjcLIEKAlFUkSyCgIHKrEGAUSxJAGIUViwQIhYsQYDRLEmAYhRWLgEAIhYsQYBRFlZWVm4Af+FsASNsQUARAAA) format('woff')}.ui.ordered.steps .step.completed:before,.ui.steps .step.completed>.icon:before{font-family:Step;content:'\e800'}
\ No newline at end of file
diff --git a/public/dist/components/sticky.css b/public/dist/components/sticky.css
new file mode 100644
index 000000000..a6a2a1159
--- /dev/null
+++ b/public/dist/components/sticky.css
@@ -0,0 +1,77 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Sticky
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+
+/*******************************
+ Sticky
+*******************************/
+
+.ui.sticky {
+ position: static;
+ -webkit-transition: none;
+ transition: none;
+ z-index: 800;
+}
+
+
+/*******************************
+ States
+*******************************/
+
+
+/* Bound */
+.ui.sticky.bound {
+ position: absolute;
+ left: auto;
+ right: auto;
+}
+
+/* Fixed */
+.ui.sticky.fixed {
+ position: fixed;
+ left: auto;
+ right: auto;
+}
+
+/* Bound/Fixed Position */
+.ui.sticky.bound.top,
+.ui.sticky.fixed.top {
+ top: 0;
+ bottom: auto;
+}
+.ui.sticky.bound.bottom,
+.ui.sticky.fixed.bottom {
+ top: auto;
+ bottom: 0;
+}
+
+
+/*******************************
+ Types
+*******************************/
+
+.ui.native.sticky {
+ position: -moz-sticky;
+ position: -ms-sticky;
+ position: -o-sticky;
+ position: sticky;
+}
+
+
+/*******************************
+ Theme Overrides
+*******************************/
+
+
+
+/*******************************
+ Site Overrides
+*******************************/
+
diff --git a/public/dist/components/sticky.js b/public/dist/components/sticky.js
new file mode 100644
index 000000000..05cda954b
--- /dev/null
+++ b/public/dist/components/sticky.js
@@ -0,0 +1,957 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Sticky
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+'use strict';
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.sticky = function(parameters) {
+ var
+ $allModules = $(this),
+ moduleSelector = $allModules.selector || '',
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+ returnedValue
+ ;
+
+ $allModules
+ .each(function() {
+ var
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.fn.sticky.settings, parameters)
+ : $.extend({}, $.fn.sticky.settings),
+
+ className = settings.className,
+ namespace = settings.namespace,
+ error = settings.error,
+
+ eventNamespace = '.' + namespace,
+ moduleNamespace = 'module-' + namespace,
+
+ $module = $(this),
+ $window = $(window),
+ $scroll = $(settings.scrollContext),
+ $container,
+ $context,
+
+ instance = $module.data(moduleNamespace),
+
+ requestAnimationFrame = window.requestAnimationFrame
+ || window.mozRequestAnimationFrame
+ || window.webkitRequestAnimationFrame
+ || window.msRequestAnimationFrame
+ || function(callback) { setTimeout(callback, 0); },
+
+ element = this,
+
+ documentObserver,
+ observer,
+ module
+ ;
+
+ module = {
+
+ initialize: function() {
+
+ module.determineContainer();
+ module.determineContext();
+ module.verbose('Initializing sticky', settings, $container);
+
+ module.save.positions();
+ module.checkErrors();
+ module.bind.events();
+
+ if(settings.observeChanges) {
+ module.observeChanges();
+ }
+ module.instantiate();
+ },
+
+ instantiate: function() {
+ module.verbose('Storing instance of module', module);
+ instance = module;
+ $module
+ .data(moduleNamespace, module)
+ ;
+ },
+
+ destroy: function() {
+ module.verbose('Destroying previous instance');
+ module.reset();
+ if(documentObserver) {
+ documentObserver.disconnect();
+ }
+ if(observer) {
+ observer.disconnect();
+ }
+ $window
+ .off('load' + eventNamespace, module.event.load)
+ .off('resize' + eventNamespace, module.event.resize)
+ ;
+ $scroll
+ .off('scrollchange' + eventNamespace, module.event.scrollchange)
+ ;
+ $module.removeData(moduleNamespace);
+ },
+
+ observeChanges: function() {
+ if('MutationObserver' in window) {
+ documentObserver = new MutationObserver(module.event.documentChanged);
+ observer = new MutationObserver(module.event.changed);
+ documentObserver.observe(document, {
+ childList : true,
+ subtree : true
+ });
+ observer.observe(element, {
+ childList : true,
+ subtree : true
+ });
+ observer.observe($context[0], {
+ childList : true,
+ subtree : true
+ });
+ module.debug('Setting up mutation observer', observer);
+ }
+ },
+
+ determineContainer: function() {
+ if(settings.container) {
+ $container = $(settings.container);
+ }
+ else {
+ $container = $module.offsetParent();
+ }
+ },
+
+ determineContext: function() {
+ if(settings.context) {
+ $context = $(settings.context);
+ }
+ else {
+ $context = $container;
+ }
+ if($context.length === 0) {
+ module.error(error.invalidContext, settings.context, $module);
+ return;
+ }
+ },
+
+ checkErrors: function() {
+ if( module.is.hidden() ) {
+ module.error(error.visible, $module);
+ }
+ if(module.cache.element.height > module.cache.context.height) {
+ module.reset();
+ module.error(error.elementSize, $module);
+ return;
+ }
+ },
+
+ bind: {
+ events: function() {
+ $window
+ .on('load' + eventNamespace, module.event.load)
+ .on('resize' + eventNamespace, module.event.resize)
+ ;
+ // pub/sub pattern
+ $scroll
+ .off('scroll' + eventNamespace)
+ .on('scroll' + eventNamespace, module.event.scroll)
+ .on('scrollchange' + eventNamespace, module.event.scrollchange)
+ ;
+ }
+ },
+
+ event: {
+ changed: function(mutations) {
+ clearTimeout(module.timer);
+ module.timer = setTimeout(function() {
+ module.verbose('DOM tree modified, updating sticky menu', mutations);
+ module.refresh();
+ }, 100);
+ },
+ documentChanged: function(mutations) {
+ [].forEach.call(mutations, function(mutation) {
+ if(mutation.removedNodes) {
+ [].forEach.call(mutation.removedNodes, function(node) {
+ if(node == element || $(node).find(element).length > 0) {
+ module.debug('Element removed from DOM, tearing down events');
+ module.destroy();
+ }
+ });
+ }
+ });
+ },
+ load: function() {
+ module.verbose('Page contents finished loading');
+ requestAnimationFrame(module.refresh);
+ },
+ resize: function() {
+ module.verbose('Window resized');
+ requestAnimationFrame(module.refresh);
+ },
+ scroll: function() {
+ requestAnimationFrame(function() {
+ $scroll.triggerHandler('scrollchange' + eventNamespace, $scroll.scrollTop() );
+ });
+ },
+ scrollchange: function(event, scrollPosition) {
+ module.stick(scrollPosition);
+ settings.onScroll.call(element);
+ }
+ },
+
+ refresh: function(hardRefresh) {
+ module.reset();
+ if(!settings.context) {
+ module.determineContext();
+ }
+ if(hardRefresh) {
+ module.determineContainer();
+ }
+ module.save.positions();
+ module.stick();
+ settings.onReposition.call(element);
+ },
+
+ supports: {
+ sticky: function() {
+ var
+ $element = $('
')
+ ;
+ $element.addClass(className.supported);
+ return($element.css('position').match('sticky'));
+ }
+ },
+
+ save: {
+ lastScroll: function(scroll) {
+ module.lastScroll = scroll;
+ },
+ elementScroll: function(scroll) {
+ module.elementScroll = scroll;
+ },
+ positions: function() {
+ var
+ scrollContext = {
+ height : $scroll.height()
+ },
+ element = {
+ margin: {
+ top : parseInt($module.css('margin-top'), 10),
+ bottom : parseInt($module.css('margin-bottom'), 10),
+ },
+ offset : $module.offset(),
+ width : $module.outerWidth(),
+ height : $module.outerHeight()
+ },
+ context = {
+ offset : $context.offset(),
+ height : $context.outerHeight()
+ }
+ ;
+ if( !module.is.standardScroll() ) {
+ module.debug('Non-standard scroll. Removing scroll offset from element offset');
+
+ scrollContext.top = $scroll.scrollTop();
+ scrollContext.left = $scroll.scrollLeft();
+
+ element.offset.top += scrollContext.top;
+ context.offset.top += scrollContext.top;
+ element.offset.left += scrollContext.left;
+ context.offset.left += scrollContext.left;
+ }
+ module.cache = {
+ fits : ( (element.height + settings.offset) <= scrollContext.height),
+ sameHeight : (element.height == context.height),
+ scrollContext : {
+ height : scrollContext.height
+ },
+ element: {
+ margin : element.margin,
+ top : element.offset.top - element.margin.top,
+ left : element.offset.left,
+ width : element.width,
+ height : element.height,
+ bottom : element.offset.top + element.height
+ },
+ context: {
+ top : context.offset.top,
+ height : context.height,
+ bottom : context.offset.top + context.height
+ }
+ };
+ module.set.containerSize();
+
+ module.stick();
+ module.debug('Caching element positions', module.cache);
+ }
+ },
+
+ get: {
+ direction: function(scroll) {
+ var
+ direction = 'down'
+ ;
+ scroll = scroll || $scroll.scrollTop();
+ if(module.lastScroll !== undefined) {
+ if(module.lastScroll < scroll) {
+ direction = 'down';
+ }
+ else if(module.lastScroll > scroll) {
+ direction = 'up';
+ }
+ }
+ return direction;
+ },
+ scrollChange: function(scroll) {
+ scroll = scroll || $scroll.scrollTop();
+ return (module.lastScroll)
+ ? (scroll - module.lastScroll)
+ : 0
+ ;
+ },
+ currentElementScroll: function() {
+ if(module.elementScroll) {
+ return module.elementScroll;
+ }
+ return ( module.is.top() )
+ ? Math.abs(parseInt($module.css('top'), 10)) || 0
+ : Math.abs(parseInt($module.css('bottom'), 10)) || 0
+ ;
+ },
+
+ elementScroll: function(scroll) {
+ scroll = scroll || $scroll.scrollTop();
+ var
+ element = module.cache.element,
+ scrollContext = module.cache.scrollContext,
+ delta = module.get.scrollChange(scroll),
+ maxScroll = (element.height - scrollContext.height + settings.offset),
+ elementScroll = module.get.currentElementScroll(),
+ possibleScroll = (elementScroll + delta)
+ ;
+ if(module.cache.fits || possibleScroll < 0) {
+ elementScroll = 0;
+ }
+ else if(possibleScroll > maxScroll ) {
+ elementScroll = maxScroll;
+ }
+ else {
+ elementScroll = possibleScroll;
+ }
+ return elementScroll;
+ }
+ },
+
+ remove: {
+ lastScroll: function() {
+ delete module.lastScroll;
+ },
+ elementScroll: function(scroll) {
+ delete module.elementScroll;
+ },
+ minimumSize: function() {
+ $container
+ .css('min-height', '')
+ ;
+ },
+ offset: function() {
+ $module.css('margin-top', '');
+ }
+ },
+
+ set: {
+ offset: function() {
+ module.verbose('Setting offset on element', settings.offset);
+ $module
+ .css('margin-top', settings.offset)
+ ;
+ },
+ containerSize: function() {
+ var
+ tagName = $container.get(0).tagName
+ ;
+ if(tagName === 'HTML' || tagName == 'body') {
+ // this can trigger for too many reasons
+ //module.error(error.container, tagName, $module);
+ module.determineContainer();
+ }
+ else {
+ if( Math.abs($container.outerHeight() - module.cache.context.height) > settings.jitter) {
+ module.debug('Context has padding, specifying exact height for container', module.cache.context.height);
+ $container.css({
+ height: module.cache.context.height
+ });
+ }
+ }
+ },
+ minimumSize: function() {
+ var
+ element = module.cache.element
+ ;
+ $container
+ .css('min-height', element.height)
+ ;
+ },
+ scroll: function(scroll) {
+ module.debug('Setting scroll on element', scroll);
+ if(module.elementScroll == scroll) {
+ return;
+ }
+ if( module.is.top() ) {
+ $module
+ .css('bottom', '')
+ .css('top', -scroll)
+ ;
+ }
+ if( module.is.bottom() ) {
+ $module
+ .css('top', '')
+ .css('bottom', scroll)
+ ;
+ }
+ },
+ size: function() {
+ if(module.cache.element.height !== 0 && module.cache.element.width !== 0) {
+ element.style.setProperty('width', module.cache.element.width + 'px', 'important');
+ element.style.setProperty('height', module.cache.element.height + 'px', 'important');
+ }
+ }
+ },
+
+ is: {
+ standardScroll: function() {
+ return ($scroll[0] == window);
+ },
+ top: function() {
+ return $module.hasClass(className.top);
+ },
+ bottom: function() {
+ return $module.hasClass(className.bottom);
+ },
+ initialPosition: function() {
+ return (!module.is.fixed() && !module.is.bound());
+ },
+ hidden: function() {
+ return (!$module.is(':visible'));
+ },
+ bound: function() {
+ return $module.hasClass(className.bound);
+ },
+ fixed: function() {
+ return $module.hasClass(className.fixed);
+ }
+ },
+
+ stick: function(scroll) {
+ var
+ cachedPosition = scroll || $scroll.scrollTop(),
+ cache = module.cache,
+ fits = cache.fits,
+ sameHeight = cache.sameHeight,
+ element = cache.element,
+ scrollContext = cache.scrollContext,
+ context = cache.context,
+ offset = (module.is.bottom() && settings.pushing)
+ ? settings.bottomOffset
+ : settings.offset,
+ scroll = {
+ top : cachedPosition + offset,
+ bottom : cachedPosition + offset + scrollContext.height
+ },
+ elementScroll = (fits)
+ ? 0
+ : module.get.elementScroll(scroll.top),
+
+ // shorthand
+ doesntFit = !fits,
+ elementVisible = (element.height !== 0)
+ ;
+ if(elementVisible && !sameHeight) {
+
+ if( module.is.initialPosition() ) {
+ if(scroll.top >= context.bottom) {
+ module.debug('Initial element position is bottom of container');
+ module.bindBottom();
+ }
+ else if(scroll.top > element.top) {
+ if( (element.height + scroll.top - elementScroll) >= context.bottom ) {
+ module.debug('Initial element position is bottom of container');
+ module.bindBottom();
+ }
+ else {
+ module.debug('Initial element position is fixed');
+ module.fixTop();
+ }
+ }
+
+ }
+ else if( module.is.fixed() ) {
+
+ // currently fixed top
+ if( module.is.top() ) {
+ if( scroll.top <= element.top ) {
+ module.debug('Fixed element reached top of container');
+ module.setInitialPosition();
+ }
+ else if( (element.height + scroll.top - elementScroll) >= context.bottom ) {
+ module.debug('Fixed element reached bottom of container');
+ module.bindBottom();
+ }
+ // scroll element if larger than screen
+ else if(doesntFit) {
+ module.set.scroll(elementScroll);
+ module.save.lastScroll(scroll.top);
+ module.save.elementScroll(elementScroll);
+ }
+ }
+
+ // currently fixed bottom
+ else if(module.is.bottom() ) {
+
+ // top edge
+ if( (scroll.bottom - element.height) <= element.top) {
+ module.debug('Bottom fixed rail has reached top of container');
+ module.setInitialPosition();
+ }
+ // bottom edge
+ else if(scroll.bottom >= context.bottom) {
+ module.debug('Bottom fixed rail has reached bottom of container');
+ module.bindBottom();
+ }
+ // scroll element if larger than screen
+ else if(doesntFit) {
+ module.set.scroll(elementScroll);
+ module.save.lastScroll(scroll.top);
+ module.save.elementScroll(elementScroll);
+ }
+
+ }
+ }
+ else if( module.is.bottom() ) {
+ if( scroll.top <= element.top ) {
+ module.debug('Jumped from bottom fixed to top fixed, most likely used home/end button');
+ module.setInitialPosition();
+ }
+ else {
+ if(settings.pushing) {
+ if(module.is.bound() && scroll.bottom <= context.bottom ) {
+ module.debug('Fixing bottom attached element to bottom of browser.');
+ module.fixBottom();
+ }
+ }
+ else {
+ if(module.is.bound() && (scroll.top <= context.bottom - element.height) ) {
+ module.debug('Fixing bottom attached element to top of browser.');
+ module.fixTop();
+ }
+ }
+ }
+ }
+ }
+ },
+
+ bindTop: function() {
+ module.debug('Binding element to top of parent container');
+ module.remove.offset();
+ $module
+ .css({
+ left : '',
+ top : '',
+ marginBottom : ''
+ })
+ .removeClass(className.fixed)
+ .removeClass(className.bottom)
+ .addClass(className.bound)
+ .addClass(className.top)
+ ;
+ settings.onTop.call(element);
+ settings.onUnstick.call(element);
+ },
+ bindBottom: function() {
+ module.debug('Binding element to bottom of parent container');
+ module.remove.offset();
+ $module
+ .css({
+ left : '',
+ top : ''
+ })
+ .removeClass(className.fixed)
+ .removeClass(className.top)
+ .addClass(className.bound)
+ .addClass(className.bottom)
+ ;
+ settings.onBottom.call(element);
+ settings.onUnstick.call(element);
+ },
+
+ setInitialPosition: function() {
+ module.debug('Returning to initial position');
+ module.unfix();
+ module.unbind();
+ },
+
+
+ fixTop: function() {
+ module.debug('Fixing element to top of page');
+ if(settings.setSize) {
+ module.set.size();
+ }
+ module.set.minimumSize();
+ module.set.offset();
+ $module
+ .css({
+ left : module.cache.element.left,
+ bottom : '',
+ marginBottom : ''
+ })
+ .removeClass(className.bound)
+ .removeClass(className.bottom)
+ .addClass(className.fixed)
+ .addClass(className.top)
+ ;
+ settings.onStick.call(element);
+ },
+
+ fixBottom: function() {
+ module.debug('Sticking element to bottom of page');
+ if(settings.setSize) {
+ module.set.size();
+ }
+ module.set.minimumSize();
+ module.set.offset();
+ $module
+ .css({
+ left : module.cache.element.left,
+ bottom : '',
+ marginBottom : ''
+ })
+ .removeClass(className.bound)
+ .removeClass(className.top)
+ .addClass(className.fixed)
+ .addClass(className.bottom)
+ ;
+ settings.onStick.call(element);
+ },
+
+ unbind: function() {
+ if( module.is.bound() ) {
+ module.debug('Removing container bound position on element');
+ module.remove.offset();
+ $module
+ .removeClass(className.bound)
+ .removeClass(className.top)
+ .removeClass(className.bottom)
+ ;
+ }
+ },
+
+ unfix: function() {
+ if( module.is.fixed() ) {
+ module.debug('Removing fixed position on element');
+ module.remove.minimumSize();
+ module.remove.offset();
+ $module
+ .removeClass(className.fixed)
+ .removeClass(className.top)
+ .removeClass(className.bottom)
+ ;
+ settings.onUnstick.call(element);
+ }
+ },
+
+ reset: function() {
+ module.debug('Resetting elements position');
+ module.unbind();
+ module.unfix();
+ module.resetCSS();
+ module.remove.offset();
+ module.remove.lastScroll();
+ },
+
+ resetCSS: function() {
+ $module
+ .css({
+ width : '',
+ height : ''
+ })
+ ;
+ $container
+ .css({
+ height: ''
+ })
+ ;
+ },
+
+ setting: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ settings[name] = value;
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 0);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ }
+ })
+ ;
+
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.fn.sticky.settings = {
+
+ name : 'Sticky',
+ namespace : 'sticky',
+
+ silent : false,
+ debug : false,
+ verbose : true,
+ performance : true,
+
+ // whether to stick in the opposite direction on scroll up
+ pushing : false,
+
+ context : false,
+ container : false,
+
+ // Context to watch scroll events
+ scrollContext : window,
+
+ // Offset to adjust scroll
+ offset : 0,
+
+ // Offset to adjust scroll when attached to bottom of screen
+ bottomOffset : 0,
+
+ // will only set container height if difference between context and container is larger than this number
+ jitter : 5,
+
+ // set width of sticky element when it is fixed to page (used to make sure 100% width is maintained if no fixed size set)
+ setSize : true,
+
+ // Whether to automatically observe changes with Mutation Observers
+ observeChanges : false,
+
+ // Called when position is recalculated
+ onReposition : function(){},
+
+ // Called on each scroll
+ onScroll : function(){},
+
+ // Called when element is stuck to viewport
+ onStick : function(){},
+
+ // Called when element is unstuck from viewport
+ onUnstick : function(){},
+
+ // Called when element reaches top of context
+ onTop : function(){},
+
+ // Called when element reaches bottom of context
+ onBottom : function(){},
+
+ error : {
+ container : 'Sticky element must be inside a relative container',
+ visible : 'Element is hidden, you must call refresh after element becomes visible. Use silent setting to surpress this warning in production.',
+ method : 'The method you called is not defined.',
+ invalidContext : 'Context specified does not exist',
+ elementSize : 'Sticky element is larger than its container, cannot create sticky.'
+ },
+
+ className : {
+ bound : 'bound',
+ fixed : 'fixed',
+ supported : 'native',
+ top : 'top',
+ bottom : 'bottom'
+ }
+
+};
+
+})( jQuery, window, document );
diff --git a/public/dist/components/sticky.min.css b/public/dist/components/sticky.min.css
new file mode 100644
index 000000000..e3ae39ecc
--- /dev/null
+++ b/public/dist/components/sticky.min.css
@@ -0,0 +1,9 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Sticky
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */.ui.sticky{position:static;-webkit-transition:none;transition:none;z-index:800}.ui.sticky.bound{position:absolute;left:auto;right:auto}.ui.sticky.fixed{position:fixed;left:auto;right:auto}.ui.sticky.bound.top,.ui.sticky.fixed.top{top:0;bottom:auto}.ui.sticky.bound.bottom,.ui.sticky.fixed.bottom{top:auto;bottom:0}.ui.native.sticky{position:-moz-sticky;position:-ms-sticky;position:-o-sticky;position:sticky}
\ No newline at end of file
diff --git a/public/dist/components/sticky.min.js b/public/dist/components/sticky.min.js
new file mode 100644
index 000000000..bfa7d0a51
--- /dev/null
+++ b/public/dist/components/sticky.min.js
@@ -0,0 +1,11 @@
+/*
+ * # Fomantic UI - 2.8.8
+ * https://github.com/fomantic/Fomantic-UI
+ * http://fomantic-ui.com/
+ *
+ * Copyright 2021 Contributors
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+!function(T,w,B,F){"use strict";T.isFunction=T.isFunction||function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},w=void 0!==w&&w.Math==Math?w:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),T.fn.sticky=function(b){var v,e=T(this),x=e.selector||"",C=(new Date).getTime(),S=[],y=b,k="string"==typeof y,z=[].slice.call(arguments,1);return e.each(function(){var t,n,e,o,m,u=T.isPlainObject(b)?T.extend(!0,{},T.fn.sticky.settings,b):T.extend({},T.fn.sticky.settings),i=u.className,s=u.namespace,r=u.error,c="."+s,l="module-"+s,a=T(this),f=T(w),d=T(u.scrollContext),h=a.data(l),g=w.requestAnimationFrame||w.mozRequestAnimationFrame||w.webkitRequestAnimationFrame||w.msRequestAnimationFrame||function(e){setTimeout(e,0)},p=this;m={initialize:function(){m.determineContainer(),m.determineContext(),m.verbose("Initializing sticky",u,t),m.save.positions(),m.checkErrors(),m.bind.events(),u.observeChanges&&m.observeChanges(),m.instantiate()},instantiate:function(){m.verbose("Storing instance of module",m),h=m,a.data(l,m)},destroy:function(){m.verbose("Destroying previous instance"),m.reset(),e&&e.disconnect(),o&&o.disconnect(),f.off("load"+c,m.event.load).off("resize"+c,m.event.resize),d.off("scrollchange"+c,m.event.scrollchange),a.removeData(l)},observeChanges:function(){"MutationObserver"in w&&(e=new MutationObserver(m.event.documentChanged),o=new MutationObserver(m.event.changed),e.observe(B,{childList:!0,subtree:!0}),o.observe(p,{childList:!0,subtree:!0}),o.observe(n[0],{childList:!0,subtree:!0}),m.debug("Setting up mutation observer",o))},determineContainer:function(){t=u.container?T(u.container):a.offsetParent()},determineContext:function(){0!==(n=u.context?T(u.context):t).length||m.error(r.invalidContext,u.context,a)},checkErrors:function(){if(m.is.hidden()&&m.error(r.visible,a),m.cache.element.height>m.cache.context.height)return m.reset(),void m.error(r.elementSize,a)},bind:{events:function(){f.on("load"+c,m.event.load).on("resize"+c,m.event.resize),d.off("scroll"+c).on("scroll"+c,m.event.scroll).on("scrollchange"+c,m.event.scrollchange)}},event:{changed:function(e){clearTimeout(m.timer),m.timer=setTimeout(function(){m.verbose("DOM tree modified, updating sticky menu",e),m.refresh()},100)},documentChanged:function(e){[].forEach.call(e,function(e){e.removedNodes&&[].forEach.call(e.removedNodes,function(e){(e==p||0");return e.addClass(i.supported),e.css("position").match("sticky")}},save:{lastScroll:function(e){m.lastScroll=e},elementScroll:function(e){m.elementScroll=e},positions:function(){var e={height:d.height()},t={margin:{top:parseInt(a.css("margin-top"),10),bottom:parseInt(a.css("margin-bottom"),10)},offset:a.offset(),width:a.outerWidth(),height:a.outerHeight()},o={offset:n.offset(),height:n.outerHeight()};m.is.standardScroll()||(m.debug("Non-standard scroll. Removing scroll offset from element offset"),e.top=d.scrollTop(),e.left=d.scrollLeft(),t.offset.top+=e.top,o.offset.top+=e.top,t.offset.left+=e.left,o.offset.left+=e.left),m.cache={fits:t.height+u.offset<=e.height,sameHeight:t.height==o.height,scrollContext:{height:e.height},element:{margin:t.margin,top:t.offset.top-t.margin.top,left:t.offset.left,width:t.width,height:t.height,bottom:t.offset.top+t.height},context:{top:o.offset.top,height:o.height,bottom:o.offset.top+o.height}},m.set.containerSize(),m.stick(),m.debug("Caching element positions",m.cache)}},get:{direction:function(e){var t="down";return e=e||d.scrollTop(),m.lastScroll!==F&&(m.lastScrolle&&(t="up")),t},scrollChange:function(e){return e=e||d.scrollTop(),m.lastScroll?e-m.lastScroll:0},currentElementScroll:function(){return m.elementScroll?m.elementScroll:m.is.top()?Math.abs(parseInt(a.css("top"),10))||0:Math.abs(parseInt(a.css("bottom"),10))||0},elementScroll:function(e){e=e||d.scrollTop();var t=m.cache.element,o=m.cache.scrollContext,n=m.get.scrollChange(e),i=t.height-o.height+u.offset,s=m.get.currentElementScroll(),r=s+n;return s=m.cache.fits||r<0?0:iu.jitter&&(m.debug("Context has padding, specifying exact height for container",m.cache.context.height),t.css({height:m.cache.context.height}))},minimumSize:function(){var e=m.cache.element;t.css("min-height",e.height)},scroll:function(e){m.debug("Setting scroll on element",e),m.elementScroll!=e&&(m.is.top()&&a.css("bottom","").css("top",-e),m.is.bottom()&&a.css("top","").css("bottom",e))},size:function(){0!==m.cache.element.height&&0!==m.cache.element.width&&(p.style.setProperty("width",m.cache.element.width+"px","important"),p.style.setProperty("height",m.cache.element.height+"px","important"))}},is:{standardScroll:function(){return d[0]==w},top:function(){return a.hasClass(i.top)},bottom:function(){return a.hasClass(i.bottom)},initialPosition:function(){return!m.is.fixed()&&!m.is.bound()},hidden:function(){return!a.is(":visible")},bound:function(){return a.hasClass(i.bound)},fixed:function(){return a.hasClass(i.fixed)}},stick:function(e){var t=e||d.scrollTop(),o=m.cache,n=o.fits,i=o.sameHeight,s=o.element,r=o.scrollContext,c=o.context,l=m.is.bottom()&&u.pushing?u.bottomOffset:u.offset,a=(e={top:t+l,bottom:t+l+r.height},n?0:m.get.elementScroll(e.top)),f=!n;0===s.height||i||(m.is.initialPosition()?e.top>=c.bottom?(m.debug("Initial element position is bottom of container"),m.bindBottom()):e.top>s.top&&(s.height+e.top-a>=c.bottom?(m.debug("Initial element position is bottom of container"),m.bindBottom()):(m.debug("Initial element position is fixed"),m.fixTop())):m.is.fixed()?m.is.top()?e.top<=s.top?(m.debug("Fixed element reached top of container"),m.setInitialPosition()):s.height+e.top-a>=c.bottom?(m.debug("Fixed element reached bottom of container"),m.bindBottom()):f&&(m.set.scroll(a),m.save.lastScroll(e.top),m.save.elementScroll(a)):m.is.bottom()&&(e.bottom-s.height<=s.top?(m.debug("Bottom fixed rail has reached top of container"),m.setInitialPosition()):e.bottom>=c.bottom?(m.debug("Bottom fixed rail has reached bottom of container"),m.bindBottom()):f&&(m.set.scroll(a),m.save.lastScroll(e.top),m.save.elementScroll(a))):m.is.bottom()&&(e.top<=s.top?(m.debug("Jumped from bottom fixed to top fixed, most likely used home/end button"),m.setInitialPosition()):u.pushing?m.is.bound()&&e.bottom<=c.bottom&&(m.debug("Fixing bottom attached element to bottom of browser."),m.fixBottom()):m.is.bound()&&e.top<=c.bottom-s.height&&(m.debug("Fixing bottom attached element to top of browser."),m.fixTop())))},bindTop:function(){m.debug("Binding element to top of parent container"),m.remove.offset(),a.css({left:"",top:"",marginBottom:""}).removeClass(i.fixed).removeClass(i.bottom).addClass(i.bound).addClass(i.top),u.onTop.call(p),u.onUnstick.call(p)},bindBottom:function(){m.debug("Binding element to bottom of parent container"),m.remove.offset(),a.css({left:"",top:""}).removeClass(i.fixed).removeClass(i.top).addClass(i.bound).addClass(i.bottom),u.onBottom.call(p),u.onUnstick.call(p)},setInitialPosition:function(){m.debug("Returning to initial position"),m.unfix(),m.unbind()},fixTop:function(){m.debug("Fixing element to top of page"),u.setSize&&m.set.size(),m.set.minimumSize(),m.set.offset(),a.css({left:m.cache.element.left,bottom:"",marginBottom:""}).removeClass(i.bound).removeClass(i.bottom).addClass(i.fixed).addClass(i.top),u.onStick.call(p)},fixBottom:function(){m.debug("Sticking element to bottom of page"),u.setSize&&m.set.size(),m.set.minimumSize(),m.set.offset(),a.css({left:m.cache.element.left,bottom:"",marginBottom:""}).removeClass(i.bound).removeClass(i.top).addClass(i.fixed).addClass(i.bottom),u.onStick.call(p)},unbind:function(){m.is.bound()&&(m.debug("Removing container bound position on element"),m.remove.offset(),a.removeClass(i.bound).removeClass(i.top).removeClass(i.bottom))},unfix:function(){m.is.fixed()&&(m.debug("Removing fixed position on element"),m.remove.minimumSize(),m.remove.offset(),a.removeClass(i.fixed).removeClass(i.top).removeClass(i.bottom),u.onUnstick.call(p))},reset:function(){m.debug("Resetting elements position"),m.unbind(),m.unfix(),m.resetCSS(),m.remove.offset(),m.remove.lastScroll()},resetCSS:function(){a.css({width:"",height:""}),t.css({height:""})},setting:function(e,t){if(T.isPlainObject(e))T.extend(!0,u,e);else{if(t===F)return u[e];u[e]=t}},internal:function(e,t){if(T.isPlainObject(e))T.extend(!0,m,e);else{if(t===F)return m[e];m[e]=t}},debug:function(){!u.silent&&u.debug&&(u.performance?m.performance.log(arguments):(m.debug=Function.prototype.bind.call(console.info,console,u.name+":"),m.debug.apply(console,arguments)))},verbose:function(){!u.silent&&u.verbose&&u.debug&&(u.performance?m.performance.log(arguments):(m.verbose=Function.prototype.bind.call(console.info,console,u.name+":"),m.verbose.apply(console,arguments)))},error:function(){u.silent||(m.error=Function.prototype.bind.call(console.error,console,u.name+":"),m.error.apply(console,arguments))},performance:{log:function(e){var t,o;u.performance&&(o=(t=(new Date).getTime())-(C||t),C=t,S.push({Name:e[0],Arguments:[].slice.call(e,1)||"",Element:p,"Execution Time":o})),clearTimeout(m.performance.timer),m.performance.timer=setTimeout(m.performance.display,0)},display:function(){var e=u.name+":",o=0;C=!1,clearTimeout(m.performance.timer),T.each(S,function(e,t){o+=t["Execution Time"]}),e+=" "+o+"ms",x&&(e+=" '"+x+"'"),(console.group!==F||console.table!==F)&&0 0) {
+ $reference = $module.closest(selector.ui);
+ module.verbose('Using closest UI element as parent', $reference);
+ }
+ else {
+ $reference = $module;
+ }
+ $context = $reference.parent();
+ module.verbose('Determined parent element for creating context', $context);
+ }
+ else if(settings.context) {
+ $context = $(settings.context);
+ module.verbose('Using selector for tab context', settings.context, $context);
+ }
+ else {
+ $context = $('body');
+ }
+ // find tabs
+ if(settings.childrenOnly) {
+ $tabs = $context.children(selector.tabs);
+ module.debug('Searching tab context children for tabs', $context, $tabs);
+ }
+ else {
+ $tabs = $context.find(selector.tabs);
+ module.debug('Searching tab context for tabs', $context, $tabs);
+ }
+ },
+
+ fix: {
+ callbacks: function() {
+ if( $.isPlainObject(parameters) && (parameters.onTabLoad || parameters.onTabInit) ) {
+ if(parameters.onTabLoad) {
+ parameters.onLoad = parameters.onTabLoad;
+ delete parameters.onTabLoad;
+ module.error(error.legacyLoad, parameters.onLoad);
+ }
+ if(parameters.onTabInit) {
+ parameters.onFirstLoad = parameters.onTabInit;
+ delete parameters.onTabInit;
+ module.error(error.legacyInit, parameters.onFirstLoad);
+ }
+ settings = $.extend(true, {}, $.fn.tab.settings, parameters);
+ }
+ }
+ },
+
+ initializeHistory: function() {
+ module.debug('Initializing page state');
+ if( $.address === undefined ) {
+ module.error(error.state);
+ return false;
+ }
+ else {
+ if(settings.historyType == 'state') {
+ module.debug('Using HTML5 to manage state');
+ if(settings.path !== false) {
+ $.address
+ .history(true)
+ .state(settings.path)
+ ;
+ }
+ else {
+ module.error(error.path);
+ return false;
+ }
+ }
+ $.address
+ .bind('change', module.event.history.change)
+ ;
+ }
+ },
+
+ event: {
+ click: function(event) {
+ var
+ tabPath = $(this).data(metadata.tab)
+ ;
+ if(tabPath !== undefined) {
+ if(settings.history) {
+ module.verbose('Updating page state', event);
+ $.address.value(tabPath);
+ }
+ else {
+ module.verbose('Changing tab', event);
+ module.changeTab(tabPath);
+ }
+ event.preventDefault();
+ }
+ else {
+ module.debug('No tab specified');
+ }
+ },
+ history: {
+ change: function(event) {
+ var
+ tabPath = event.pathNames.join('/') || module.get.initialPath(),
+ pageTitle = settings.templates.determineTitle(tabPath) || false
+ ;
+ module.performance.display();
+ module.debug('History change event', tabPath, event);
+ historyEvent = event;
+ if(tabPath !== undefined) {
+ module.changeTab(tabPath);
+ }
+ if(pageTitle) {
+ $.address.title(pageTitle);
+ }
+ }
+ }
+ },
+
+ refresh: function() {
+ if(activeTabPath) {
+ module.debug('Refreshing tab', activeTabPath);
+ module.changeTab(activeTabPath);
+ }
+ },
+
+ cache: {
+
+ read: function(cacheKey) {
+ return (cacheKey !== undefined)
+ ? cache[cacheKey]
+ : false
+ ;
+ },
+ add: function(cacheKey, content) {
+ cacheKey = cacheKey || activeTabPath;
+ module.debug('Adding cached content for', cacheKey);
+ cache[cacheKey] = content;
+ },
+ remove: function(cacheKey) {
+ cacheKey = cacheKey || activeTabPath;
+ module.debug('Removing cached content for', cacheKey);
+ delete cache[cacheKey];
+ }
+ },
+
+ escape: {
+ string: function(text) {
+ text = String(text);
+ return text.replace(regExp.escape, '\\$&');
+ }
+ },
+
+ set: {
+ auto: function() {
+ var
+ url = (typeof settings.path == 'string')
+ ? settings.path.replace(/\/$/, '') + '/{$tab}'
+ : '/{$tab}'
+ ;
+ module.verbose('Setting up automatic tab retrieval from server', url);
+ if($.isPlainObject(settings.apiSettings)) {
+ settings.apiSettings.url = url;
+ }
+ else {
+ settings.apiSettings = {
+ url: url
+ };
+ }
+ },
+ loading: function(tabPath) {
+ var
+ $tab = module.get.tabElement(tabPath),
+ isLoading = $tab.hasClass(className.loading)
+ ;
+ if(!isLoading) {
+ module.verbose('Setting loading state for', $tab);
+ $tab
+ .addClass(className.loading)
+ .siblings($tabs)
+ .removeClass(className.active + ' ' + className.loading)
+ ;
+ if($tab.length > 0) {
+ settings.onRequest.call($tab[0], tabPath);
+ }
+ }
+ },
+ state: function(state) {
+ $.address.value(state);
+ }
+ },
+
+ changeTab: function(tabPath) {
+ var
+ pushStateAvailable = (window.history && window.history.pushState),
+ shouldIgnoreLoad = (pushStateAvailable && settings.ignoreFirstLoad && firstLoad),
+ remoteContent = (settings.auto || $.isPlainObject(settings.apiSettings) ),
+ // only add default path if not remote content
+ pathArray = (remoteContent && !shouldIgnoreLoad)
+ ? module.utilities.pathToArray(tabPath)
+ : module.get.defaultPathArray(tabPath)
+ ;
+ tabPath = module.utilities.arrayToPath(pathArray);
+ $.each(pathArray, function(index, tab) {
+ var
+ currentPathArray = pathArray.slice(0, index + 1),
+ currentPath = module.utilities.arrayToPath(currentPathArray),
+
+ isTab = module.is.tab(currentPath),
+ isLastIndex = (index + 1 == pathArray.length),
+
+ $tab = module.get.tabElement(currentPath),
+ $anchor,
+ nextPathArray,
+ nextPath,
+ isLastTab
+ ;
+ module.verbose('Looking for tab', tab);
+ if(isTab) {
+ module.verbose('Tab was found', tab);
+ // scope up
+ activeTabPath = currentPath;
+ parameterArray = module.utilities.filterArray(pathArray, currentPathArray);
+
+ if(isLastIndex) {
+ isLastTab = true;
+ }
+ else {
+ nextPathArray = pathArray.slice(0, index + 2);
+ nextPath = module.utilities.arrayToPath(nextPathArray);
+ isLastTab = ( !module.is.tab(nextPath) );
+ if(isLastTab) {
+ module.verbose('Tab parameters found', nextPathArray);
+ }
+ }
+ if(isLastTab && remoteContent) {
+ if(!shouldIgnoreLoad) {
+ module.activate.navigation(currentPath);
+ module.fetch.content(currentPath, tabPath);
+ }
+ else {
+ module.debug('Ignoring remote content on first tab load', currentPath);
+ firstLoad = false;
+ module.cache.add(tabPath, $tab.html());
+ module.activate.all(currentPath);
+ settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent);
+ settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent);
+ }
+ return false;
+ }
+ else {
+ module.debug('Opened local tab', currentPath);
+ module.activate.all(currentPath);
+ if( !module.cache.read(currentPath) ) {
+ module.cache.add(currentPath, true);
+ module.debug('First time tab loaded calling tab init');
+ settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent);
+ }
+ settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent);
+ }
+
+ }
+ else if(tabPath.search('/') == -1 && tabPath !== '') {
+ // look for in page anchor
+ tabPath = module.escape.string(tabPath);
+ $anchor = $('#' + tabPath + ', a[name="' + tabPath + '"]');
+ currentPath = $anchor.closest('[data-tab]').data(metadata.tab);
+ $tab = module.get.tabElement(currentPath);
+ // if anchor exists use parent tab
+ if($anchor && $anchor.length > 0 && currentPath) {
+ module.debug('Anchor link used, opening parent tab', $tab, $anchor);
+ if( !$tab.hasClass(className.active) ) {
+ setTimeout(function() {
+ module.scrollTo($anchor);
+ }, 0);
+ }
+ module.activate.all(currentPath);
+ if( !module.cache.read(currentPath) ) {
+ module.cache.add(currentPath, true);
+ module.debug('First time tab loaded calling tab init');
+ settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent);
+ }
+ settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent);
+ return false;
+ }
+ }
+ else {
+ module.error(error.missingTab, $module, $context, currentPath);
+ return false;
+ }
+ });
+ },
+
+ scrollTo: function($element) {
+ var
+ scrollOffset = ($element && $element.length > 0)
+ ? $element.offset().top
+ : false
+ ;
+ if(scrollOffset !== false) {
+ module.debug('Forcing scroll to an in-page link in a hidden tab', scrollOffset, $element);
+ $(document).scrollTop(scrollOffset);
+ }
+ },
+
+ update: {
+ content: function(tabPath, html, evaluateScripts) {
+ var
+ $tab = module.get.tabElement(tabPath),
+ tab = $tab[0]
+ ;
+ evaluateScripts = (evaluateScripts !== undefined)
+ ? evaluateScripts
+ : settings.evaluateScripts
+ ;
+ if(typeof settings.cacheType == 'string' && settings.cacheType.toLowerCase() == 'dom' && typeof html !== 'string') {
+ $tab
+ .empty()
+ .append($(html).clone(true))
+ ;
+ }
+ else {
+ if(evaluateScripts) {
+ module.debug('Updating HTML and evaluating inline scripts', tabPath, html);
+ $tab.html(html);
+ }
+ else {
+ module.debug('Updating HTML', tabPath, html);
+ tab.innerHTML = html;
+ }
+ }
+ }
+ },
+
+ fetch: {
+
+ content: function(tabPath, fullTabPath) {
+ var
+ $tab = module.get.tabElement(tabPath),
+ apiSettings = {
+ dataType : 'html',
+ encodeParameters : false,
+ on : 'now',
+ cache : settings.alwaysRefresh,
+ headers : {
+ 'X-Remote': true
+ },
+ onSuccess : function(response) {
+ if(settings.cacheType == 'response') {
+ module.cache.add(fullTabPath, response);
+ }
+ module.update.content(tabPath, response);
+ if(tabPath == activeTabPath) {
+ module.debug('Content loaded', tabPath);
+ module.activate.tab(tabPath);
+ }
+ else {
+ module.debug('Content loaded in background', tabPath);
+ }
+ settings.onFirstLoad.call($tab[0], tabPath, parameterArray, historyEvent);
+ settings.onLoad.call($tab[0], tabPath, parameterArray, historyEvent);
+
+ if(settings.loadOnce) {
+ module.cache.add(fullTabPath, true);
+ }
+ else if(typeof settings.cacheType == 'string' && settings.cacheType.toLowerCase() == 'dom' && $tab.children().length > 0) {
+ setTimeout(function() {
+ var
+ $clone = $tab.children().clone(true)
+ ;
+ $clone = $clone.not('script');
+ module.cache.add(fullTabPath, $clone);
+ }, 0);
+ }
+ else {
+ module.cache.add(fullTabPath, $tab.html());
+ }
+ },
+ urlData: {
+ tab: fullTabPath
+ }
+ },
+ request = $tab.api('get request') || false,
+ existingRequest = ( request && request.state() === 'pending' ),
+ requestSettings,
+ cachedContent
+ ;
+
+ fullTabPath = fullTabPath || tabPath;
+ cachedContent = module.cache.read(fullTabPath);
+
+
+ if(settings.cache && cachedContent) {
+ module.activate.tab(tabPath);
+ module.debug('Adding cached content', fullTabPath);
+ if(!settings.loadOnce) {
+ if(settings.evaluateScripts == 'once') {
+ module.update.content(tabPath, cachedContent, false);
+ }
+ else {
+ module.update.content(tabPath, cachedContent);
+ }
+ }
+ settings.onLoad.call($tab[0], tabPath, parameterArray, historyEvent);
+ }
+ else if(existingRequest) {
+ module.set.loading(tabPath);
+ module.debug('Content is already loading', fullTabPath);
+ }
+ else if($.api !== undefined) {
+ requestSettings = $.extend(true, {}, settings.apiSettings, apiSettings);
+ module.debug('Retrieving remote content', fullTabPath, requestSettings);
+ module.set.loading(tabPath);
+ $tab.api(requestSettings);
+ }
+ else {
+ module.error(error.api);
+ }
+ }
+ },
+
+ activate: {
+ all: function(tabPath) {
+ module.activate.tab(tabPath);
+ module.activate.navigation(tabPath);
+ },
+ tab: function(tabPath) {
+ var
+ $tab = module.get.tabElement(tabPath),
+ $deactiveTabs = (settings.deactivate == 'siblings')
+ ? $tab.siblings($tabs)
+ : $tabs.not($tab),
+ isActive = $tab.hasClass(className.active)
+ ;
+ module.verbose('Showing tab content for', $tab);
+ if(!isActive) {
+ $tab
+ .addClass(className.active)
+ ;
+ $deactiveTabs
+ .removeClass(className.active + ' ' + className.loading)
+ ;
+ if($tab.length > 0) {
+ settings.onVisible.call($tab[0], tabPath);
+ }
+ }
+ },
+ navigation: function(tabPath) {
+ var
+ $navigation = module.get.navElement(tabPath),
+ $deactiveNavigation = (settings.deactivate == 'siblings')
+ ? $navigation.siblings($allModules)
+ : $allModules.not($navigation),
+ isActive = $navigation.hasClass(className.active)
+ ;
+ module.verbose('Activating tab navigation for', $navigation, tabPath);
+ if(!isActive) {
+ $navigation
+ .addClass(className.active)
+ ;
+ $deactiveNavigation
+ .removeClass(className.active + ' ' + className.loading)
+ ;
+ }
+ }
+ },
+
+ deactivate: {
+ all: function() {
+ module.deactivate.navigation();
+ module.deactivate.tabs();
+ },
+ navigation: function() {
+ $allModules
+ .removeClass(className.active)
+ ;
+ },
+ tabs: function() {
+ $tabs
+ .removeClass(className.active + ' ' + className.loading)
+ ;
+ }
+ },
+
+ is: {
+ tab: function(tabName) {
+ return (tabName !== undefined)
+ ? ( module.get.tabElement(tabName).length > 0 )
+ : false
+ ;
+ }
+ },
+
+ get: {
+ initialPath: function() {
+ return $allModules.eq(0).data(metadata.tab) || $tabs.eq(0).data(metadata.tab);
+ },
+ path: function() {
+ return $.address.value();
+ },
+ // adds default tabs to tab path
+ defaultPathArray: function(tabPath) {
+ return module.utilities.pathToArray( module.get.defaultPath(tabPath) );
+ },
+ defaultPath: function(tabPath) {
+ var
+ $defaultNav = $allModules.filter('[data-' + metadata.tab + '^="' + module.escape.string(tabPath) + '/"]').eq(0),
+ defaultTab = $defaultNav.data(metadata.tab) || false
+ ;
+ if( defaultTab ) {
+ module.debug('Found default tab', defaultTab);
+ if(recursionDepth < settings.maxDepth) {
+ recursionDepth++;
+ return module.get.defaultPath(defaultTab);
+ }
+ module.error(error.recursion);
+ }
+ else {
+ module.debug('No default tabs found for', tabPath, $tabs);
+ }
+ recursionDepth = 0;
+ return tabPath;
+ },
+ navElement: function(tabPath) {
+ tabPath = tabPath || activeTabPath;
+ return $allModules.filter('[data-' + metadata.tab + '="' + module.escape.string(tabPath) + '"]');
+ },
+ tabElement: function(tabPath) {
+ var
+ $fullPathTab,
+ $simplePathTab,
+ tabPathArray,
+ lastTab
+ ;
+ tabPath = tabPath || activeTabPath;
+ tabPathArray = module.utilities.pathToArray(tabPath);
+ lastTab = module.utilities.last(tabPathArray);
+ $fullPathTab = $tabs.filter('[data-' + metadata.tab + '="' + module.escape.string(tabPath) + '"]');
+ $simplePathTab = $tabs.filter('[data-' + metadata.tab + '="' + module.escape.string(lastTab) + '"]');
+ return ($fullPathTab.length > 0)
+ ? $fullPathTab
+ : $simplePathTab
+ ;
+ },
+ tab: function() {
+ return activeTabPath;
+ }
+ },
+
+ determine: {
+ activeTab: function() {
+ var activeTab = null;
+
+ $tabs.each(function(_index, tab) {
+ var $tab = $(tab);
+
+ if( $tab.hasClass(className.active) ) {
+ var
+ tabPath = $(this).data(metadata.tab),
+ $anchor = $allModules.filter('[data-' + metadata.tab + '="' + module.escape.string(tabPath) + '"]')
+ ;
+
+ if( $anchor.hasClass(className.active) ) {
+ activeTab = tabPath;
+ }
+ }
+ });
+
+ return activeTab;
+ }
+ },
+
+ utilities: {
+ filterArray: function(keepArray, removeArray) {
+ return $.grep(keepArray, function(keepValue) {
+ return ( $.inArray(keepValue, removeArray) == -1);
+ });
+ },
+ last: function(array) {
+ return Array.isArray(array)
+ ? array[ array.length - 1]
+ : false
+ ;
+ },
+ pathToArray: function(pathName) {
+ if(pathName === undefined) {
+ pathName = activeTabPath;
+ }
+ return typeof pathName == 'string'
+ ? pathName.split('/')
+ : [pathName]
+ ;
+ },
+ arrayToPath: function(pathArray) {
+ return Array.isArray(pathArray)
+ ? pathArray.join('/')
+ : false
+ ;
+ }
+ },
+
+ setting: function(name, value) {
+ module.debug('Changing setting', name, value);
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ if($.isPlainObject(settings[name])) {
+ $.extend(true, settings[name], value);
+ }
+ else {
+ settings[name] = value;
+ }
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ module.error(error.method, query);
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ }
+ })
+ ;
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+
+};
+
+// shortcut for tabbed content with no defined navigation
+$.tab = function() {
+ $(window).tab.apply(this, arguments);
+};
+
+$.fn.tab.settings = {
+
+ name : 'Tab',
+ namespace : 'tab',
+
+ silent : false,
+ debug : false,
+ verbose : false,
+ performance : true,
+
+ auto : false, // uses pjax style endpoints fetching content from same url with remote-content headers
+ history : false, // use browser history
+ historyType : 'hash', // #/ or html5 state
+ path : false, // base path of url
+
+ context : false, // specify a context that tabs must appear inside
+ childrenOnly : false, // use only tabs that are children of context
+ maxDepth : 25, // max depth a tab can be nested
+
+ deactivate : 'siblings', // whether tabs should deactivate sibling menu elements or all elements initialized together
+
+ alwaysRefresh : false, // load tab content new every tab click
+ cache : true, // cache the content requests to pull locally
+ loadOnce : false, // Whether tab data should only be loaded once when using remote content
+ cacheType : 'response', // Whether to cache exact response, or to html cache contents after scripts execute
+ ignoreFirstLoad : false, // don't load remote content on first load
+
+ apiSettings : false, // settings for api call
+ evaluateScripts : 'once', // whether inline scripts should be parsed (true/false/once). Once will not re-evaluate on cached content
+ autoTabActivation: true, // whether a non existing active tab will auto activate the first available tab
+
+ onFirstLoad : function(tabPath, parameterArray, historyEvent) {}, // called first time loaded
+ onLoad : function(tabPath, parameterArray, historyEvent) {}, // called on every load
+ onVisible : function(tabPath, parameterArray, historyEvent) {}, // called every time tab visible
+ onRequest : function(tabPath, parameterArray, historyEvent) {}, // called ever time a tab beings loading remote content
+
+ templates : {
+ determineTitle: function(tabArray) {} // returns page title for path
+ },
+
+ error: {
+ api : 'You attempted to load content without API module',
+ method : 'The method you called is not defined',
+ missingTab : 'Activated tab cannot be found. Tabs are case-sensitive.',
+ noContent : 'The tab you specified is missing a content url.',
+ path : 'History enabled, but no path was specified',
+ recursion : 'Max recursive depth reached',
+ legacyInit : 'onTabInit has been renamed to onFirstLoad in 2.0, please adjust your code.',
+ legacyLoad : 'onTabLoad has been renamed to onLoad in 2.0. Please adjust your code',
+ state : 'History requires Asual\'s Address library '
+ },
+
+ regExp : {
+ escape : /[-[\]{}()*+?.,\\^$|#\s:=@]/g
+ },
+
+ metadata : {
+ tab : 'tab',
+ loaded : 'loaded',
+ promise: 'promise'
+ },
+
+ className : {
+ loading : 'loading',
+ active : 'active'
+ },
+
+ selector : {
+ tabs : '.ui.tab',
+ ui : '.ui'
+ }
+
+};
+
+})( jQuery, window, document );
diff --git a/public/dist/components/tab.min.css b/public/dist/components/tab.min.css
new file mode 100644
index 000000000..2a681c25a
--- /dev/null
+++ b/public/dist/components/tab.min.css
@@ -0,0 +1,9 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Tab
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */.ui.tab{display:none}.ui.tab.active,.ui.tab.open{display:block}.ui.tab.loading{position:relative;overflow:hidden;display:block;min-height:250px}.ui.tab.loading *{position:relative!important;left:-10000px!important}.ui.tab.loading.segment:before,.ui.tab.loading:before{position:absolute;content:'';top:50%;left:50%;margin:-1.25em 0 0 -1.25em;width:2.5em;height:2.5em;border-radius:500rem;border:.2em solid rgba(0,0,0,.1)}.ui.tab.loading.segment:after,.ui.tab.loading:after{position:absolute;content:'';top:50%;left:50%;margin:-1.25em 0 0 -1.25em;width:2.5em;height:2.5em;-webkit-animation:loader .6s infinite linear;animation:loader .6s infinite linear;border:.2em solid #767676;border-radius:500rem;-webkit-box-shadow:0 0 0 1px transparent;box-shadow:0 0 0 1px transparent}
\ No newline at end of file
diff --git a/public/dist/components/tab.min.js b/public/dist/components/tab.min.js
new file mode 100644
index 000000000..798c1367d
--- /dev/null
+++ b/public/dist/components/tab.min.js
@@ -0,0 +1,11 @@
+/*
+ * # Fomantic UI - 2.8.8
+ * https://github.com/fomantic/Fomantic-UI
+ * http://fomantic-ui.com/
+ *
+ * Copyright 2021 Contributors
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+!function(j,O,k,I){"use strict";j.isWindow=j.isWindow||function(e){return null!=e&&e===e.window},j.isFunction=j.isFunction||function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},O=void 0!==O&&O.Math==Math?O:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),j.fn.tab=function(l){var d,u=j.isFunction(this)?j(O):j(this),b=u.selector||"",g=(new Date).getTime(),f=[],F=l,w="string"==typeof F,S=[].slice.call(arguments,1),E=!1;return u.each(function(){var h,o,p,v,m,y,T=j.isPlainObject(l)?j.extend(!0,{},j.fn.tab.settings,l):j.extend({},j.fn.tab.settings),L=T.className,A=T.metadata,t=T.selector,x=T.error,a=T.regExp,e="."+T.namespace,n="module-"+T.namespace,P=j(this),i={},C=!0,r=0,s=this,c=P.data(n);m={initialize:function(){m.debug("Initializing tab menu item",P),m.fix.callbacks(),m.determineTabs(),m.debug("Determining tabs",T.context,o),T.auto&&m.set.auto(),m.bind.events(),T.history&&!E&&(m.initializeHistory(),E=!0),T.autoTabActivation&&c===I&&null==m.determine.activeTab()&&(m.debug("No active tab detected, setting first tab active",m.get.initialPath()),m.changeTab(!0===T.autoTabActivation?m.get.initialPath():T.autoTabActivation)),m.instantiate()},instantiate:function(){m.verbose("Storing instance of module",m),c=m,P.data(n,m)},destroy:function(){m.debug("Destroying tabs",P),P.removeData(n).off(e)},bind:{events:function(){j.isWindow(s)||(m.debug("Attaching tab activation events to element",P),P.on("click"+e,m.event.click))}},determineTabs:function(){var e;"parent"===T.context?(0"},regExp:{escape:/[-[\]{}()*+?.,\\^$|#\s:=@]/g},metadata:{tab:"tab",loaded:"loaded",promise:"promise"},className:{loading:"loading",active:"active"},selector:{tabs:".ui.tab",ui:".ui"}}}(jQuery,window,document);
\ No newline at end of file
diff --git a/public/dist/components/table.css b/public/dist/components/table.css
new file mode 100644
index 000000000..24e9efa9b
--- /dev/null
+++ b/public/dist/components/table.css
@@ -0,0 +1,2213 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Table
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+
+/*******************************
+ Table
+*******************************/
+
+
+/* Prototype */
+.ui.table {
+ width: 100%;
+ background: #FFFFFF;
+ margin: 1em 0;
+ border: 1px solid rgba(34, 36, 38, 0.15);
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ border-radius: 0.28571429rem;
+ text-align: left;
+ vertical-align: middle;
+ color: rgba(0, 0, 0, 0.87);
+ border-collapse: separate;
+ border-spacing: 0;
+}
+.ui.table:first-child {
+ margin-top: 0;
+}
+.ui.table:last-child {
+ margin-bottom: 0;
+}
+.ui.table > thead,
+.ui.table > tbody {
+ text-align: inherit;
+ vertical-align: inherit;
+}
+
+
+/*******************************
+ Parts
+*******************************/
+
+
+/* Table Content */
+.ui.table th,
+.ui.table td {
+ -webkit-transition: background 0.1s ease, color 0.1s ease;
+ transition: background 0.1s ease, color 0.1s ease;
+}
+
+/* Rowspan helper class */
+.ui.table th.rowspanned,
+.ui.table td.rowspanned {
+ display: none;
+}
+
+/* Headers */
+.ui.table > thead {
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
+.ui.table > thead > tr > th {
+ cursor: auto;
+ background: #F9FAFB;
+ text-align: inherit;
+ color: rgba(0, 0, 0, 0.87);
+ padding: 0.92857143em 0.78571429em;
+ vertical-align: inherit;
+ font-style: none;
+ font-weight: bold;
+ text-transform: none;
+ border-bottom: 1px solid rgba(34, 36, 38, 0.1);
+ border-left: none;
+}
+.ui.table > thead > tr > th:first-child {
+ border-left: none;
+}
+.ui.table > thead > tr:first-child > th:first-child {
+ border-radius: 0.28571429rem 0 0 0;
+}
+.ui.table > thead > tr:first-child > th:last-child {
+ border-radius: 0 0.28571429rem 0 0;
+}
+.ui.table > thead > tr:first-child > th:only-child {
+ border-radius: 0.28571429rem 0.28571429rem 0 0;
+}
+
+/* Footer */
+.ui.table > tfoot {
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
+.ui.table > tfoot > tr > th,
+.ui.table > tfoot > tr > td {
+ cursor: auto;
+ border-top: 1px solid rgba(34, 36, 38, 0.15);
+ background: #F9FAFB;
+ text-align: inherit;
+ color: rgba(0, 0, 0, 0.87);
+ padding: 0.78571429em 0.78571429em;
+ vertical-align: inherit;
+ font-style: normal;
+ font-weight: normal;
+ text-transform: none;
+}
+.ui.table > tfoot > tr > th:first-child,
+.ui.table > tfoot > tr > td:first-child {
+ border-left: none;
+}
+.ui.table > tfoot > tr:first-child > th:first-child,
+.ui.table > tfoot > tr:first-child > td:first-child {
+ border-radius: 0 0 0 0.28571429rem;
+}
+.ui.table > tfoot > tr:first-child > th:last-child,
+.ui.table > tfoot > tr:first-child > td:last-child {
+ border-radius: 0 0 0.28571429rem 0;
+}
+.ui.table > tfoot > tr:first-child > th:only-child,
+.ui.table > tfoot > tr:first-child > td:only-child {
+ border-radius: 0 0 0.28571429rem 0.28571429rem;
+}
+
+/* Table Row */
+.ui.table > tr > td,
+.ui.table > tbody > tr > td {
+ border-top: 1px solid rgba(34, 36, 38, 0.1);
+}
+.ui.table > tr:first-child > td,
+.ui.table > tbody > tr:first-child > td {
+ border-top: none;
+}
+
+/* Repeated tbody */
+.ui.table > tbody + tbody tr:first-child > td {
+ border-top: 1px solid rgba(34, 36, 38, 0.1);
+}
+
+/* Table Cells */
+.ui.table > tbody > tr > td,
+.ui.table > tr > td {
+ padding: 0.78571429em 0.78571429em;
+ text-align: inherit;
+}
+
+/* Icons */
+.ui.table > i.icon {
+ vertical-align: baseline;
+}
+.ui.table > i.icon:only-child {
+ margin: 0;
+}
+
+/* Table Segment */
+.ui.table.segment {
+ padding: 0;
+}
+.ui.table.segment:after {
+ display: none;
+}
+.ui.table.segment.stacked:after {
+ display: block;
+}
+
+/* Responsive */
+@media only screen and (max-width: 767.98px) {
+ .ui.table:not(.unstackable) {
+ width: 100%;
+ padding: 0;
+ }
+ .ui.table:not(.unstackable) > thead,
+ .ui.table:not(.unstackable) > thead > tr,
+ .ui.table:not(.unstackable) > tfoot,
+ .ui.table:not(.unstackable) > tfoot > tr,
+ .ui.table:not(.unstackable) > tbody,
+ .ui.table:not(.unstackable) > tr,
+ .ui.table:not(.unstackable) > tbody > tr,
+ .ui.table:not(.unstackable) > tr > th:not(.rowspanned),
+ .ui.table:not(.unstackable) > thead > tr > th:not(.rowspanned),
+ .ui.table:not(.unstackable) > tbody > tr > th:not(.rowspanned),
+ .ui.table:not(.unstackable) > tfoot > tr > th:not(.rowspanned),
+ .ui.table:not(.unstackable) > tr > td:not(.rowspanned),
+ .ui.table:not(.unstackable) > tbody > tr > td:not(.rowspanned),
+ .ui.table:not(.unstackable) > tfoot > tr > td:not(.rowspanned) {
+ display: block !important;
+ width: auto !important;
+ }
+ .ui.table:not(.unstackable) > thead {
+ display: block;
+ }
+ .ui.table:not(.unstackable) > tfoot {
+ display: block;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) > tr,
+ .ui.ui.ui.ui.table:not(.unstackable) > thead > tr,
+ .ui.ui.ui.ui.table:not(.unstackable) > tbody > tr,
+ .ui.ui.ui.ui.table:not(.unstackable) > tfoot > tr {
+ padding-top: 1em;
+ padding-bottom: 1em;
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) > tr > th,
+ .ui.ui.ui.ui.table:not(.unstackable) > thead > tr > th,
+ .ui.ui.ui.ui.table:not(.unstackable) > tbody > tr > th,
+ .ui.ui.ui.ui.table:not(.unstackable) > tfoot > tr > th,
+ .ui.ui.ui.ui.table:not(.unstackable) > tr > td,
+ .ui.ui.ui.ui.table:not(.unstackable) > tbody > tr > td,
+ .ui.ui.ui.ui.table:not(.unstackable) > tfoot > tr > td {
+ background: none;
+ border: none;
+ padding: 0.25em 0.75em;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ }
+ .ui.table:not(.unstackable) > tr > th:first-child,
+ .ui.table:not(.unstackable) > thead > tr > th:first-child,
+ .ui.table:not(.unstackable) > tbody > tr > th:first-child,
+ .ui.table:not(.unstackable) > tfoot > tr > th:first-child,
+ .ui.table:not(.unstackable) > tr > td:first-child,
+ .ui.table:not(.unstackable) > tbody > tr > td:first-child,
+ .ui.table:not(.unstackable) > tfoot > tr > td:first-child {
+ font-weight: bold;
+ }
+
+/* Definition Table */
+ .ui.definition.table:not(.unstackable) > thead > tr > th:first-child {
+ -webkit-box-shadow: none !important;
+ box-shadow: none !important;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) tr.marked.primary.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #2185D0 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #2185D0 inset;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) tr.marked.primary.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #2185D0 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #2185D0 inset;
+ }
+ .ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.primary.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #54C8FF inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #54C8FF inset;
+ }
+ .ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.primary.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #54C8FF inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #54C8FF inset;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) tr.marked.secondary.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #1B1C1D inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #1B1C1D inset;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) tr.marked.secondary.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #1B1C1D inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #1B1C1D inset;
+ }
+ .ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.secondary.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #545454 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #545454 inset;
+ }
+ .ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.secondary.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #545454 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #545454 inset;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) tr.marked.red.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #DB2828 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #DB2828 inset;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) tr.marked.red.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #DB2828 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #DB2828 inset;
+ }
+ .ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.red.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #FF695E inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #FF695E inset;
+ }
+ .ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.red.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #FF695E inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #FF695E inset;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) tr.marked.orange.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #F2711C inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #F2711C inset;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) tr.marked.orange.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #F2711C inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #F2711C inset;
+ }
+ .ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.orange.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #FF851B inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #FF851B inset;
+ }
+ .ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.orange.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #FF851B inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #FF851B inset;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) tr.marked.yellow.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #FBBD08 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #FBBD08 inset;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) tr.marked.yellow.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #FBBD08 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #FBBD08 inset;
+ }
+ .ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.yellow.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #FFE21F inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #FFE21F inset;
+ }
+ .ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.yellow.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #FFE21F inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #FFE21F inset;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) tr.marked.olive.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #B5CC18 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #B5CC18 inset;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) tr.marked.olive.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #B5CC18 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #B5CC18 inset;
+ }
+ .ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.olive.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #D9E778 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #D9E778 inset;
+ }
+ .ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.olive.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #D9E778 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #D9E778 inset;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) tr.marked.green.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #21BA45 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #21BA45 inset;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) tr.marked.green.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #21BA45 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #21BA45 inset;
+ }
+ .ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.green.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #2ECC40 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #2ECC40 inset;
+ }
+ .ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.green.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #2ECC40 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #2ECC40 inset;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) tr.marked.teal.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #00B5AD inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #00B5AD inset;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) tr.marked.teal.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #00B5AD inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #00B5AD inset;
+ }
+ .ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.teal.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #6DFFFF inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #6DFFFF inset;
+ }
+ .ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.teal.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #6DFFFF inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #6DFFFF inset;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) tr.marked.blue.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #2185D0 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #2185D0 inset;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) tr.marked.blue.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #2185D0 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #2185D0 inset;
+ }
+ .ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.blue.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #54C8FF inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #54C8FF inset;
+ }
+ .ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.blue.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #54C8FF inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #54C8FF inset;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) tr.marked.violet.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #6435C9 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #6435C9 inset;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) tr.marked.violet.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #6435C9 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #6435C9 inset;
+ }
+ .ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.violet.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #A291FB inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #A291FB inset;
+ }
+ .ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.violet.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #A291FB inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #A291FB inset;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) tr.marked.purple.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #A333C8 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #A333C8 inset;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) tr.marked.purple.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #A333C8 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #A333C8 inset;
+ }
+ .ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.purple.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #DC73FF inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #DC73FF inset;
+ }
+ .ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.purple.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #DC73FF inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #DC73FF inset;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) tr.marked.pink.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #E03997 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #E03997 inset;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) tr.marked.pink.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #E03997 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #E03997 inset;
+ }
+ .ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.pink.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #FF8EDF inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #FF8EDF inset;
+ }
+ .ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.pink.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #FF8EDF inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #FF8EDF inset;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) tr.marked.brown.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #A5673F inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #A5673F inset;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) tr.marked.brown.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #A5673F inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #A5673F inset;
+ }
+ .ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.brown.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #D67C1C inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #D67C1C inset;
+ }
+ .ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.brown.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #D67C1C inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #D67C1C inset;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) tr.marked.grey.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #767676 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #767676 inset;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) tr.marked.grey.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #767676 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #767676 inset;
+ }
+ .ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.grey.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #DCDDDE inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #DCDDDE inset;
+ }
+ .ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.grey.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #DCDDDE inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #DCDDDE inset;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) tr.marked.black.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #1B1C1D inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #1B1C1D inset;
+ }
+ .ui.ui.ui.ui.table:not(.unstackable) tr.marked.black.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #1B1C1D inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #1B1C1D inset;
+ }
+ .ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.black.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #545454 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #545454 inset;
+ }
+ .ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.black.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #545454 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #545454 inset;
+ }
+}
+
+
+/*******************************
+ Coupling
+*******************************/
+
+
+/* UI Image */
+.ui.table .collapsing .image,
+.ui.table .collapsing .image img {
+ max-width: none;
+}
+
+
+/*******************************
+ Types
+*******************************/
+
+
+/*--------------
+ Complex
+---------------*/
+
+.ui.structured.table {
+ border-collapse: collapse;
+}
+.ui.structured.table > thead > tr > th {
+ border-left: none;
+ border-right: none;
+}
+.ui.structured.sortable.table > thead > tr > th {
+ border-left: 1px solid rgba(34, 36, 38, 0.15);
+ border-right: 1px solid rgba(34, 36, 38, 0.15);
+}
+.ui.structured.basic.table > tr > th,
+.ui.structured.basic.table > thead > tr > th,
+.ui.structured.basic.table > tbody > tr > th,
+.ui.structured.basic.table > tfoot > tr > th {
+ border-left: none;
+ border-right: none;
+}
+.ui.structured.celled.table > tr > th,
+.ui.structured.celled.table > thead > tr > th,
+.ui.structured.celled.table > tbody > tr > th,
+.ui.structured.celled.table > tfoot > tr > th,
+.ui.structured.celled.table > tr > td,
+.ui.structured.celled.table > tbody > tr > td,
+.ui.structured.celled.table > tfoot > tr > td {
+ border-left: 1px solid rgba(34, 36, 38, 0.1);
+ border-right: 1px solid rgba(34, 36, 38, 0.1);
+}
+
+/*--------------
+ Definition
+ ---------------*/
+
+.ui.definition.table > thead:not(.full-width) > tr > th:first-child {
+ pointer-events: none;
+ background: #FFFFFF;
+ font-weight: normal;
+ color: rgba(0, 0, 0, 0.4);
+ -webkit-box-shadow: -0.1em -0.2em 0 0.1em #FFFFFF;
+ box-shadow: -0.1em -0.2em 0 0.1em #FFFFFF;
+ -moz-transform: scale(1);
+}
+.ui.definition.table > thead:not(.full-width) > tr > th:first-child:not(:empty) {
+ pointer-events: auto;
+}
+.ui.definition.table > tfoot:not(.full-width) > tr > th:first-child {
+ pointer-events: none;
+ background: #FFFFFF;
+ font-weight: normal;
+ color: rgba(0, 0, 0, 0.4);
+ -webkit-box-shadow: -0.1em 0.2em 0 0.1em #FFFFFF;
+ box-shadow: -0.1em 0.2em 0 0.1em #FFFFFF;
+ -moz-transform: scale(1);
+}
+
+/* Highlight Defining Column */
+.ui.definition.table > tr > td:first-child:not(.ignored),
+.ui.definition.table > tbody > tr > td:first-child:not(.ignored),
+.ui.definition.table > tfoot > tr > td:first-child:not(.ignored),
+.ui.definition.table tr td.definition {
+ background: rgba(0, 0, 0, 0.03);
+ font-weight: bold;
+ color: rgba(0, 0, 0, 0.95);
+ text-transform: '';
+ -webkit-box-shadow: '';
+ box-shadow: '';
+ text-align: '';
+ font-size: 1em;
+ padding-left: '';
+ padding-right: '';
+}
+
+/* Fix 2nd Column */
+.ui.definition.table > thead:not(.full-width) > tr > th:nth-child(2) {
+ border-left: 1px solid rgba(34, 36, 38, 0.15);
+}
+.ui.definition.table > tfoot:not(.full-width) > tr > th:nth-child(2),
+.ui.definition.table > tfoot:not(.full-width) > tr > td:nth-child(2) {
+ border-left: 1px solid rgba(34, 36, 38, 0.15);
+}
+.ui.definition.table > tr > td:nth-child(2),
+.ui.definition.table > tbody > tr > td:nth-child(2) {
+ border-left: 1px solid rgba(34, 36, 38, 0.15);
+}
+
+
+/*******************************
+ States
+*******************************/
+
+
+/*--------------
+ Positive
+ ---------------*/
+
+.ui.ui.ui.ui.table tr.positive,
+.ui.ui.table td.positive {
+ -webkit-box-shadow: 0 0 0 #A3C293 inset;
+ box-shadow: 0 0 0 #A3C293 inset;
+ background: #FCFFF5;
+ color: #2C662D;
+}
+
+/*--------------
+ Negative
+ ---------------*/
+
+.ui.ui.ui.ui.table tr.negative,
+.ui.ui.table td.negative {
+ -webkit-box-shadow: 0 0 0 #E0B4B4 inset;
+ box-shadow: 0 0 0 #E0B4B4 inset;
+ background: #FFF6F6;
+ color: #9F3A38;
+}
+
+/*--------------
+ Error
+ ---------------*/
+
+.ui.ui.ui.ui.table tr.error,
+.ui.ui.table td.error {
+ -webkit-box-shadow: 0 0 0 #E0B4B4 inset;
+ box-shadow: 0 0 0 #E0B4B4 inset;
+ background: #FFF6F6;
+ color: #9F3A38;
+}
+
+/*--------------
+ Warning
+ ---------------*/
+
+.ui.ui.ui.ui.table tr.warning,
+.ui.ui.table td.warning {
+ -webkit-box-shadow: 0 0 0 #C9BA9B inset;
+ box-shadow: 0 0 0 #C9BA9B inset;
+ background: #FFFAF3;
+ color: #573A08;
+}
+
+/*--------------
+ Active
+ ---------------*/
+
+.ui.ui.ui.ui.table tr.active,
+.ui.ui.table td.active {
+ -webkit-box-shadow: 0 0 0 rgba(0, 0, 0, 0.87) inset;
+ box-shadow: 0 0 0 rgba(0, 0, 0, 0.87) inset;
+ background: #E0E0E0;
+ color: rgba(0, 0, 0, 0.87);
+}
+
+/*--------------
+ Disabled
+ ---------------*/
+
+.ui.table tr.disabled td,
+.ui.table tr td.disabled,
+.ui.table tr.disabled:hover,
+.ui.table tr:hover td.disabled {
+ pointer-events: none;
+ color: rgba(40, 40, 40, 0.3);
+}
+
+
+/*******************************
+ Variations
+*******************************/
+
+
+/*--------------
+ Stackable
+ ---------------*/
+
+@media only screen and (max-width: 991.98px) {
+ .ui[class*="tablet stackable"].table,
+ .ui[class*="tablet stackable"].table > thead,
+ .ui[class*="tablet stackable"].table > thead > tr,
+ .ui[class*="tablet stackable"].table > tfoot,
+ .ui[class*="tablet stackable"].table > tfoot > tr,
+ .ui[class*="tablet stackable"].table > tbody,
+ .ui[class*="tablet stackable"].table > tbody > tr,
+ .ui[class*="tablet stackable"].table > tr,
+ .ui[class*="tablet stackable"].table > thead > tr > th:not(.rowspanned),
+ .ui[class*="tablet stackable"].table > tbody > tr > th:not(.rowspanned),
+ .ui[class*="tablet stackable"].table > tfoot > tr > th:not(.rowspanned),
+ .ui[class*="tablet stackable"].table > tr > th:not(.rowspanned),
+ .ui[class*="tablet stackable"].table > tbody > tr > td:not(.rowspanned),
+ .ui[class*="tablet stackable"].table > tfoot > tr > td:not(.rowspanned),
+ .ui[class*="tablet stackable"].table > tr > td:not(.rowspanned) {
+ display: block !important;
+ width: 100% !important;
+ }
+ .ui[class*="tablet stackable"].table {
+ padding: 0;
+ }
+ .ui[class*="tablet stackable"].table > thead {
+ display: block;
+ }
+ .ui[class*="tablet stackable"].table > tfoot {
+ display: block;
+ }
+ .ui.ui.ui.ui[class*="tablet stackable"].table > thead > tr,
+ .ui.ui.ui.ui[class*="tablet stackable"].table > tbody > tr,
+ .ui.ui.ui.ui[class*="tablet stackable"].table > tfoot > tr,
+ .ui.ui.ui.ui[class*="tablet stackable"].table > tr {
+ padding-top: 1em;
+ padding-bottom: 1em;
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset;
+ }
+ .ui[class*="tablet stackable"].table > thead > tr > th,
+ .ui[class*="tablet stackable"].table > tbody > tr > th,
+ .ui[class*="tablet stackable"].table > tfoot > tr > th,
+ .ui[class*="tablet stackable"].table > tr > th,
+ .ui[class*="tablet stackable"].table > tbody > tr > td,
+ .ui[class*="tablet stackable"].table > tfoot > tr > td,
+ .ui[class*="tablet stackable"].table > tr > td {
+ background: none;
+ border: none !important;
+ padding: 0.25em 0.75em;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ }
+
+/* Definition Table */
+ .ui.definition[class*="tablet stackable"].table > thead > tr > th:first-child {
+ -webkit-box-shadow: none !important;
+ box-shadow: none !important;
+ }
+}
+.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.primary.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #2185D0 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #2185D0 inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.primary.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #2185D0 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #2185D0 inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.primary.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #54C8FF inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #54C8FF inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.primary.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #54C8FF inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #54C8FF inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.secondary.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #1B1C1D inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #1B1C1D inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.secondary.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #1B1C1D inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #1B1C1D inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.secondary.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #545454 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #545454 inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.secondary.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #545454 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #545454 inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.red.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #DB2828 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #DB2828 inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.red.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #DB2828 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #DB2828 inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.red.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #FF695E inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #FF695E inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.red.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #FF695E inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #FF695E inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.orange.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #F2711C inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #F2711C inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.orange.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #F2711C inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #F2711C inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.orange.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #FF851B inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #FF851B inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.orange.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #FF851B inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #FF851B inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.yellow.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #FBBD08 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #FBBD08 inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.yellow.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #FBBD08 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #FBBD08 inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.yellow.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #FFE21F inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #FFE21F inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.yellow.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #FFE21F inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #FFE21F inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.olive.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #B5CC18 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #B5CC18 inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.olive.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #B5CC18 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #B5CC18 inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.olive.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #D9E778 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #D9E778 inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.olive.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #D9E778 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #D9E778 inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.green.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #21BA45 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #21BA45 inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.green.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #21BA45 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #21BA45 inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.green.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #2ECC40 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #2ECC40 inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.green.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #2ECC40 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #2ECC40 inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.teal.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #00B5AD inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #00B5AD inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.teal.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #00B5AD inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #00B5AD inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.teal.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #6DFFFF inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #6DFFFF inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.teal.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #6DFFFF inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #6DFFFF inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.blue.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #2185D0 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #2185D0 inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.blue.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #2185D0 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #2185D0 inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.blue.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #54C8FF inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #54C8FF inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.blue.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #54C8FF inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #54C8FF inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.violet.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #6435C9 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #6435C9 inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.violet.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #6435C9 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #6435C9 inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.violet.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #A291FB inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #A291FB inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.violet.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #A291FB inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #A291FB inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.purple.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #A333C8 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #A333C8 inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.purple.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #A333C8 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #A333C8 inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.purple.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #DC73FF inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #DC73FF inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.purple.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #DC73FF inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #DC73FF inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.pink.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #E03997 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #E03997 inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.pink.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #E03997 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #E03997 inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.pink.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #FF8EDF inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #FF8EDF inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.pink.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #FF8EDF inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #FF8EDF inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.brown.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #A5673F inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #A5673F inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.brown.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #A5673F inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #A5673F inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.brown.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #D67C1C inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #D67C1C inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.brown.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #D67C1C inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #D67C1C inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.grey.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #767676 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #767676 inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.grey.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #767676 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #767676 inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.grey.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #DCDDDE inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #DCDDDE inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.grey.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #DCDDDE inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #DCDDDE inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.black.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #1B1C1D inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #1B1C1D inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.black.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #1B1C1D inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #1B1C1D inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.black.left {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #545454 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, 0.2em 0 0 0 #545454 inset;
+}
+.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.black.right {
+ -webkit-box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #545454 inset;
+ box-shadow: 0 -1px 0 0 rgba(0, 0, 0, 0.1) inset, -0.2em 0 0 0 #545454 inset;
+}
+
+/*--------------
+ Text Alignment
+ ---------------*/
+
+.ui.table[class*="left aligned"],
+.ui.table [class*="left aligned"] {
+ text-align: left;
+}
+.ui.table[class*="center aligned"],
+.ui.table [class*="center aligned"] {
+ text-align: center;
+}
+.ui.table[class*="right aligned"],
+.ui.table [class*="right aligned"] {
+ text-align: right;
+}
+
+/*------------------
+ Vertical Alignment
+ ------------------*/
+
+.ui.table[class*="top aligned"],
+.ui.table [class*="top aligned"] {
+ vertical-align: top;
+}
+.ui.table[class*="middle aligned"],
+.ui.table [class*="middle aligned"] {
+ vertical-align: middle;
+}
+.ui.table[class*="bottom aligned"],
+.ui.table [class*="bottom aligned"] {
+ vertical-align: bottom;
+}
+
+/*--------------
+ Collapsing
+ ---------------*/
+
+.ui.table th.collapsing,
+.ui.table td.collapsing {
+ width: 1px;
+ white-space: nowrap;
+}
+
+/*--------------
+ Fixed
+ ---------------*/
+
+.ui.fixed.table {
+ table-layout: fixed;
+}
+.ui.fixed.table th,
+.ui.fixed.table td {
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+
+/*--------------
+ Selectable
+ ---------------*/
+
+.ui.ui.selectable.table > tbody > tr:hover,
+.ui.table tbody tr td.selectable:hover {
+ background: rgba(0, 0, 0, 0.05);
+ color: rgba(0, 0, 0, 0.95);
+}
+.ui.ui.selectable.inverted.table > tbody > tr:hover,
+.ui.inverted.table tbody tr td.selectable:hover {
+ background: rgba(255, 255, 255, 0.08);
+ color: #ffffff;
+}
+
+/* Selectable Cell Link */
+.ui.table tbody tr td.selectable {
+ padding: 0;
+}
+.ui.table tbody tr td.selectable > a:not(.ui) {
+ display: block;
+ color: inherit;
+ padding: 0.78571429em 0.78571429em;
+}
+.ui.table > tr > td.selectable,
+.ui.table > tbody > tr > td.selectable,
+.ui.selectable.table > tbody > tr,
+.ui.selectable.table > tr {
+ cursor: pointer;
+}
+
+/* Other States */
+.ui.ui.selectable.table tr.error:hover,
+.ui.table tr td.selectable.error:hover,
+.ui.selectable.table tr:hover td.error {
+ background: #ffe7e7;
+ color: #943634;
+}
+.ui.ui.selectable.table tr.warning:hover,
+.ui.table tr td.selectable.warning:hover,
+.ui.selectable.table tr:hover td.warning {
+ background: #fff4e4;
+ color: #493107;
+}
+.ui.ui.selectable.table tr.active:hover,
+.ui.table tr td.selectable.active:hover,
+.ui.selectable.table tr:hover td.active {
+ background: #E0E0E0;
+ color: rgba(0, 0, 0, 0.87);
+}
+.ui.ui.selectable.table tr.positive:hover,
+.ui.table tr td.selectable.positive:hover,
+.ui.selectable.table tr:hover td.positive {
+ background: #f7ffe6;
+ color: #275b28;
+}
+.ui.ui.selectable.table tr.negative:hover,
+.ui.table tr td.selectable.negative:hover,
+.ui.selectable.table tr:hover td.negative {
+ background: #ffe7e7;
+ color: #943634;
+}
+
+/*-------------------
+ Attached
+ --------------------*/
+
+
+/* Middle */
+.ui.attached.table {
+ top: 0;
+ bottom: 0;
+ border-radius: 0;
+ margin: 0 -1px;
+ width: calc(100% + 2px);
+ max-width: calc(100% + 2px);
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ border: 1px solid #D4D4D5;
+}
+.ui.attached + .ui.attached.table:not(.top) {
+ border-top: none;
+}
+
+/* Top */
+.ui[class*="top attached"].table {
+ bottom: 0;
+ margin-bottom: 0;
+ top: 0;
+ margin-top: 1em;
+ border-radius: 0.28571429rem 0.28571429rem 0 0;
+}
+.ui.table[class*="top attached"]:first-child {
+ margin-top: 0;
+}
+
+/* Bottom */
+.ui[class*="bottom attached"].table {
+ bottom: 0;
+ margin-top: 0;
+ top: 0;
+ margin-bottom: 1em;
+ -webkit-box-shadow: none, none;
+ box-shadow: none, none;
+ border-radius: 0 0 0.28571429rem 0.28571429rem;
+}
+.ui[class*="bottom attached"].table:last-child {
+ margin-bottom: 0;
+}
+
+/*--------------
+ Striped
+ ---------------*/
+
+
+/* Table Striping */
+.ui.striped.table > tr:nth-child(2n),
+.ui.striped.table > tbody > tr:nth-child(2n) {
+ background-color: rgba(0, 0, 50, 0.02);
+}
+
+/* Stripes */
+.ui.inverted.striped.table > tr:nth-child(2n),
+.ui.inverted.striped.table > tbody > tr:nth-child(2n) {
+ background-color: rgba(255, 255, 255, 0.05);
+}
+
+/* Allow striped active hover */
+.ui.striped.selectable.selectable.selectable.table tbody tr.active:hover {
+ background: #EFEFEF;
+ color: rgba(0, 0, 0, 0.95);
+}
+
+/*--------------
+ Single Line
+---------------*/
+
+.ui.table[class*="single line"],
+.ui.table [class*="single line"] {
+ white-space: nowrap;
+}
+
+/*-------------------
+ Colors
+--------------------*/
+
+.ui.primary.table {
+ border-top: 0.2em solid #2185D0;
+}
+.ui.inverted.primary.table {
+ background-color: #2185D0;
+ color: #FFFFFF;
+}
+.ui.ui.ui.ui.table tr.primary:not(.marked),
+.ui.ui.table td.primary:not(.marked) {
+ background: #ddf4ff;
+ color: rgba(255, 255, 255, 0.9);
+}
+.ui.ui.selectable.table tr.primary:not(.marked):hover,
+.ui.table tr td.selectable.primary:not(.marked):hover,
+.ui.selectable.table tr:hover td.primary:not(.marked) {
+ background: #d3f1ff;
+ color: rgba(255, 255, 255, 0.9);
+}
+.ui.table td.marked.primary.left,
+.ui.table tr.marked.primary.left {
+ -webkit-box-shadow: 0.2em 0 0 0 #2185D0 inset;
+ box-shadow: 0.2em 0 0 0 #2185D0 inset;
+}
+.ui.table td.marked.primary.right,
+.ui.table tr.marked.primary.right {
+ -webkit-box-shadow: -0.2em 0 0 0 #2185D0 inset;
+ box-shadow: -0.2em 0 0 0 #2185D0 inset;
+}
+.ui.inverted.table td.marked.primary.left,
+.ui.inverted.table tr.marked.primary.left {
+ -webkit-box-shadow: 0.2em 0 0 0 #54C8FF inset;
+ box-shadow: 0.2em 0 0 0 #54C8FF inset;
+}
+.ui.inverted.table td.marked.primary.right,
+.ui.inverted.table tr.marked.primary.right {
+ -webkit-box-shadow: -0.2em 0 0 0 #54C8FF inset;
+ box-shadow: -0.2em 0 0 0 #54C8FF inset;
+}
+.ui.secondary.table {
+ border-top: 0.2em solid #1B1C1D;
+}
+.ui.inverted.secondary.table {
+ background-color: #1B1C1D;
+ color: #FFFFFF;
+}
+.ui.ui.ui.ui.table tr.secondary:not(.marked),
+.ui.ui.table td.secondary:not(.marked) {
+ background: #dddddd;
+ color: rgba(255, 255, 255, 0.9);
+}
+.ui.ui.selectable.table tr.secondary:not(.marked):hover,
+.ui.table tr td.selectable.secondary:not(.marked):hover,
+.ui.selectable.table tr:hover td.secondary:not(.marked) {
+ background: #e2e2e2;
+ color: rgba(255, 255, 255, 0.9);
+}
+.ui.table td.marked.secondary.left,
+.ui.table tr.marked.secondary.left {
+ -webkit-box-shadow: 0.2em 0 0 0 #1B1C1D inset;
+ box-shadow: 0.2em 0 0 0 #1B1C1D inset;
+}
+.ui.table td.marked.secondary.right,
+.ui.table tr.marked.secondary.right {
+ -webkit-box-shadow: -0.2em 0 0 0 #1B1C1D inset;
+ box-shadow: -0.2em 0 0 0 #1B1C1D inset;
+}
+.ui.inverted.table td.marked.secondary.left,
+.ui.inverted.table tr.marked.secondary.left {
+ -webkit-box-shadow: 0.2em 0 0 0 #545454 inset;
+ box-shadow: 0.2em 0 0 0 #545454 inset;
+}
+.ui.inverted.table td.marked.secondary.right,
+.ui.inverted.table tr.marked.secondary.right {
+ -webkit-box-shadow: -0.2em 0 0 0 #545454 inset;
+ box-shadow: -0.2em 0 0 0 #545454 inset;
+}
+.ui.red.table {
+ border-top: 0.2em solid #DB2828;
+}
+.ui.inverted.red.table {
+ background-color: #DB2828;
+ color: #FFFFFF;
+}
+.ui.ui.ui.ui.table tr.red:not(.marked),
+.ui.ui.table td.red:not(.marked) {
+ background: #ffe1df;
+ color: #DB2828;
+}
+.ui.ui.selectable.table tr.red:not(.marked):hover,
+.ui.table tr td.selectable.red:not(.marked):hover,
+.ui.selectable.table tr:hover td.red:not(.marked) {
+ background: #ffd7d5;
+ color: #DB2828;
+}
+.ui.table td.marked.red.left,
+.ui.table tr.marked.red.left {
+ -webkit-box-shadow: 0.2em 0 0 0 #DB2828 inset;
+ box-shadow: 0.2em 0 0 0 #DB2828 inset;
+}
+.ui.table td.marked.red.right,
+.ui.table tr.marked.red.right {
+ -webkit-box-shadow: -0.2em 0 0 0 #DB2828 inset;
+ box-shadow: -0.2em 0 0 0 #DB2828 inset;
+}
+.ui.inverted.table td.marked.red.left,
+.ui.inverted.table tr.marked.red.left {
+ -webkit-box-shadow: 0.2em 0 0 0 #FF695E inset;
+ box-shadow: 0.2em 0 0 0 #FF695E inset;
+}
+.ui.inverted.table td.marked.red.right,
+.ui.inverted.table tr.marked.red.right {
+ -webkit-box-shadow: -0.2em 0 0 0 #FF695E inset;
+ box-shadow: -0.2em 0 0 0 #FF695E inset;
+}
+.ui.orange.table {
+ border-top: 0.2em solid #F2711C;
+}
+.ui.inverted.orange.table {
+ background-color: #F2711C;
+ color: #FFFFFF;
+}
+.ui.ui.ui.ui.table tr.orange:not(.marked),
+.ui.ui.table td.orange:not(.marked) {
+ background: #ffe7d1;
+ color: #F2711C;
+}
+.ui.ui.selectable.table tr.orange:not(.marked):hover,
+.ui.table tr td.selectable.orange:not(.marked):hover,
+.ui.selectable.table tr:hover td.orange:not(.marked) {
+ background: #fae1cc;
+ color: #F2711C;
+}
+.ui.table td.marked.orange.left,
+.ui.table tr.marked.orange.left {
+ -webkit-box-shadow: 0.2em 0 0 0 #F2711C inset;
+ box-shadow: 0.2em 0 0 0 #F2711C inset;
+}
+.ui.table td.marked.orange.right,
+.ui.table tr.marked.orange.right {
+ -webkit-box-shadow: -0.2em 0 0 0 #F2711C inset;
+ box-shadow: -0.2em 0 0 0 #F2711C inset;
+}
+.ui.inverted.table td.marked.orange.left,
+.ui.inverted.table tr.marked.orange.left {
+ -webkit-box-shadow: 0.2em 0 0 0 #FF851B inset;
+ box-shadow: 0.2em 0 0 0 #FF851B inset;
+}
+.ui.inverted.table td.marked.orange.right,
+.ui.inverted.table tr.marked.orange.right {
+ -webkit-box-shadow: -0.2em 0 0 0 #FF851B inset;
+ box-shadow: -0.2em 0 0 0 #FF851B inset;
+}
+.ui.yellow.table {
+ border-top: 0.2em solid #FBBD08;
+}
+.ui.inverted.yellow.table {
+ background-color: #FBBD08;
+ color: #FFFFFF;
+}
+.ui.ui.ui.ui.table tr.yellow:not(.marked),
+.ui.ui.table td.yellow:not(.marked) {
+ background: #fff9d2;
+ color: #B58105;
+}
+.ui.ui.selectable.table tr.yellow:not(.marked):hover,
+.ui.table tr td.selectable.yellow:not(.marked):hover,
+.ui.selectable.table tr:hover td.yellow:not(.marked) {
+ background: #fbf5cc;
+ color: #B58105;
+}
+.ui.table td.marked.yellow.left,
+.ui.table tr.marked.yellow.left {
+ -webkit-box-shadow: 0.2em 0 0 0 #FBBD08 inset;
+ box-shadow: 0.2em 0 0 0 #FBBD08 inset;
+}
+.ui.table td.marked.yellow.right,
+.ui.table tr.marked.yellow.right {
+ -webkit-box-shadow: -0.2em 0 0 0 #FBBD08 inset;
+ box-shadow: -0.2em 0 0 0 #FBBD08 inset;
+}
+.ui.inverted.table td.marked.yellow.left,
+.ui.inverted.table tr.marked.yellow.left {
+ -webkit-box-shadow: 0.2em 0 0 0 #FFE21F inset;
+ box-shadow: 0.2em 0 0 0 #FFE21F inset;
+}
+.ui.inverted.table td.marked.yellow.right,
+.ui.inverted.table tr.marked.yellow.right {
+ -webkit-box-shadow: -0.2em 0 0 0 #FFE21F inset;
+ box-shadow: -0.2em 0 0 0 #FFE21F inset;
+}
+.ui.olive.table {
+ border-top: 0.2em solid #B5CC18;
+}
+.ui.inverted.olive.table {
+ background-color: #B5CC18;
+ color: #FFFFFF;
+}
+.ui.ui.ui.ui.table tr.olive:not(.marked),
+.ui.ui.table td.olive:not(.marked) {
+ background: #f7fae4;
+ color: #8ABC1E;
+}
+.ui.ui.selectable.table tr.olive:not(.marked):hover,
+.ui.table tr td.selectable.olive:not(.marked):hover,
+.ui.selectable.table tr:hover td.olive:not(.marked) {
+ background: #f6fada;
+ color: #8ABC1E;
+}
+.ui.table td.marked.olive.left,
+.ui.table tr.marked.olive.left {
+ -webkit-box-shadow: 0.2em 0 0 0 #B5CC18 inset;
+ box-shadow: 0.2em 0 0 0 #B5CC18 inset;
+}
+.ui.table td.marked.olive.right,
+.ui.table tr.marked.olive.right {
+ -webkit-box-shadow: -0.2em 0 0 0 #B5CC18 inset;
+ box-shadow: -0.2em 0 0 0 #B5CC18 inset;
+}
+.ui.inverted.table td.marked.olive.left,
+.ui.inverted.table tr.marked.olive.left {
+ -webkit-box-shadow: 0.2em 0 0 0 #D9E778 inset;
+ box-shadow: 0.2em 0 0 0 #D9E778 inset;
+}
+.ui.inverted.table td.marked.olive.right,
+.ui.inverted.table tr.marked.olive.right {
+ -webkit-box-shadow: -0.2em 0 0 0 #D9E778 inset;
+ box-shadow: -0.2em 0 0 0 #D9E778 inset;
+}
+.ui.green.table {
+ border-top: 0.2em solid #21BA45;
+}
+.ui.inverted.green.table {
+ background-color: #21BA45;
+ color: #FFFFFF;
+}
+.ui.ui.ui.ui.table tr.green:not(.marked),
+.ui.ui.table td.green:not(.marked) {
+ background: #d5f5d9;
+ color: #1EBC30;
+}
+.ui.ui.selectable.table tr.green:not(.marked):hover,
+.ui.table tr td.selectable.green:not(.marked):hover,
+.ui.selectable.table tr:hover td.green:not(.marked) {
+ background: #d2eed5;
+ color: #1EBC30;
+}
+.ui.table td.marked.green.left,
+.ui.table tr.marked.green.left {
+ -webkit-box-shadow: 0.2em 0 0 0 #21BA45 inset;
+ box-shadow: 0.2em 0 0 0 #21BA45 inset;
+}
+.ui.table td.marked.green.right,
+.ui.table tr.marked.green.right {
+ -webkit-box-shadow: -0.2em 0 0 0 #21BA45 inset;
+ box-shadow: -0.2em 0 0 0 #21BA45 inset;
+}
+.ui.inverted.table td.marked.green.left,
+.ui.inverted.table tr.marked.green.left {
+ -webkit-box-shadow: 0.2em 0 0 0 #2ECC40 inset;
+ box-shadow: 0.2em 0 0 0 #2ECC40 inset;
+}
+.ui.inverted.table td.marked.green.right,
+.ui.inverted.table tr.marked.green.right {
+ -webkit-box-shadow: -0.2em 0 0 0 #2ECC40 inset;
+ box-shadow: -0.2em 0 0 0 #2ECC40 inset;
+}
+.ui.teal.table {
+ border-top: 0.2em solid #00B5AD;
+}
+.ui.inverted.teal.table {
+ background-color: #00B5AD;
+ color: #FFFFFF;
+}
+.ui.ui.ui.ui.table tr.teal:not(.marked),
+.ui.ui.table td.teal:not(.marked) {
+ background: #e2ffff;
+ color: #10A3A3;
+}
+.ui.ui.selectable.table tr.teal:not(.marked):hover,
+.ui.table tr td.selectable.teal:not(.marked):hover,
+.ui.selectable.table tr:hover td.teal:not(.marked) {
+ background: #d8ffff;
+ color: #10A3A3;
+}
+.ui.table td.marked.teal.left,
+.ui.table tr.marked.teal.left {
+ -webkit-box-shadow: 0.2em 0 0 0 #00B5AD inset;
+ box-shadow: 0.2em 0 0 0 #00B5AD inset;
+}
+.ui.table td.marked.teal.right,
+.ui.table tr.marked.teal.right {
+ -webkit-box-shadow: -0.2em 0 0 0 #00B5AD inset;
+ box-shadow: -0.2em 0 0 0 #00B5AD inset;
+}
+.ui.inverted.table td.marked.teal.left,
+.ui.inverted.table tr.marked.teal.left {
+ -webkit-box-shadow: 0.2em 0 0 0 #6DFFFF inset;
+ box-shadow: 0.2em 0 0 0 #6DFFFF inset;
+}
+.ui.inverted.table td.marked.teal.right,
+.ui.inverted.table tr.marked.teal.right {
+ -webkit-box-shadow: -0.2em 0 0 0 #6DFFFF inset;
+ box-shadow: -0.2em 0 0 0 #6DFFFF inset;
+}
+.ui.blue.table {
+ border-top: 0.2em solid #2185D0;
+}
+.ui.inverted.blue.table {
+ background-color: #2185D0;
+ color: #FFFFFF;
+}
+.ui.ui.ui.ui.table tr.blue:not(.marked),
+.ui.ui.table td.blue:not(.marked) {
+ background: #ddf4ff;
+ color: #2185D0;
+}
+.ui.ui.selectable.table tr.blue:not(.marked):hover,
+.ui.table tr td.selectable.blue:not(.marked):hover,
+.ui.selectable.table tr:hover td.blue:not(.marked) {
+ background: #d3f1ff;
+ color: #2185D0;
+}
+.ui.table td.marked.blue.left,
+.ui.table tr.marked.blue.left {
+ -webkit-box-shadow: 0.2em 0 0 0 #2185D0 inset;
+ box-shadow: 0.2em 0 0 0 #2185D0 inset;
+}
+.ui.table td.marked.blue.right,
+.ui.table tr.marked.blue.right {
+ -webkit-box-shadow: -0.2em 0 0 0 #2185D0 inset;
+ box-shadow: -0.2em 0 0 0 #2185D0 inset;
+}
+.ui.inverted.table td.marked.blue.left,
+.ui.inverted.table tr.marked.blue.left {
+ -webkit-box-shadow: 0.2em 0 0 0 #54C8FF inset;
+ box-shadow: 0.2em 0 0 0 #54C8FF inset;
+}
+.ui.inverted.table td.marked.blue.right,
+.ui.inverted.table tr.marked.blue.right {
+ -webkit-box-shadow: -0.2em 0 0 0 #54C8FF inset;
+ box-shadow: -0.2em 0 0 0 #54C8FF inset;
+}
+.ui.violet.table {
+ border-top: 0.2em solid #6435C9;
+}
+.ui.inverted.violet.table {
+ background-color: #6435C9;
+ color: #FFFFFF;
+}
+.ui.ui.ui.ui.table tr.violet:not(.marked),
+.ui.ui.table td.violet:not(.marked) {
+ background: #ece9fe;
+ color: #6435C9;
+}
+.ui.ui.selectable.table tr.violet:not(.marked):hover,
+.ui.table tr td.selectable.violet:not(.marked):hover,
+.ui.selectable.table tr:hover td.violet:not(.marked) {
+ background: #e3deff;
+ color: #6435C9;
+}
+.ui.table td.marked.violet.left,
+.ui.table tr.marked.violet.left {
+ -webkit-box-shadow: 0.2em 0 0 0 #6435C9 inset;
+ box-shadow: 0.2em 0 0 0 #6435C9 inset;
+}
+.ui.table td.marked.violet.right,
+.ui.table tr.marked.violet.right {
+ -webkit-box-shadow: -0.2em 0 0 0 #6435C9 inset;
+ box-shadow: -0.2em 0 0 0 #6435C9 inset;
+}
+.ui.inverted.table td.marked.violet.left,
+.ui.inverted.table tr.marked.violet.left {
+ -webkit-box-shadow: 0.2em 0 0 0 #A291FB inset;
+ box-shadow: 0.2em 0 0 0 #A291FB inset;
+}
+.ui.inverted.table td.marked.violet.right,
+.ui.inverted.table tr.marked.violet.right {
+ -webkit-box-shadow: -0.2em 0 0 0 #A291FB inset;
+ box-shadow: -0.2em 0 0 0 #A291FB inset;
+}
+.ui.purple.table {
+ border-top: 0.2em solid #A333C8;
+}
+.ui.inverted.purple.table {
+ background-color: #A333C8;
+ color: #FFFFFF;
+}
+.ui.ui.ui.ui.table tr.purple:not(.marked),
+.ui.ui.table td.purple:not(.marked) {
+ background: #f8e3ff;
+ color: #A333C8;
+}
+.ui.ui.selectable.table tr.purple:not(.marked):hover,
+.ui.table tr td.selectable.purple:not(.marked):hover,
+.ui.selectable.table tr:hover td.purple:not(.marked) {
+ background: #f5d9ff;
+ color: #A333C8;
+}
+.ui.table td.marked.purple.left,
+.ui.table tr.marked.purple.left {
+ -webkit-box-shadow: 0.2em 0 0 0 #A333C8 inset;
+ box-shadow: 0.2em 0 0 0 #A333C8 inset;
+}
+.ui.table td.marked.purple.right,
+.ui.table tr.marked.purple.right {
+ -webkit-box-shadow: -0.2em 0 0 0 #A333C8 inset;
+ box-shadow: -0.2em 0 0 0 #A333C8 inset;
+}
+.ui.inverted.table td.marked.purple.left,
+.ui.inverted.table tr.marked.purple.left {
+ -webkit-box-shadow: 0.2em 0 0 0 #DC73FF inset;
+ box-shadow: 0.2em 0 0 0 #DC73FF inset;
+}
+.ui.inverted.table td.marked.purple.right,
+.ui.inverted.table tr.marked.purple.right {
+ -webkit-box-shadow: -0.2em 0 0 0 #DC73FF inset;
+ box-shadow: -0.2em 0 0 0 #DC73FF inset;
+}
+.ui.pink.table {
+ border-top: 0.2em solid #E03997;
+}
+.ui.inverted.pink.table {
+ background-color: #E03997;
+ color: #FFFFFF;
+}
+.ui.ui.ui.ui.table tr.pink:not(.marked),
+.ui.ui.table td.pink:not(.marked) {
+ background: #ffe8f9;
+ color: #E03997;
+}
+.ui.ui.selectable.table tr.pink:not(.marked):hover,
+.ui.table tr td.selectable.pink:not(.marked):hover,
+.ui.selectable.table tr:hover td.pink:not(.marked) {
+ background: #ffdef6;
+ color: #E03997;
+}
+.ui.table td.marked.pink.left,
+.ui.table tr.marked.pink.left {
+ -webkit-box-shadow: 0.2em 0 0 0 #E03997 inset;
+ box-shadow: 0.2em 0 0 0 #E03997 inset;
+}
+.ui.table td.marked.pink.right,
+.ui.table tr.marked.pink.right {
+ -webkit-box-shadow: -0.2em 0 0 0 #E03997 inset;
+ box-shadow: -0.2em 0 0 0 #E03997 inset;
+}
+.ui.inverted.table td.marked.pink.left,
+.ui.inverted.table tr.marked.pink.left {
+ -webkit-box-shadow: 0.2em 0 0 0 #FF8EDF inset;
+ box-shadow: 0.2em 0 0 0 #FF8EDF inset;
+}
+.ui.inverted.table td.marked.pink.right,
+.ui.inverted.table tr.marked.pink.right {
+ -webkit-box-shadow: -0.2em 0 0 0 #FF8EDF inset;
+ box-shadow: -0.2em 0 0 0 #FF8EDF inset;
+}
+.ui.brown.table {
+ border-top: 0.2em solid #A5673F;
+}
+.ui.inverted.brown.table {
+ background-color: #A5673F;
+ color: #FFFFFF;
+}
+.ui.ui.ui.ui.table tr.brown:not(.marked),
+.ui.ui.table td.brown:not(.marked) {
+ background: #f7e5d2;
+ color: #A5673F;
+}
+.ui.ui.selectable.table tr.brown:not(.marked):hover,
+.ui.table tr td.selectable.brown:not(.marked):hover,
+.ui.selectable.table tr:hover td.brown:not(.marked) {
+ background: #efe0cf;
+ color: #A5673F;
+}
+.ui.table td.marked.brown.left,
+.ui.table tr.marked.brown.left {
+ -webkit-box-shadow: 0.2em 0 0 0 #A5673F inset;
+ box-shadow: 0.2em 0 0 0 #A5673F inset;
+}
+.ui.table td.marked.brown.right,
+.ui.table tr.marked.brown.right {
+ -webkit-box-shadow: -0.2em 0 0 0 #A5673F inset;
+ box-shadow: -0.2em 0 0 0 #A5673F inset;
+}
+.ui.inverted.table td.marked.brown.left,
+.ui.inverted.table tr.marked.brown.left {
+ -webkit-box-shadow: 0.2em 0 0 0 #D67C1C inset;
+ box-shadow: 0.2em 0 0 0 #D67C1C inset;
+}
+.ui.inverted.table td.marked.brown.right,
+.ui.inverted.table tr.marked.brown.right {
+ -webkit-box-shadow: -0.2em 0 0 0 #D67C1C inset;
+ box-shadow: -0.2em 0 0 0 #D67C1C inset;
+}
+.ui.grey.table {
+ border-top: 0.2em solid #767676;
+}
+.ui.inverted.grey.table {
+ background-color: #767676;
+ color: #FFFFFF;
+}
+.ui.ui.ui.ui.table tr.grey:not(.marked),
+.ui.ui.table td.grey:not(.marked) {
+ background: #DCDDDE;
+ color: #767676;
+}
+.ui.ui.selectable.table tr.grey:not(.marked):hover,
+.ui.table tr td.selectable.grey:not(.marked):hover,
+.ui.selectable.table tr:hover td.grey:not(.marked) {
+ background: #c2c4c5;
+ color: #767676;
+}
+.ui.table td.marked.grey.left,
+.ui.table tr.marked.grey.left {
+ -webkit-box-shadow: 0.2em 0 0 0 #767676 inset;
+ box-shadow: 0.2em 0 0 0 #767676 inset;
+}
+.ui.table td.marked.grey.right,
+.ui.table tr.marked.grey.right {
+ -webkit-box-shadow: -0.2em 0 0 0 #767676 inset;
+ box-shadow: -0.2em 0 0 0 #767676 inset;
+}
+.ui.inverted.table td.marked.grey.left,
+.ui.inverted.table tr.marked.grey.left {
+ -webkit-box-shadow: 0.2em 0 0 0 #DCDDDE inset;
+ box-shadow: 0.2em 0 0 0 #DCDDDE inset;
+}
+.ui.inverted.table td.marked.grey.right,
+.ui.inverted.table tr.marked.grey.right {
+ -webkit-box-shadow: -0.2em 0 0 0 #DCDDDE inset;
+ box-shadow: -0.2em 0 0 0 #DCDDDE inset;
+}
+.ui.black.table {
+ border-top: 0.2em solid #1B1C1D;
+}
+.ui.inverted.black.table {
+ background-color: #1B1C1D;
+ color: #FFFFFF;
+}
+.ui.ui.ui.ui.table tr.black:not(.marked),
+.ui.ui.table td.black:not(.marked) {
+ background: #545454;
+ color: #FFFFFF;
+}
+.ui.ui.selectable.table tr.black:not(.marked):hover,
+.ui.table tr td.selectable.black:not(.marked):hover,
+.ui.selectable.table tr:hover td.black:not(.marked) {
+ background: #000000;
+ color: #FFFFFF;
+}
+.ui.table td.marked.black.left,
+.ui.table tr.marked.black.left {
+ -webkit-box-shadow: 0.2em 0 0 0 #1B1C1D inset;
+ box-shadow: 0.2em 0 0 0 #1B1C1D inset;
+}
+.ui.table td.marked.black.right,
+.ui.table tr.marked.black.right {
+ -webkit-box-shadow: -0.2em 0 0 0 #1B1C1D inset;
+ box-shadow: -0.2em 0 0 0 #1B1C1D inset;
+}
+.ui.inverted.table td.marked.black.left,
+.ui.inverted.table tr.marked.black.left {
+ -webkit-box-shadow: 0.2em 0 0 0 #545454 inset;
+ box-shadow: 0.2em 0 0 0 #545454 inset;
+}
+.ui.inverted.table td.marked.black.right,
+.ui.inverted.table tr.marked.black.right {
+ -webkit-box-shadow: -0.2em 0 0 0 #545454 inset;
+ box-shadow: -0.2em 0 0 0 #545454 inset;
+}
+
+/*--------------
+ Column Count
+---------------*/
+
+
+/* Grid Based */
+.ui.one.column.table td {
+ width: 100%;
+}
+.ui.two.column.table td {
+ width: 50%;
+}
+.ui.three.column.table td {
+ width: 33.33333333%;
+}
+.ui.four.column.table td {
+ width: 25%;
+}
+.ui.five.column.table td {
+ width: 20%;
+}
+.ui.six.column.table td {
+ width: 16.66666667%;
+}
+.ui.seven.column.table td {
+ width: 14.28571429%;
+}
+.ui.eight.column.table td {
+ width: 12.5%;
+}
+.ui.nine.column.table td {
+ width: 11.11111111%;
+}
+.ui.ten.column.table td {
+ width: 10%;
+}
+.ui.eleven.column.table td {
+ width: 9.09090909%;
+}
+.ui.twelve.column.table td {
+ width: 8.33333333%;
+}
+.ui.thirteen.column.table td {
+ width: 7.69230769%;
+}
+.ui.fourteen.column.table td {
+ width: 7.14285714%;
+}
+.ui.fifteen.column.table td {
+ width: 6.66666667%;
+}
+.ui.sixteen.column.table td {
+ width: 6.25%;
+}
+
+/* Column Width */
+.ui.table th.one.wide,
+.ui.table td.one.wide {
+ width: 6.25%;
+}
+.ui.table th.two.wide,
+.ui.table td.two.wide {
+ width: 12.5%;
+}
+.ui.table th.three.wide,
+.ui.table td.three.wide {
+ width: 18.75%;
+}
+.ui.table th.four.wide,
+.ui.table td.four.wide {
+ width: 25%;
+}
+.ui.table th.five.wide,
+.ui.table td.five.wide {
+ width: 31.25%;
+}
+.ui.table th.six.wide,
+.ui.table td.six.wide {
+ width: 37.5%;
+}
+.ui.table th.seven.wide,
+.ui.table td.seven.wide {
+ width: 43.75%;
+}
+.ui.table th.eight.wide,
+.ui.table td.eight.wide {
+ width: 50%;
+}
+.ui.table th.nine.wide,
+.ui.table td.nine.wide {
+ width: 56.25%;
+}
+.ui.table th.ten.wide,
+.ui.table td.ten.wide {
+ width: 62.5%;
+}
+.ui.table th.eleven.wide,
+.ui.table td.eleven.wide {
+ width: 68.75%;
+}
+.ui.table th.twelve.wide,
+.ui.table td.twelve.wide {
+ width: 75%;
+}
+.ui.table th.thirteen.wide,
+.ui.table td.thirteen.wide {
+ width: 81.25%;
+}
+.ui.table th.fourteen.wide,
+.ui.table td.fourteen.wide {
+ width: 87.5%;
+}
+.ui.table th.fifteen.wide,
+.ui.table td.fifteen.wide {
+ width: 93.75%;
+}
+.ui.table th.sixteen.wide,
+.ui.table td.sixteen.wide {
+ width: 100%;
+}
+
+/*--------------
+ Sortable
+ ---------------*/
+
+.ui.sortable.table > thead > tr > th {
+ cursor: pointer;
+ white-space: nowrap;
+ border-left: 1px solid rgba(34, 36, 38, 0.15);
+ color: rgba(0, 0, 0, 0.87);
+}
+.ui.sortable.table > thead > tr > th:first-child {
+ border-left: none;
+}
+.ui.sortable.table thead th.sorted,
+.ui.sortable.table thead th.sorted:hover {
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+}
+.ui.sortable.table > thead > tr > th:after {
+ display: none;
+ font-style: normal;
+ font-weight: normal;
+ text-decoration: inherit;
+ content: '';
+ height: 1em;
+ width: auto;
+ opacity: 0.8;
+ margin: 0 0 0 0.5em;
+ font-family: 'Icons';
+}
+.ui.sortable.table thead th.ascending:after {
+ content: '\f0d8';
+}
+.ui.sortable.table thead th.descending:after {
+ content: '\f0d7';
+}
+
+/* Hover */
+.ui.sortable.table th.disabled:hover {
+ cursor: auto;
+ color: rgba(40, 40, 40, 0.3);
+}
+.ui.sortable.table > thead > tr > th:hover {
+ color: rgba(0, 0, 0, 0.8);
+}
+.ui.sortable.table:not(.basic) > thead > tr > th:hover {
+ background: rgba(0, 0, 0, 0.05);
+}
+
+/* Sorted */
+.ui.sortable.table thead th.sorted {
+ color: rgba(0, 0, 0, 0.95);
+}
+.ui.sortable.table:not(.basic) thead th.sorted {
+ background: rgba(0, 0, 0, 0.05);
+}
+.ui.sortable.table thead th.sorted:after {
+ display: inline-block;
+}
+
+/* Sorted Hover */
+.ui.sortable.table thead th.sorted:hover {
+ color: rgba(0, 0, 0, 0.95);
+}
+.ui.sortable.table:not(.basic) thead th.sorted:hover {
+ background: rgba(0, 0, 0, 0.05);
+}
+
+/* Inverted */
+.ui.inverted.sortable.table thead th.sorted {
+ color: #ffffff;
+}
+.ui.inverted.sortable.table:not(.basic) thead th.sorted {
+ background: rgba(255, 255, 255, 0.15) -webkit-gradient(linear, left top, left bottom, from(transparent), to(rgba(0, 0, 0, 0.05)));
+ background: rgba(255, 255, 255, 0.15) -webkit-linear-gradient(transparent, rgba(0, 0, 0, 0.05));
+ background: rgba(255, 255, 255, 0.15) linear-gradient(transparent, rgba(0, 0, 0, 0.05));
+}
+.ui.inverted.sortable.table > thead > tr > th:hover {
+ color: #ffffff;
+}
+.ui.inverted.sortable.table:not(.basic) > thead > tr > th:hover {
+ background: rgba(255, 255, 255, 0.08) -webkit-gradient(linear, left top, left bottom, from(transparent), to(rgba(0, 0, 0, 0.05)));
+ background: rgba(255, 255, 255, 0.08) -webkit-linear-gradient(transparent, rgba(0, 0, 0, 0.05));
+ background: rgba(255, 255, 255, 0.08) linear-gradient(transparent, rgba(0, 0, 0, 0.05));
+}
+.ui.inverted.sortable.table:not(.basic) > thead > tr > th {
+ border-left-color: transparent;
+ border-right-color: transparent;
+}
+
+/*--------------
+ Inverted
+ ---------------*/
+
+
+/* Text Color */
+.ui.inverted.table {
+ background: #333333;
+ color: rgba(255, 255, 255, 0.9);
+ border: none;
+}
+.ui.ui.inverted.table > thead > tr > th,
+.ui.ui.inverted.table > tbody > tr > th,
+.ui.ui.inverted.table > tfoot > tr > th,
+.ui.ui.inverted.table > tfoot > tr > td,
+.ui.ui.inverted.table > tr > th {
+ background-color: rgba(0, 0, 0, 0.15);
+ border-color: rgba(255, 255, 255, 0.1);
+ color: rgba(255, 255, 255, 0.9);
+}
+.ui.inverted.table > tbody > tr > td,
+.ui.inverted.table > tfoot > tr > td,
+.ui.inverted.table > tr > td {
+ border-color: rgba(255, 255, 255, 0.1);
+}
+.ui.inverted.table tr.disabled td,
+.ui.inverted.table tr td.disabled,
+.ui.inverted.table tr.disabled:hover td,
+.ui.inverted.table tr:hover td.disabled {
+ pointer-events: none;
+ color: rgba(225, 225, 225, 0.3);
+}
+.ui.inverted.table tr td.disabled:not([class="disabled"]),
+.ui.inverted.table tr.disabled:not([class="disabled"]) td,
+.ui.inverted.table tr.disabled td[class]:not(.disabled),
+.ui.inverted.table tr:hover td.disabled:not([class="disabled"]) {
+ color: rgba(40, 40, 40, 0.3);
+}
+
+/* Definition */
+.ui.inverted.definition.table > tfoot:not(.full-width) > tr > th:first-child,
+.ui.inverted.definition.table > thead:not(.full-width) > tr > th:first-child {
+ background: #FFFFFF;
+}
+.ui.inverted.definition.table > tbody > tr > td:first-child,
+.ui.inverted.definition.table > tfoot > tr > td:first-child,
+.ui.inverted.definition.table > tr > td:first-child {
+ background: rgba(255, 255, 255, 0.02);
+ color: #ffffff;
+}
+
+/*--------------
+ Collapsing
+ ---------------*/
+
+.ui.collapsing.table {
+ width: auto;
+}
+
+/*--------------
+ Basic
+ ---------------*/
+
+.ui.basic.table {
+ background: transparent;
+ border: 1px solid rgba(34, 36, 38, 0.15);
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
+.ui.basic.table > thead,
+.ui.basic.table > tfoot {
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
+.ui.basic.table > thead > tr > th,
+.ui.basic.table > tbody > tr > th,
+.ui.basic.table > tfoot > tr > th,
+.ui.basic.table > tr > th {
+ background: transparent;
+ border-left: none;
+}
+.ui.basic.table > tbody > tr {
+ border-bottom: 1px solid rgba(0, 0, 0, 0.1);
+}
+.ui.basic.table > tbody > tr > td,
+.ui.basic.table > tfoot > tr > td,
+.ui.basic.table > tr > td {
+ background: transparent;
+}
+.ui.basic.striped.table > tbody > tr:nth-child(2n) {
+ background-color: rgba(0, 0, 0, 0.05);
+}
+
+/* Very Basic */
+.ui[class*="very basic"].table {
+ border: none;
+}
+.ui[class*="very basic"].table:not(.sortable):not(.striped) > tr > th,
+.ui[class*="very basic"].table:not(.sortable):not(.striped) > thead > tr > th,
+.ui[class*="very basic"].table:not(.sortable):not(.striped) > tbody > tr > th,
+.ui[class*="very basic"].table:not(.sortable):not(.striped) > tfoot > tr > th,
+.ui[class*="very basic"].table:not(.sortable):not(.striped) > tr > td,
+.ui[class*="very basic"].table:not(.sortable):not(.striped) > tbody > tr > td {
+ padding: '';
+}
+.ui[class*="very basic"].table:not(.sortable):not(.striped) > tr > th:first-child,
+.ui[class*="very basic"].table:not(.sortable):not(.striped) > thead > tr > th:first-child,
+.ui[class*="very basic"].table:not(.sortable):not(.striped) > tbody > tr > th:first-child,
+.ui[class*="very basic"].table:not(.sortable):not(.striped) > tfoot > tr > th:first-child,
+.ui[class*="very basic"].table:not(.sortable):not(.striped) > tr > td:first-child,
+.ui[class*="very basic"].table:not(.sortable):not(.striped) > tbody > tr > td:first-child,
+.ui[class*="very basic"].table:not(.sortable):not(.striped) > tfoot > tr > td:first-child {
+ padding-left: 0;
+}
+.ui[class*="very basic"].table:not(.sortable):not(.striped) > tr > th:last-child,
+.ui[class*="very basic"].table:not(.sortable):not(.striped) > thead > tr > th:last-child,
+.ui[class*="very basic"].table:not(.sortable):not(.striped) > tbody > tr > th:last-child,
+.ui[class*="very basic"].table:not(.sortable):not(.striped) > tfoot > tr > th:last-child,
+.ui[class*="very basic"].table:not(.sortable):not(.striped) > tr > td:last-child,
+.ui[class*="very basic"].table:not(.sortable):not(.striped) > tbody > tr > td:last-child,
+.ui[class*="very basic"].table:not(.sortable):not(.striped) > tfoot > tr > td:last-child {
+ padding-right: 0;
+}
+.ui[class*="very basic"].table:not(.sortable):not(.striped) > thead > tr:first-child > th {
+ padding-top: 0;
+}
+
+/*--------------
+ Celled
+ ---------------*/
+
+.ui.celled.table > tr > th,
+.ui.celled.table > thead > tr > th,
+.ui.celled.table > tbody > tr > th,
+.ui.celled.table > tfoot > tr > th,
+.ui.celled.table > tr > td,
+.ui.celled.table > tbody > tr > td,
+.ui.celled.table > tfoot > tr > td {
+ border-left: 1px solid rgba(34, 36, 38, 0.1);
+}
+.ui.inverted.celled.table > tbody > tr > td,
+.ui.inverted.celled.table > tr > td {
+ border-left: 1px solid rgba(255, 255, 255, 0.1);
+}
+.ui.celled.table > tr > th:first-child,
+.ui.celled.table > thead > tr > th:first-child,
+.ui.celled.table > tbody > tr > th:first-child,
+.ui.celled.table > tfoot > tr > th:first-child,
+.ui.celled.table > tr > td:first-child,
+.ui.celled.table > tbody > tr > td:first-child,
+.ui.celled.table > tfoot > tr > td:first-child {
+ border-left: none;
+}
+
+/*--------------
+ Padded
+ ---------------*/
+
+.ui.padded.table > tr > th,
+.ui.padded.table > thead > tr > th,
+.ui.padded.table > tbody > tr > th,
+.ui.padded.table > tfoot > tr > th {
+ padding-left: 1em;
+ padding-right: 1em;
+}
+.ui.padded.table > tr > th,
+.ui.padded.table > thead > tr > th,
+.ui.padded.table > tbody > tr > th,
+.ui.padded.table > tfoot > tr > th,
+.ui.padded.table > tr > td,
+.ui.padded.table > tbody > tr > td,
+.ui.padded.table > tfoot > tr > td {
+ padding: 1em 1em;
+}
+
+/* Very */
+.ui[class*="very padded"].table > tr > th,
+.ui[class*="very padded"].table > thead > tr > th,
+.ui[class*="very padded"].table > tbody > tr > th,
+.ui[class*="very padded"].table > tfoot > tr > th {
+ padding-left: 1.5em;
+ padding-right: 1.5em;
+}
+.ui[class*="very padded"].table > tr > td,
+.ui[class*="very padded"].table > tbody > tr > td,
+.ui[class*="very padded"].table > tfoot > tr > td {
+ padding: 1.5em 1.5em;
+}
+
+/*--------------
+ Compact
+ ---------------*/
+
+.ui.compact.table > tr > th,
+.ui.compact.table > thead > tr > th,
+.ui.compact.table > tbody > tr > th,
+.ui.compact.table > tfoot > tr > th {
+ padding-left: 0.7em;
+ padding-right: 0.7em;
+}
+.ui.compact.table > tr > td,
+.ui.compact.table > tbody > tr > td,
+.ui.compact.table > tfoot > tr > td {
+ padding: 0.5em 0.7em;
+}
+
+/* Very */
+.ui[class*="very compact"].table > tr > th,
+.ui[class*="very compact"].table > thead > tr > th,
+.ui[class*="very compact"].table > tbody > tr > th,
+.ui[class*="very compact"].table > tfoot > tr > th {
+ padding-left: 0.6em;
+ padding-right: 0.6em;
+}
+.ui[class*="very compact"].table > tr > td,
+.ui[class*="very compact"].table > tbody > tr > td,
+.ui[class*="very compact"].table > tfoot > tr > td {
+ padding: 0.4em 0.6em;
+}
+
+/*--------------
+ Sizes
+---------------*/
+
+
+/* Standard */
+.ui.table {
+ font-size: 1em;
+}
+.ui.mini.table {
+ font-size: 0.78571429rem;
+}
+.ui.tiny.table {
+ font-size: 0.85714286rem;
+}
+.ui.small.table {
+ font-size: 0.9em;
+}
+.ui.large.table {
+ font-size: 1.1em;
+}
+.ui.big.table {
+ font-size: 1.28571429rem;
+}
+.ui.huge.table {
+ font-size: 1.42857143rem;
+}
+.ui.massive.table {
+ font-size: 1.71428571rem;
+}
+
+
+/*******************************
+ Site Overrides
+*******************************/
+
diff --git a/public/dist/components/table.min.css b/public/dist/components/table.min.css
new file mode 100644
index 000000000..895df249f
--- /dev/null
+++ b/public/dist/components/table.min.css
@@ -0,0 +1,9 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Table
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */.ui.table{width:100%;background:#fff;margin:1em 0;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:none;box-shadow:none;border-radius:.28571429rem;text-align:left;vertical-align:middle;color:rgba(0,0,0,.87);border-collapse:separate;border-spacing:0}.ui.table:first-child{margin-top:0}.ui.table:last-child{margin-bottom:0}.ui.table>tbody,.ui.table>thead{text-align:inherit;vertical-align:inherit}.ui.table td,.ui.table th{-webkit-transition:background .1s ease,color .1s ease;transition:background .1s ease,color .1s ease}.ui.table td.rowspanned,.ui.table th.rowspanned{display:none}.ui.table>thead{-webkit-box-shadow:none;box-shadow:none}.ui.table>thead>tr>th{cursor:auto;background:#f9fafb;text-align:inherit;color:rgba(0,0,0,.87);padding:.92857143em .78571429em;vertical-align:inherit;font-style:none;font-weight:700;text-transform:none;border-bottom:1px solid rgba(34,36,38,.1);border-left:none}.ui.table>thead>tr>th:first-child{border-left:none}.ui.table>thead>tr:first-child>th:first-child{border-radius:.28571429rem 0 0 0}.ui.table>thead>tr:first-child>th:last-child{border-radius:0 .28571429rem 0 0}.ui.table>thead>tr:first-child>th:only-child{border-radius:.28571429rem .28571429rem 0 0}.ui.table>tfoot{-webkit-box-shadow:none;box-shadow:none}.ui.table>tfoot>tr>td,.ui.table>tfoot>tr>th{cursor:auto;border-top:1px solid rgba(34,36,38,.15);background:#f9fafb;text-align:inherit;color:rgba(0,0,0,.87);padding:.78571429em .78571429em;vertical-align:inherit;font-style:normal;font-weight:400;text-transform:none}.ui.table>tfoot>tr>td:first-child,.ui.table>tfoot>tr>th:first-child{border-left:none}.ui.table>tfoot>tr:first-child>td:first-child,.ui.table>tfoot>tr:first-child>th:first-child{border-radius:0 0 0 .28571429rem}.ui.table>tfoot>tr:first-child>td:last-child,.ui.table>tfoot>tr:first-child>th:last-child{border-radius:0 0 .28571429rem 0}.ui.table>tfoot>tr:first-child>td:only-child,.ui.table>tfoot>tr:first-child>th:only-child{border-radius:0 0 .28571429rem .28571429rem}.ui.table>tbody>tr>td,.ui.table>tr>td{border-top:1px solid rgba(34,36,38,.1)}.ui.table>tbody>tr:first-child>td,.ui.table>tr:first-child>td{border-top:none}.ui.table>tbody+tbody tr:first-child>td{border-top:1px solid rgba(34,36,38,.1)}.ui.table>tbody>tr>td,.ui.table>tr>td{padding:.78571429em .78571429em;text-align:inherit}.ui.table>i.icon{vertical-align:baseline}.ui.table>i.icon:only-child{margin:0}.ui.table.segment{padding:0}.ui.table.segment:after{display:none}.ui.table.segment.stacked:after{display:block}@media only screen and (max-width:767.98px){.ui.table:not(.unstackable){width:100%;padding:0}.ui.table:not(.unstackable)>tbody,.ui.table:not(.unstackable)>tbody>tr,.ui.table:not(.unstackable)>tbody>tr>td:not(.rowspanned),.ui.table:not(.unstackable)>tbody>tr>th:not(.rowspanned),.ui.table:not(.unstackable)>tfoot,.ui.table:not(.unstackable)>tfoot>tr,.ui.table:not(.unstackable)>tfoot>tr>td:not(.rowspanned),.ui.table:not(.unstackable)>tfoot>tr>th:not(.rowspanned),.ui.table:not(.unstackable)>thead,.ui.table:not(.unstackable)>thead>tr,.ui.table:not(.unstackable)>thead>tr>th:not(.rowspanned),.ui.table:not(.unstackable)>tr,.ui.table:not(.unstackable)>tr>td:not(.rowspanned),.ui.table:not(.unstackable)>tr>th:not(.rowspanned){display:block!important;width:auto!important}.ui.table:not(.unstackable)>thead{display:block}.ui.table:not(.unstackable)>tfoot{display:block}.ui.ui.ui.ui.table:not(.unstackable)>tbody>tr,.ui.ui.ui.ui.table:not(.unstackable)>tfoot>tr,.ui.ui.ui.ui.table:not(.unstackable)>thead>tr,.ui.ui.ui.ui.table:not(.unstackable)>tr{padding-top:1em;padding-bottom:1em;-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset}.ui.ui.ui.ui.table:not(.unstackable)>tbody>tr>td,.ui.ui.ui.ui.table:not(.unstackable)>tbody>tr>th,.ui.ui.ui.ui.table:not(.unstackable)>tfoot>tr>td,.ui.ui.ui.ui.table:not(.unstackable)>tfoot>tr>th,.ui.ui.ui.ui.table:not(.unstackable)>thead>tr>th,.ui.ui.ui.ui.table:not(.unstackable)>tr>td,.ui.ui.ui.ui.table:not(.unstackable)>tr>th{background:0 0;border:none;padding:.25em .75em;-webkit-box-shadow:none;box-shadow:none}.ui.table:not(.unstackable)>tbody>tr>td:first-child,.ui.table:not(.unstackable)>tbody>tr>th:first-child,.ui.table:not(.unstackable)>tfoot>tr>td:first-child,.ui.table:not(.unstackable)>tfoot>tr>th:first-child,.ui.table:not(.unstackable)>thead>tr>th:first-child,.ui.table:not(.unstackable)>tr>td:first-child,.ui.table:not(.unstackable)>tr>th:first-child{font-weight:700}.ui.definition.table:not(.unstackable)>thead>tr>th:first-child{-webkit-box-shadow:none!important;box-shadow:none!important}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.primary.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #2185d0 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #2185d0 inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.primary.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #2185d0 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #2185d0 inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.primary.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #54c8ff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #54c8ff inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.primary.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #54c8ff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #54c8ff inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.secondary.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #1b1c1d inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #1b1c1d inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.secondary.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #1b1c1d inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #1b1c1d inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.secondary.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #545454 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #545454 inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.secondary.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #545454 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #545454 inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.red.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #db2828 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #db2828 inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.red.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #db2828 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #db2828 inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.red.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ff695e inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ff695e inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.red.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ff695e inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ff695e inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.orange.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #f2711c inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #f2711c inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.orange.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #f2711c inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #f2711c inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.orange.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ff851b inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ff851b inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.orange.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ff851b inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ff851b inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.yellow.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #fbbd08 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #fbbd08 inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.yellow.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #fbbd08 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #fbbd08 inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.yellow.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ffe21f inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ffe21f inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.yellow.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ffe21f inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ffe21f inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.olive.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #b5cc18 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #b5cc18 inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.olive.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #b5cc18 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #b5cc18 inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.olive.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #d9e778 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #d9e778 inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.olive.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #d9e778 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #d9e778 inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.green.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #21ba45 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #21ba45 inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.green.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #21ba45 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #21ba45 inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.green.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #2ecc40 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #2ecc40 inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.green.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #2ecc40 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #2ecc40 inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.teal.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #00b5ad inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #00b5ad inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.teal.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #00b5ad inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #00b5ad inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.teal.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #6dffff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #6dffff inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.teal.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #6dffff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #6dffff inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.blue.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #2185d0 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #2185d0 inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.blue.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #2185d0 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #2185d0 inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.blue.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #54c8ff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #54c8ff inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.blue.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #54c8ff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #54c8ff inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.violet.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #6435c9 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #6435c9 inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.violet.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #6435c9 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #6435c9 inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.violet.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #a291fb inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #a291fb inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.violet.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #a291fb inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #a291fb inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.purple.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #a333c8 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #a333c8 inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.purple.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #a333c8 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #a333c8 inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.purple.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #dc73ff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #dc73ff inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.purple.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #dc73ff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #dc73ff inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.pink.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #e03997 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #e03997 inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.pink.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #e03997 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #e03997 inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.pink.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ff8edf inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ff8edf inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.pink.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ff8edf inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ff8edf inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.brown.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #a5673f inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #a5673f inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.brown.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #a5673f inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #a5673f inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.brown.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #d67c1c inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #d67c1c inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.brown.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #d67c1c inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #d67c1c inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.grey.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #767676 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #767676 inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.grey.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #767676 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #767676 inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.grey.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #dcddde inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #dcddde inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.grey.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #dcddde inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #dcddde inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.black.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #1b1c1d inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #1b1c1d inset}.ui.ui.ui.ui.table:not(.unstackable) tr.marked.black.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #1b1c1d inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #1b1c1d inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.black.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #545454 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #545454 inset}.ui.ui.ui.ui.inverted.table:not(.unstackable) tr.marked.black.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #545454 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #545454 inset}}.ui.table .collapsing .image,.ui.table .collapsing .image img{max-width:none}.ui.structured.table{border-collapse:collapse}.ui.structured.table>thead>tr>th{border-left:none;border-right:none}.ui.structured.sortable.table>thead>tr>th{border-left:1px solid rgba(34,36,38,.15);border-right:1px solid rgba(34,36,38,.15)}.ui.structured.basic.table>tbody>tr>th,.ui.structured.basic.table>tfoot>tr>th,.ui.structured.basic.table>thead>tr>th,.ui.structured.basic.table>tr>th{border-left:none;border-right:none}.ui.structured.celled.table>tbody>tr>td,.ui.structured.celled.table>tbody>tr>th,.ui.structured.celled.table>tfoot>tr>td,.ui.structured.celled.table>tfoot>tr>th,.ui.structured.celled.table>thead>tr>th,.ui.structured.celled.table>tr>td,.ui.structured.celled.table>tr>th{border-left:1px solid rgba(34,36,38,.1);border-right:1px solid rgba(34,36,38,.1)}.ui.definition.table>thead:not(.full-width)>tr>th:first-child{pointer-events:none;background:#fff;font-weight:400;color:rgba(0,0,0,.4);-webkit-box-shadow:-.1em -.2em 0 .1em #fff;box-shadow:-.1em -.2em 0 .1em #fff;-moz-transform:scale(1)}.ui.definition.table>thead:not(.full-width)>tr>th:first-child:not(:empty){pointer-events:auto}.ui.definition.table>tfoot:not(.full-width)>tr>th:first-child{pointer-events:none;background:#fff;font-weight:400;color:rgba(0,0,0,.4);-webkit-box-shadow:-.1em .2em 0 .1em #fff;box-shadow:-.1em .2em 0 .1em #fff;-moz-transform:scale(1)}.ui.definition.table tr td.definition,.ui.definition.table>tbody>tr>td:first-child:not(.ignored),.ui.definition.table>tfoot>tr>td:first-child:not(.ignored),.ui.definition.table>tr>td:first-child:not(.ignored){background:rgba(0,0,0,.03);font-weight:700;color:rgba(0,0,0,.95);text-transform:'';-webkit-box-shadow:'';box-shadow:'';text-align:'';font-size:1em;padding-left:'';padding-right:''}.ui.definition.table>thead:not(.full-width)>tr>th:nth-child(2){border-left:1px solid rgba(34,36,38,.15)}.ui.definition.table>tfoot:not(.full-width)>tr>td:nth-child(2),.ui.definition.table>tfoot:not(.full-width)>tr>th:nth-child(2){border-left:1px solid rgba(34,36,38,.15)}.ui.definition.table>tbody>tr>td:nth-child(2),.ui.definition.table>tr>td:nth-child(2){border-left:1px solid rgba(34,36,38,.15)}.ui.ui.table td.positive,.ui.ui.ui.ui.table tr.positive{-webkit-box-shadow:0 0 0 #a3c293 inset;box-shadow:0 0 0 #a3c293 inset;background:#fcfff5;color:#2c662d}.ui.ui.table td.negative,.ui.ui.ui.ui.table tr.negative{-webkit-box-shadow:0 0 0 #e0b4b4 inset;box-shadow:0 0 0 #e0b4b4 inset;background:#fff6f6;color:#9f3a38}.ui.ui.table td.error,.ui.ui.ui.ui.table tr.error{-webkit-box-shadow:0 0 0 #e0b4b4 inset;box-shadow:0 0 0 #e0b4b4 inset;background:#fff6f6;color:#9f3a38}.ui.ui.table td.warning,.ui.ui.ui.ui.table tr.warning{-webkit-box-shadow:0 0 0 #c9ba9b inset;box-shadow:0 0 0 #c9ba9b inset;background:#fffaf3;color:#573a08}.ui.ui.table td.active,.ui.ui.ui.ui.table tr.active{-webkit-box-shadow:0 0 0 rgba(0,0,0,.87) inset;box-shadow:0 0 0 rgba(0,0,0,.87) inset;background:#e0e0e0;color:rgba(0,0,0,.87)}.ui.table tr td.disabled,.ui.table tr.disabled td,.ui.table tr.disabled:hover,.ui.table tr:hover td.disabled{pointer-events:none;color:rgba(40,40,40,.3)}@media only screen and (max-width:991.98px){.ui[class*="tablet stackable"].table,.ui[class*="tablet stackable"].table>tbody,.ui[class*="tablet stackable"].table>tbody>tr,.ui[class*="tablet stackable"].table>tbody>tr>td:not(.rowspanned),.ui[class*="tablet stackable"].table>tbody>tr>th:not(.rowspanned),.ui[class*="tablet stackable"].table>tfoot,.ui[class*="tablet stackable"].table>tfoot>tr,.ui[class*="tablet stackable"].table>tfoot>tr>td:not(.rowspanned),.ui[class*="tablet stackable"].table>tfoot>tr>th:not(.rowspanned),.ui[class*="tablet stackable"].table>thead,.ui[class*="tablet stackable"].table>thead>tr,.ui[class*="tablet stackable"].table>thead>tr>th:not(.rowspanned),.ui[class*="tablet stackable"].table>tr,.ui[class*="tablet stackable"].table>tr>td:not(.rowspanned),.ui[class*="tablet stackable"].table>tr>th:not(.rowspanned){display:block!important;width:100%!important}.ui[class*="tablet stackable"].table{padding:0}.ui[class*="tablet stackable"].table>thead{display:block}.ui[class*="tablet stackable"].table>tfoot{display:block}.ui.ui.ui.ui[class*="tablet stackable"].table>tbody>tr,.ui.ui.ui.ui[class*="tablet stackable"].table>tfoot>tr,.ui.ui.ui.ui[class*="tablet stackable"].table>thead>tr,.ui.ui.ui.ui[class*="tablet stackable"].table>tr{padding-top:1em;padding-bottom:1em;-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset}.ui[class*="tablet stackable"].table>tbody>tr>td,.ui[class*="tablet stackable"].table>tbody>tr>th,.ui[class*="tablet stackable"].table>tfoot>tr>td,.ui[class*="tablet stackable"].table>tfoot>tr>th,.ui[class*="tablet stackable"].table>thead>tr>th,.ui[class*="tablet stackable"].table>tr>td,.ui[class*="tablet stackable"].table>tr>th{background:0 0;border:none!important;padding:.25em .75em;-webkit-box-shadow:none;box-shadow:none}.ui.definition[class*="tablet stackable"].table>thead>tr>th:first-child{-webkit-box-shadow:none!important;box-shadow:none!important}}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.primary.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #2185d0 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #2185d0 inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.primary.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #2185d0 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #2185d0 inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.primary.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #54c8ff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #54c8ff inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.primary.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #54c8ff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #54c8ff inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.secondary.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #1b1c1d inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #1b1c1d inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.secondary.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #1b1c1d inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #1b1c1d inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.secondary.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #545454 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #545454 inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.secondary.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #545454 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #545454 inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.red.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #db2828 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #db2828 inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.red.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #db2828 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #db2828 inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.red.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ff695e inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ff695e inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.red.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ff695e inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ff695e inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.orange.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #f2711c inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #f2711c inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.orange.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #f2711c inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #f2711c inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.orange.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ff851b inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ff851b inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.orange.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ff851b inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ff851b inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.yellow.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #fbbd08 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #fbbd08 inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.yellow.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #fbbd08 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #fbbd08 inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.yellow.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ffe21f inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ffe21f inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.yellow.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ffe21f inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ffe21f inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.olive.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #b5cc18 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #b5cc18 inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.olive.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #b5cc18 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #b5cc18 inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.olive.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #d9e778 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #d9e778 inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.olive.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #d9e778 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #d9e778 inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.green.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #21ba45 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #21ba45 inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.green.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #21ba45 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #21ba45 inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.green.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #2ecc40 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #2ecc40 inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.green.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #2ecc40 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #2ecc40 inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.teal.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #00b5ad inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #00b5ad inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.teal.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #00b5ad inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #00b5ad inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.teal.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #6dffff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #6dffff inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.teal.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #6dffff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #6dffff inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.blue.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #2185d0 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #2185d0 inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.blue.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #2185d0 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #2185d0 inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.blue.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #54c8ff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #54c8ff inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.blue.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #54c8ff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #54c8ff inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.violet.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #6435c9 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #6435c9 inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.violet.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #6435c9 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #6435c9 inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.violet.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #a291fb inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #a291fb inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.violet.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #a291fb inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #a291fb inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.purple.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #a333c8 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #a333c8 inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.purple.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #a333c8 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #a333c8 inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.purple.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #dc73ff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #dc73ff inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.purple.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #dc73ff inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #dc73ff inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.pink.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #e03997 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #e03997 inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.pink.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #e03997 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #e03997 inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.pink.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ff8edf inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #ff8edf inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.pink.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ff8edf inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #ff8edf inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.brown.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #a5673f inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #a5673f inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.brown.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #a5673f inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #a5673f inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.brown.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #d67c1c inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #d67c1c inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.brown.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #d67c1c inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #d67c1c inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.grey.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #767676 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #767676 inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.grey.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #767676 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #767676 inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.grey.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #dcddde inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #dcddde inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.grey.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #dcddde inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #dcddde inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.black.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #1b1c1d inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #1b1c1d inset}.ui.ui.ui.ui[class*="tablet stackable"].table tr.marked.black.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #1b1c1d inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #1b1c1d inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.black.left{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #545454 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,.2em 0 0 0 #545454 inset}.ui.ui.ui.ui[class*="tablet stackable"].inverted.table tr.marked.black.right{-webkit-box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #545454 inset;box-shadow:0 -1px 0 0 rgba(0,0,0,.1) inset,-.2em 0 0 0 #545454 inset}.ui.table [class*="left aligned"],.ui.table[class*="left aligned"]{text-align:left}.ui.table [class*="center aligned"],.ui.table[class*="center aligned"]{text-align:center}.ui.table [class*="right aligned"],.ui.table[class*="right aligned"]{text-align:right}.ui.table [class*="top aligned"],.ui.table[class*="top aligned"]{vertical-align:top}.ui.table [class*="middle aligned"],.ui.table[class*="middle aligned"]{vertical-align:middle}.ui.table [class*="bottom aligned"],.ui.table[class*="bottom aligned"]{vertical-align:bottom}.ui.table td.collapsing,.ui.table th.collapsing{width:1px;white-space:nowrap}.ui.fixed.table{table-layout:fixed}.ui.fixed.table td,.ui.fixed.table th{overflow:hidden;text-overflow:ellipsis}.ui.table tbody tr td.selectable:hover,.ui.ui.selectable.table>tbody>tr:hover{background:rgba(0,0,0,.05);color:rgba(0,0,0,.95)}.ui.inverted.table tbody tr td.selectable:hover,.ui.ui.selectable.inverted.table>tbody>tr:hover{background:rgba(255,255,255,.08);color:#fff}.ui.table tbody tr td.selectable{padding:0}.ui.table tbody tr td.selectable>a:not(.ui){display:block;color:inherit;padding:.78571429em .78571429em}.ui.selectable.table>tbody>tr,.ui.selectable.table>tr,.ui.table>tbody>tr>td.selectable,.ui.table>tr>td.selectable{cursor:pointer}.ui.selectable.table tr:hover td.error,.ui.table tr td.selectable.error:hover,.ui.ui.selectable.table tr.error:hover{background:#ffe7e7;color:#943634}.ui.selectable.table tr:hover td.warning,.ui.table tr td.selectable.warning:hover,.ui.ui.selectable.table tr.warning:hover{background:#fff4e4;color:#493107}.ui.selectable.table tr:hover td.active,.ui.table tr td.selectable.active:hover,.ui.ui.selectable.table tr.active:hover{background:#e0e0e0;color:rgba(0,0,0,.87)}.ui.selectable.table tr:hover td.positive,.ui.table tr td.selectable.positive:hover,.ui.ui.selectable.table tr.positive:hover{background:#f7ffe6;color:#275b28}.ui.selectable.table tr:hover td.negative,.ui.table tr td.selectable.negative:hover,.ui.ui.selectable.table tr.negative:hover{background:#ffe7e7;color:#943634}.ui.attached.table{top:0;bottom:0;border-radius:0;margin:0 -1px;width:calc(100% + 2px);max-width:calc(100% + 2px);-webkit-box-shadow:none;box-shadow:none;border:1px solid #d4d4d5}.ui.attached+.ui.attached.table:not(.top){border-top:none}.ui[class*="top attached"].table{bottom:0;margin-bottom:0;top:0;margin-top:1em;border-radius:.28571429rem .28571429rem 0 0}.ui.table[class*="top attached"]:first-child{margin-top:0}.ui[class*="bottom attached"].table{bottom:0;margin-top:0;top:0;margin-bottom:1em;-webkit-box-shadow:none,none;box-shadow:none,none;border-radius:0 0 .28571429rem .28571429rem}.ui[class*="bottom attached"].table:last-child{margin-bottom:0}.ui.striped.table>tbody>tr:nth-child(2n),.ui.striped.table>tr:nth-child(2n){background-color:rgba(0,0,50,.02)}.ui.inverted.striped.table>tbody>tr:nth-child(2n),.ui.inverted.striped.table>tr:nth-child(2n){background-color:rgba(255,255,255,.05)}.ui.striped.selectable.selectable.selectable.table tbody tr.active:hover{background:#efefef;color:rgba(0,0,0,.95)}.ui.table [class*="single line"],.ui.table[class*="single line"]{white-space:nowrap}.ui.primary.table{border-top:.2em solid #2185d0}.ui.inverted.primary.table{background-color:#2185d0;color:#fff}.ui.ui.table td.primary:not(.marked),.ui.ui.ui.ui.table tr.primary:not(.marked){background:#ddf4ff;color:rgba(255,255,255,.9)}.ui.selectable.table tr:hover td.primary:not(.marked),.ui.table tr td.selectable.primary:not(.marked):hover,.ui.ui.selectable.table tr.primary:not(.marked):hover{background:#d3f1ff;color:rgba(255,255,255,.9)}.ui.table td.marked.primary.left,.ui.table tr.marked.primary.left{-webkit-box-shadow:.2em 0 0 0 #2185d0 inset;box-shadow:.2em 0 0 0 #2185d0 inset}.ui.table td.marked.primary.right,.ui.table tr.marked.primary.right{-webkit-box-shadow:-.2em 0 0 0 #2185d0 inset;box-shadow:-.2em 0 0 0 #2185d0 inset}.ui.inverted.table td.marked.primary.left,.ui.inverted.table tr.marked.primary.left{-webkit-box-shadow:.2em 0 0 0 #54c8ff inset;box-shadow:.2em 0 0 0 #54c8ff inset}.ui.inverted.table td.marked.primary.right,.ui.inverted.table tr.marked.primary.right{-webkit-box-shadow:-.2em 0 0 0 #54c8ff inset;box-shadow:-.2em 0 0 0 #54c8ff inset}.ui.secondary.table{border-top:.2em solid #1b1c1d}.ui.inverted.secondary.table{background-color:#1b1c1d;color:#fff}.ui.ui.table td.secondary:not(.marked),.ui.ui.ui.ui.table tr.secondary:not(.marked){background:#ddd;color:rgba(255,255,255,.9)}.ui.selectable.table tr:hover td.secondary:not(.marked),.ui.table tr td.selectable.secondary:not(.marked):hover,.ui.ui.selectable.table tr.secondary:not(.marked):hover{background:#e2e2e2;color:rgba(255,255,255,.9)}.ui.table td.marked.secondary.left,.ui.table tr.marked.secondary.left{-webkit-box-shadow:.2em 0 0 0 #1b1c1d inset;box-shadow:.2em 0 0 0 #1b1c1d inset}.ui.table td.marked.secondary.right,.ui.table tr.marked.secondary.right{-webkit-box-shadow:-.2em 0 0 0 #1b1c1d inset;box-shadow:-.2em 0 0 0 #1b1c1d inset}.ui.inverted.table td.marked.secondary.left,.ui.inverted.table tr.marked.secondary.left{-webkit-box-shadow:.2em 0 0 0 #545454 inset;box-shadow:.2em 0 0 0 #545454 inset}.ui.inverted.table td.marked.secondary.right,.ui.inverted.table tr.marked.secondary.right{-webkit-box-shadow:-.2em 0 0 0 #545454 inset;box-shadow:-.2em 0 0 0 #545454 inset}.ui.red.table{border-top:.2em solid #db2828}.ui.inverted.red.table{background-color:#db2828;color:#fff}.ui.ui.table td.red:not(.marked),.ui.ui.ui.ui.table tr.red:not(.marked){background:#ffe1df;color:#db2828}.ui.selectable.table tr:hover td.red:not(.marked),.ui.table tr td.selectable.red:not(.marked):hover,.ui.ui.selectable.table tr.red:not(.marked):hover{background:#ffd7d5;color:#db2828}.ui.table td.marked.red.left,.ui.table tr.marked.red.left{-webkit-box-shadow:.2em 0 0 0 #db2828 inset;box-shadow:.2em 0 0 0 #db2828 inset}.ui.table td.marked.red.right,.ui.table tr.marked.red.right{-webkit-box-shadow:-.2em 0 0 0 #db2828 inset;box-shadow:-.2em 0 0 0 #db2828 inset}.ui.inverted.table td.marked.red.left,.ui.inverted.table tr.marked.red.left{-webkit-box-shadow:.2em 0 0 0 #ff695e inset;box-shadow:.2em 0 0 0 #ff695e inset}.ui.inverted.table td.marked.red.right,.ui.inverted.table tr.marked.red.right{-webkit-box-shadow:-.2em 0 0 0 #ff695e inset;box-shadow:-.2em 0 0 0 #ff695e inset}.ui.orange.table{border-top:.2em solid #f2711c}.ui.inverted.orange.table{background-color:#f2711c;color:#fff}.ui.ui.table td.orange:not(.marked),.ui.ui.ui.ui.table tr.orange:not(.marked){background:#ffe7d1;color:#f2711c}.ui.selectable.table tr:hover td.orange:not(.marked),.ui.table tr td.selectable.orange:not(.marked):hover,.ui.ui.selectable.table tr.orange:not(.marked):hover{background:#fae1cc;color:#f2711c}.ui.table td.marked.orange.left,.ui.table tr.marked.orange.left{-webkit-box-shadow:.2em 0 0 0 #f2711c inset;box-shadow:.2em 0 0 0 #f2711c inset}.ui.table td.marked.orange.right,.ui.table tr.marked.orange.right{-webkit-box-shadow:-.2em 0 0 0 #f2711c inset;box-shadow:-.2em 0 0 0 #f2711c inset}.ui.inverted.table td.marked.orange.left,.ui.inverted.table tr.marked.orange.left{-webkit-box-shadow:.2em 0 0 0 #ff851b inset;box-shadow:.2em 0 0 0 #ff851b inset}.ui.inverted.table td.marked.orange.right,.ui.inverted.table tr.marked.orange.right{-webkit-box-shadow:-.2em 0 0 0 #ff851b inset;box-shadow:-.2em 0 0 0 #ff851b inset}.ui.yellow.table{border-top:.2em solid #fbbd08}.ui.inverted.yellow.table{background-color:#fbbd08;color:#fff}.ui.ui.table td.yellow:not(.marked),.ui.ui.ui.ui.table tr.yellow:not(.marked){background:#fff9d2;color:#b58105}.ui.selectable.table tr:hover td.yellow:not(.marked),.ui.table tr td.selectable.yellow:not(.marked):hover,.ui.ui.selectable.table tr.yellow:not(.marked):hover{background:#fbf5cc;color:#b58105}.ui.table td.marked.yellow.left,.ui.table tr.marked.yellow.left{-webkit-box-shadow:.2em 0 0 0 #fbbd08 inset;box-shadow:.2em 0 0 0 #fbbd08 inset}.ui.table td.marked.yellow.right,.ui.table tr.marked.yellow.right{-webkit-box-shadow:-.2em 0 0 0 #fbbd08 inset;box-shadow:-.2em 0 0 0 #fbbd08 inset}.ui.inverted.table td.marked.yellow.left,.ui.inverted.table tr.marked.yellow.left{-webkit-box-shadow:.2em 0 0 0 #ffe21f inset;box-shadow:.2em 0 0 0 #ffe21f inset}.ui.inverted.table td.marked.yellow.right,.ui.inverted.table tr.marked.yellow.right{-webkit-box-shadow:-.2em 0 0 0 #ffe21f inset;box-shadow:-.2em 0 0 0 #ffe21f inset}.ui.olive.table{border-top:.2em solid #b5cc18}.ui.inverted.olive.table{background-color:#b5cc18;color:#fff}.ui.ui.table td.olive:not(.marked),.ui.ui.ui.ui.table tr.olive:not(.marked){background:#f7fae4;color:#8abc1e}.ui.selectable.table tr:hover td.olive:not(.marked),.ui.table tr td.selectable.olive:not(.marked):hover,.ui.ui.selectable.table tr.olive:not(.marked):hover{background:#f6fada;color:#8abc1e}.ui.table td.marked.olive.left,.ui.table tr.marked.olive.left{-webkit-box-shadow:.2em 0 0 0 #b5cc18 inset;box-shadow:.2em 0 0 0 #b5cc18 inset}.ui.table td.marked.olive.right,.ui.table tr.marked.olive.right{-webkit-box-shadow:-.2em 0 0 0 #b5cc18 inset;box-shadow:-.2em 0 0 0 #b5cc18 inset}.ui.inverted.table td.marked.olive.left,.ui.inverted.table tr.marked.olive.left{-webkit-box-shadow:.2em 0 0 0 #d9e778 inset;box-shadow:.2em 0 0 0 #d9e778 inset}.ui.inverted.table td.marked.olive.right,.ui.inverted.table tr.marked.olive.right{-webkit-box-shadow:-.2em 0 0 0 #d9e778 inset;box-shadow:-.2em 0 0 0 #d9e778 inset}.ui.green.table{border-top:.2em solid #21ba45}.ui.inverted.green.table{background-color:#21ba45;color:#fff}.ui.ui.table td.green:not(.marked),.ui.ui.ui.ui.table tr.green:not(.marked){background:#d5f5d9;color:#1ebc30}.ui.selectable.table tr:hover td.green:not(.marked),.ui.table tr td.selectable.green:not(.marked):hover,.ui.ui.selectable.table tr.green:not(.marked):hover{background:#d2eed5;color:#1ebc30}.ui.table td.marked.green.left,.ui.table tr.marked.green.left{-webkit-box-shadow:.2em 0 0 0 #21ba45 inset;box-shadow:.2em 0 0 0 #21ba45 inset}.ui.table td.marked.green.right,.ui.table tr.marked.green.right{-webkit-box-shadow:-.2em 0 0 0 #21ba45 inset;box-shadow:-.2em 0 0 0 #21ba45 inset}.ui.inverted.table td.marked.green.left,.ui.inverted.table tr.marked.green.left{-webkit-box-shadow:.2em 0 0 0 #2ecc40 inset;box-shadow:.2em 0 0 0 #2ecc40 inset}.ui.inverted.table td.marked.green.right,.ui.inverted.table tr.marked.green.right{-webkit-box-shadow:-.2em 0 0 0 #2ecc40 inset;box-shadow:-.2em 0 0 0 #2ecc40 inset}.ui.teal.table{border-top:.2em solid #00b5ad}.ui.inverted.teal.table{background-color:#00b5ad;color:#fff}.ui.ui.table td.teal:not(.marked),.ui.ui.ui.ui.table tr.teal:not(.marked){background:#e2ffff;color:#10a3a3}.ui.selectable.table tr:hover td.teal:not(.marked),.ui.table tr td.selectable.teal:not(.marked):hover,.ui.ui.selectable.table tr.teal:not(.marked):hover{background:#d8ffff;color:#10a3a3}.ui.table td.marked.teal.left,.ui.table tr.marked.teal.left{-webkit-box-shadow:.2em 0 0 0 #00b5ad inset;box-shadow:.2em 0 0 0 #00b5ad inset}.ui.table td.marked.teal.right,.ui.table tr.marked.teal.right{-webkit-box-shadow:-.2em 0 0 0 #00b5ad inset;box-shadow:-.2em 0 0 0 #00b5ad inset}.ui.inverted.table td.marked.teal.left,.ui.inverted.table tr.marked.teal.left{-webkit-box-shadow:.2em 0 0 0 #6dffff inset;box-shadow:.2em 0 0 0 #6dffff inset}.ui.inverted.table td.marked.teal.right,.ui.inverted.table tr.marked.teal.right{-webkit-box-shadow:-.2em 0 0 0 #6dffff inset;box-shadow:-.2em 0 0 0 #6dffff inset}.ui.blue.table{border-top:.2em solid #2185d0}.ui.inverted.blue.table{background-color:#2185d0;color:#fff}.ui.ui.table td.blue:not(.marked),.ui.ui.ui.ui.table tr.blue:not(.marked){background:#ddf4ff;color:#2185d0}.ui.selectable.table tr:hover td.blue:not(.marked),.ui.table tr td.selectable.blue:not(.marked):hover,.ui.ui.selectable.table tr.blue:not(.marked):hover{background:#d3f1ff;color:#2185d0}.ui.table td.marked.blue.left,.ui.table tr.marked.blue.left{-webkit-box-shadow:.2em 0 0 0 #2185d0 inset;box-shadow:.2em 0 0 0 #2185d0 inset}.ui.table td.marked.blue.right,.ui.table tr.marked.blue.right{-webkit-box-shadow:-.2em 0 0 0 #2185d0 inset;box-shadow:-.2em 0 0 0 #2185d0 inset}.ui.inverted.table td.marked.blue.left,.ui.inverted.table tr.marked.blue.left{-webkit-box-shadow:.2em 0 0 0 #54c8ff inset;box-shadow:.2em 0 0 0 #54c8ff inset}.ui.inverted.table td.marked.blue.right,.ui.inverted.table tr.marked.blue.right{-webkit-box-shadow:-.2em 0 0 0 #54c8ff inset;box-shadow:-.2em 0 0 0 #54c8ff inset}.ui.violet.table{border-top:.2em solid #6435c9}.ui.inverted.violet.table{background-color:#6435c9;color:#fff}.ui.ui.table td.violet:not(.marked),.ui.ui.ui.ui.table tr.violet:not(.marked){background:#ece9fe;color:#6435c9}.ui.selectable.table tr:hover td.violet:not(.marked),.ui.table tr td.selectable.violet:not(.marked):hover,.ui.ui.selectable.table tr.violet:not(.marked):hover{background:#e3deff;color:#6435c9}.ui.table td.marked.violet.left,.ui.table tr.marked.violet.left{-webkit-box-shadow:.2em 0 0 0 #6435c9 inset;box-shadow:.2em 0 0 0 #6435c9 inset}.ui.table td.marked.violet.right,.ui.table tr.marked.violet.right{-webkit-box-shadow:-.2em 0 0 0 #6435c9 inset;box-shadow:-.2em 0 0 0 #6435c9 inset}.ui.inverted.table td.marked.violet.left,.ui.inverted.table tr.marked.violet.left{-webkit-box-shadow:.2em 0 0 0 #a291fb inset;box-shadow:.2em 0 0 0 #a291fb inset}.ui.inverted.table td.marked.violet.right,.ui.inverted.table tr.marked.violet.right{-webkit-box-shadow:-.2em 0 0 0 #a291fb inset;box-shadow:-.2em 0 0 0 #a291fb inset}.ui.purple.table{border-top:.2em solid #a333c8}.ui.inverted.purple.table{background-color:#a333c8;color:#fff}.ui.ui.table td.purple:not(.marked),.ui.ui.ui.ui.table tr.purple:not(.marked){background:#f8e3ff;color:#a333c8}.ui.selectable.table tr:hover td.purple:not(.marked),.ui.table tr td.selectable.purple:not(.marked):hover,.ui.ui.selectable.table tr.purple:not(.marked):hover{background:#f5d9ff;color:#a333c8}.ui.table td.marked.purple.left,.ui.table tr.marked.purple.left{-webkit-box-shadow:.2em 0 0 0 #a333c8 inset;box-shadow:.2em 0 0 0 #a333c8 inset}.ui.table td.marked.purple.right,.ui.table tr.marked.purple.right{-webkit-box-shadow:-.2em 0 0 0 #a333c8 inset;box-shadow:-.2em 0 0 0 #a333c8 inset}.ui.inverted.table td.marked.purple.left,.ui.inverted.table tr.marked.purple.left{-webkit-box-shadow:.2em 0 0 0 #dc73ff inset;box-shadow:.2em 0 0 0 #dc73ff inset}.ui.inverted.table td.marked.purple.right,.ui.inverted.table tr.marked.purple.right{-webkit-box-shadow:-.2em 0 0 0 #dc73ff inset;box-shadow:-.2em 0 0 0 #dc73ff inset}.ui.pink.table{border-top:.2em solid #e03997}.ui.inverted.pink.table{background-color:#e03997;color:#fff}.ui.ui.table td.pink:not(.marked),.ui.ui.ui.ui.table tr.pink:not(.marked){background:#ffe8f9;color:#e03997}.ui.selectable.table tr:hover td.pink:not(.marked),.ui.table tr td.selectable.pink:not(.marked):hover,.ui.ui.selectable.table tr.pink:not(.marked):hover{background:#ffdef6;color:#e03997}.ui.table td.marked.pink.left,.ui.table tr.marked.pink.left{-webkit-box-shadow:.2em 0 0 0 #e03997 inset;box-shadow:.2em 0 0 0 #e03997 inset}.ui.table td.marked.pink.right,.ui.table tr.marked.pink.right{-webkit-box-shadow:-.2em 0 0 0 #e03997 inset;box-shadow:-.2em 0 0 0 #e03997 inset}.ui.inverted.table td.marked.pink.left,.ui.inverted.table tr.marked.pink.left{-webkit-box-shadow:.2em 0 0 0 #ff8edf inset;box-shadow:.2em 0 0 0 #ff8edf inset}.ui.inverted.table td.marked.pink.right,.ui.inverted.table tr.marked.pink.right{-webkit-box-shadow:-.2em 0 0 0 #ff8edf inset;box-shadow:-.2em 0 0 0 #ff8edf inset}.ui.brown.table{border-top:.2em solid #a5673f}.ui.inverted.brown.table{background-color:#a5673f;color:#fff}.ui.ui.table td.brown:not(.marked),.ui.ui.ui.ui.table tr.brown:not(.marked){background:#f7e5d2;color:#a5673f}.ui.selectable.table tr:hover td.brown:not(.marked),.ui.table tr td.selectable.brown:not(.marked):hover,.ui.ui.selectable.table tr.brown:not(.marked):hover{background:#efe0cf;color:#a5673f}.ui.table td.marked.brown.left,.ui.table tr.marked.brown.left{-webkit-box-shadow:.2em 0 0 0 #a5673f inset;box-shadow:.2em 0 0 0 #a5673f inset}.ui.table td.marked.brown.right,.ui.table tr.marked.brown.right{-webkit-box-shadow:-.2em 0 0 0 #a5673f inset;box-shadow:-.2em 0 0 0 #a5673f inset}.ui.inverted.table td.marked.brown.left,.ui.inverted.table tr.marked.brown.left{-webkit-box-shadow:.2em 0 0 0 #d67c1c inset;box-shadow:.2em 0 0 0 #d67c1c inset}.ui.inverted.table td.marked.brown.right,.ui.inverted.table tr.marked.brown.right{-webkit-box-shadow:-.2em 0 0 0 #d67c1c inset;box-shadow:-.2em 0 0 0 #d67c1c inset}.ui.grey.table{border-top:.2em solid #767676}.ui.inverted.grey.table{background-color:#767676;color:#fff}.ui.ui.table td.grey:not(.marked),.ui.ui.ui.ui.table tr.grey:not(.marked){background:#dcddde;color:#767676}.ui.selectable.table tr:hover td.grey:not(.marked),.ui.table tr td.selectable.grey:not(.marked):hover,.ui.ui.selectable.table tr.grey:not(.marked):hover{background:#c2c4c5;color:#767676}.ui.table td.marked.grey.left,.ui.table tr.marked.grey.left{-webkit-box-shadow:.2em 0 0 0 #767676 inset;box-shadow:.2em 0 0 0 #767676 inset}.ui.table td.marked.grey.right,.ui.table tr.marked.grey.right{-webkit-box-shadow:-.2em 0 0 0 #767676 inset;box-shadow:-.2em 0 0 0 #767676 inset}.ui.inverted.table td.marked.grey.left,.ui.inverted.table tr.marked.grey.left{-webkit-box-shadow:.2em 0 0 0 #dcddde inset;box-shadow:.2em 0 0 0 #dcddde inset}.ui.inverted.table td.marked.grey.right,.ui.inverted.table tr.marked.grey.right{-webkit-box-shadow:-.2em 0 0 0 #dcddde inset;box-shadow:-.2em 0 0 0 #dcddde inset}.ui.black.table{border-top:.2em solid #1b1c1d}.ui.inverted.black.table{background-color:#1b1c1d;color:#fff}.ui.ui.table td.black:not(.marked),.ui.ui.ui.ui.table tr.black:not(.marked){background:#545454;color:#fff}.ui.selectable.table tr:hover td.black:not(.marked),.ui.table tr td.selectable.black:not(.marked):hover,.ui.ui.selectable.table tr.black:not(.marked):hover{background:#000;color:#fff}.ui.table td.marked.black.left,.ui.table tr.marked.black.left{-webkit-box-shadow:.2em 0 0 0 #1b1c1d inset;box-shadow:.2em 0 0 0 #1b1c1d inset}.ui.table td.marked.black.right,.ui.table tr.marked.black.right{-webkit-box-shadow:-.2em 0 0 0 #1b1c1d inset;box-shadow:-.2em 0 0 0 #1b1c1d inset}.ui.inverted.table td.marked.black.left,.ui.inverted.table tr.marked.black.left{-webkit-box-shadow:.2em 0 0 0 #545454 inset;box-shadow:.2em 0 0 0 #545454 inset}.ui.inverted.table td.marked.black.right,.ui.inverted.table tr.marked.black.right{-webkit-box-shadow:-.2em 0 0 0 #545454 inset;box-shadow:-.2em 0 0 0 #545454 inset}.ui.one.column.table td{width:100%}.ui.two.column.table td{width:50%}.ui.three.column.table td{width:33.33333333%}.ui.four.column.table td{width:25%}.ui.five.column.table td{width:20%}.ui.six.column.table td{width:16.66666667%}.ui.seven.column.table td{width:14.28571429%}.ui.eight.column.table td{width:12.5%}.ui.nine.column.table td{width:11.11111111%}.ui.ten.column.table td{width:10%}.ui.eleven.column.table td{width:9.09090909%}.ui.twelve.column.table td{width:8.33333333%}.ui.thirteen.column.table td{width:7.69230769%}.ui.fourteen.column.table td{width:7.14285714%}.ui.fifteen.column.table td{width:6.66666667%}.ui.sixteen.column.table td{width:6.25%}.ui.table td.one.wide,.ui.table th.one.wide{width:6.25%}.ui.table td.two.wide,.ui.table th.two.wide{width:12.5%}.ui.table td.three.wide,.ui.table th.three.wide{width:18.75%}.ui.table td.four.wide,.ui.table th.four.wide{width:25%}.ui.table td.five.wide,.ui.table th.five.wide{width:31.25%}.ui.table td.six.wide,.ui.table th.six.wide{width:37.5%}.ui.table td.seven.wide,.ui.table th.seven.wide{width:43.75%}.ui.table td.eight.wide,.ui.table th.eight.wide{width:50%}.ui.table td.nine.wide,.ui.table th.nine.wide{width:56.25%}.ui.table td.ten.wide,.ui.table th.ten.wide{width:62.5%}.ui.table td.eleven.wide,.ui.table th.eleven.wide{width:68.75%}.ui.table td.twelve.wide,.ui.table th.twelve.wide{width:75%}.ui.table td.thirteen.wide,.ui.table th.thirteen.wide{width:81.25%}.ui.table td.fourteen.wide,.ui.table th.fourteen.wide{width:87.5%}.ui.table td.fifteen.wide,.ui.table th.fifteen.wide{width:93.75%}.ui.table td.sixteen.wide,.ui.table th.sixteen.wide{width:100%}.ui.sortable.table>thead>tr>th{cursor:pointer;white-space:nowrap;border-left:1px solid rgba(34,36,38,.15);color:rgba(0,0,0,.87)}.ui.sortable.table>thead>tr>th:first-child{border-left:none}.ui.sortable.table thead th.sorted,.ui.sortable.table thead th.sorted:hover{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.ui.sortable.table>thead>tr>th:after{display:none;font-style:normal;font-weight:400;text-decoration:inherit;content:'';height:1em;width:auto;opacity:.8;margin:0 0 0 .5em;font-family:Icons}.ui.sortable.table thead th.ascending:after{content:'\f0d8'}.ui.sortable.table thead th.descending:after{content:'\f0d7'}.ui.sortable.table th.disabled:hover{cursor:auto;color:rgba(40,40,40,.3)}.ui.sortable.table>thead>tr>th:hover{color:rgba(0,0,0,.8)}.ui.sortable.table:not(.basic)>thead>tr>th:hover{background:rgba(0,0,0,.05)}.ui.sortable.table thead th.sorted{color:rgba(0,0,0,.95)}.ui.sortable.table:not(.basic) thead th.sorted{background:rgba(0,0,0,.05)}.ui.sortable.table thead th.sorted:after{display:inline-block}.ui.sortable.table thead th.sorted:hover{color:rgba(0,0,0,.95)}.ui.sortable.table:not(.basic) thead th.sorted:hover{background:rgba(0,0,0,.05)}.ui.inverted.sortable.table thead th.sorted{color:#fff}.ui.inverted.sortable.table:not(.basic) thead th.sorted{background:rgba(255,255,255,.15) -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:rgba(255,255,255,.15) -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:rgba(255,255,255,.15) linear-gradient(transparent,rgba(0,0,0,.05))}.ui.inverted.sortable.table>thead>tr>th:hover{color:#fff}.ui.inverted.sortable.table:not(.basic)>thead>tr>th:hover{background:rgba(255,255,255,.08) -webkit-gradient(linear,left top,left bottom,from(transparent),to(rgba(0,0,0,.05)));background:rgba(255,255,255,.08) -webkit-linear-gradient(transparent,rgba(0,0,0,.05));background:rgba(255,255,255,.08) linear-gradient(transparent,rgba(0,0,0,.05))}.ui.inverted.sortable.table:not(.basic)>thead>tr>th{border-left-color:transparent;border-right-color:transparent}.ui.inverted.table{background:#333;color:rgba(255,255,255,.9);border:none}.ui.ui.inverted.table>tbody>tr>th,.ui.ui.inverted.table>tfoot>tr>td,.ui.ui.inverted.table>tfoot>tr>th,.ui.ui.inverted.table>thead>tr>th,.ui.ui.inverted.table>tr>th{background-color:rgba(0,0,0,.15);border-color:rgba(255,255,255,.1);color:rgba(255,255,255,.9)}.ui.inverted.table>tbody>tr>td,.ui.inverted.table>tfoot>tr>td,.ui.inverted.table>tr>td{border-color:rgba(255,255,255,.1)}.ui.inverted.table tr td.disabled,.ui.inverted.table tr.disabled td,.ui.inverted.table tr.disabled:hover td,.ui.inverted.table tr:hover td.disabled{pointer-events:none;color:rgba(225,225,225,.3)}.ui.inverted.table tr td.disabled:not([class=disabled]),.ui.inverted.table tr.disabled td[class]:not(.disabled),.ui.inverted.table tr.disabled:not([class=disabled]) td,.ui.inverted.table tr:hover td.disabled:not([class=disabled]){color:rgba(40,40,40,.3)}.ui.inverted.definition.table>tfoot:not(.full-width)>tr>th:first-child,.ui.inverted.definition.table>thead:not(.full-width)>tr>th:first-child{background:#fff}.ui.inverted.definition.table>tbody>tr>td:first-child,.ui.inverted.definition.table>tfoot>tr>td:first-child,.ui.inverted.definition.table>tr>td:first-child{background:rgba(255,255,255,.02);color:#fff}.ui.collapsing.table{width:auto}.ui.basic.table{background:0 0;border:1px solid rgba(34,36,38,.15);-webkit-box-shadow:none;box-shadow:none}.ui.basic.table>tfoot,.ui.basic.table>thead{-webkit-box-shadow:none;box-shadow:none}.ui.basic.table>tbody>tr>th,.ui.basic.table>tfoot>tr>th,.ui.basic.table>thead>tr>th,.ui.basic.table>tr>th{background:0 0;border-left:none}.ui.basic.table>tbody>tr{border-bottom:1px solid rgba(0,0,0,.1)}.ui.basic.table>tbody>tr>td,.ui.basic.table>tfoot>tr>td,.ui.basic.table>tr>td{background:0 0}.ui.basic.striped.table>tbody>tr:nth-child(2n){background-color:rgba(0,0,0,.05)}.ui[class*="very basic"].table{border:none}.ui[class*="very basic"].table:not(.sortable):not(.striped)>tbody>tr>td,.ui[class*="very basic"].table:not(.sortable):not(.striped)>tbody>tr>th,.ui[class*="very basic"].table:not(.sortable):not(.striped)>tfoot>tr>th,.ui[class*="very basic"].table:not(.sortable):not(.striped)>thead>tr>th,.ui[class*="very basic"].table:not(.sortable):not(.striped)>tr>td,.ui[class*="very basic"].table:not(.sortable):not(.striped)>tr>th{padding:''}.ui[class*="very basic"].table:not(.sortable):not(.striped)>tbody>tr>td:first-child,.ui[class*="very basic"].table:not(.sortable):not(.striped)>tbody>tr>th:first-child,.ui[class*="very basic"].table:not(.sortable):not(.striped)>tfoot>tr>td:first-child,.ui[class*="very basic"].table:not(.sortable):not(.striped)>tfoot>tr>th:first-child,.ui[class*="very basic"].table:not(.sortable):not(.striped)>thead>tr>th:first-child,.ui[class*="very basic"].table:not(.sortable):not(.striped)>tr>td:first-child,.ui[class*="very basic"].table:not(.sortable):not(.striped)>tr>th:first-child{padding-left:0}.ui[class*="very basic"].table:not(.sortable):not(.striped)>tbody>tr>td:last-child,.ui[class*="very basic"].table:not(.sortable):not(.striped)>tbody>tr>th:last-child,.ui[class*="very basic"].table:not(.sortable):not(.striped)>tfoot>tr>td:last-child,.ui[class*="very basic"].table:not(.sortable):not(.striped)>tfoot>tr>th:last-child,.ui[class*="very basic"].table:not(.sortable):not(.striped)>thead>tr>th:last-child,.ui[class*="very basic"].table:not(.sortable):not(.striped)>tr>td:last-child,.ui[class*="very basic"].table:not(.sortable):not(.striped)>tr>th:last-child{padding-right:0}.ui[class*="very basic"].table:not(.sortable):not(.striped)>thead>tr:first-child>th{padding-top:0}.ui.celled.table>tbody>tr>td,.ui.celled.table>tbody>tr>th,.ui.celled.table>tfoot>tr>td,.ui.celled.table>tfoot>tr>th,.ui.celled.table>thead>tr>th,.ui.celled.table>tr>td,.ui.celled.table>tr>th{border-left:1px solid rgba(34,36,38,.1)}.ui.inverted.celled.table>tbody>tr>td,.ui.inverted.celled.table>tr>td{border-left:1px solid rgba(255,255,255,.1)}.ui.celled.table>tbody>tr>td:first-child,.ui.celled.table>tbody>tr>th:first-child,.ui.celled.table>tfoot>tr>td:first-child,.ui.celled.table>tfoot>tr>th:first-child,.ui.celled.table>thead>tr>th:first-child,.ui.celled.table>tr>td:first-child,.ui.celled.table>tr>th:first-child{border-left:none}.ui.padded.table>tbody>tr>th,.ui.padded.table>tfoot>tr>th,.ui.padded.table>thead>tr>th,.ui.padded.table>tr>th{padding-left:1em;padding-right:1em}.ui.padded.table>tbody>tr>td,.ui.padded.table>tbody>tr>th,.ui.padded.table>tfoot>tr>td,.ui.padded.table>tfoot>tr>th,.ui.padded.table>thead>tr>th,.ui.padded.table>tr>td,.ui.padded.table>tr>th{padding:1em 1em}.ui[class*="very padded"].table>tbody>tr>th,.ui[class*="very padded"].table>tfoot>tr>th,.ui[class*="very padded"].table>thead>tr>th,.ui[class*="very padded"].table>tr>th{padding-left:1.5em;padding-right:1.5em}.ui[class*="very padded"].table>tbody>tr>td,.ui[class*="very padded"].table>tfoot>tr>td,.ui[class*="very padded"].table>tr>td{padding:1.5em 1.5em}.ui.compact.table>tbody>tr>th,.ui.compact.table>tfoot>tr>th,.ui.compact.table>thead>tr>th,.ui.compact.table>tr>th{padding-left:.7em;padding-right:.7em}.ui.compact.table>tbody>tr>td,.ui.compact.table>tfoot>tr>td,.ui.compact.table>tr>td{padding:.5em .7em}.ui[class*="very compact"].table>tbody>tr>th,.ui[class*="very compact"].table>tfoot>tr>th,.ui[class*="very compact"].table>thead>tr>th,.ui[class*="very compact"].table>tr>th{padding-left:.6em;padding-right:.6em}.ui[class*="very compact"].table>tbody>tr>td,.ui[class*="very compact"].table>tfoot>tr>td,.ui[class*="very compact"].table>tr>td{padding:.4em .6em}.ui.table{font-size:1em}.ui.mini.table{font-size:.78571429rem}.ui.tiny.table{font-size:.85714286rem}.ui.small.table{font-size:.9em}.ui.large.table{font-size:1.1em}.ui.big.table{font-size:1.28571429rem}.ui.huge.table{font-size:1.42857143rem}.ui.massive.table{font-size:1.71428571rem}
\ No newline at end of file
diff --git a/public/dist/components/text.css b/public/dist/components/text.css
new file mode 100644
index 000000000..eba107a6c
--- /dev/null
+++ b/public/dist/components/text.css
@@ -0,0 +1,155 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Text
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * https://github.com/fomantic/Fomantic-UI/blob/master/LICENSE.md
+ *
+ */
+
+
+/*******************************
+ Text
+*******************************/
+
+span.ui.text {
+ line-height: 1;
+}
+span.ui.primary.text {
+ color: #2185D0;
+}
+span.ui.inverted.primary.text {
+ color: #54C8FF;
+}
+span.ui.secondary.text {
+ color: #1B1C1D;
+}
+span.ui.inverted.secondary.text {
+ color: #545454;
+}
+span.ui.red.text {
+ color: #DB2828;
+}
+span.ui.inverted.red.text {
+ color: #FF695E;
+}
+span.ui.orange.text {
+ color: #F2711C;
+}
+span.ui.inverted.orange.text {
+ color: #FF851B;
+}
+span.ui.yellow.text {
+ color: #FBBD08;
+}
+span.ui.inverted.yellow.text {
+ color: #FFE21F;
+}
+span.ui.olive.text {
+ color: #B5CC18;
+}
+span.ui.inverted.olive.text {
+ color: #D9E778;
+}
+span.ui.green.text {
+ color: #21BA45;
+}
+span.ui.inverted.green.text {
+ color: #2ECC40;
+}
+span.ui.teal.text {
+ color: #00B5AD;
+}
+span.ui.inverted.teal.text {
+ color: #6DFFFF;
+}
+span.ui.blue.text {
+ color: #2185D0;
+}
+span.ui.inverted.blue.text {
+ color: #54C8FF;
+}
+span.ui.violet.text {
+ color: #6435C9;
+}
+span.ui.inverted.violet.text {
+ color: #A291FB;
+}
+span.ui.purple.text {
+ color: #A333C8;
+}
+span.ui.inverted.purple.text {
+ color: #DC73FF;
+}
+span.ui.pink.text {
+ color: #E03997;
+}
+span.ui.inverted.pink.text {
+ color: #FF8EDF;
+}
+span.ui.brown.text {
+ color: #A5673F;
+}
+span.ui.inverted.brown.text {
+ color: #D67C1C;
+}
+span.ui.grey.text {
+ color: #767676;
+}
+span.ui.inverted.grey.text {
+ color: #DCDDDE;
+}
+span.ui.black.text {
+ color: #1B1C1D;
+}
+span.ui.inverted.black.text {
+ color: #545454;
+}
+span.ui.error.text {
+ color: #DB2828;
+}
+span.ui.info.text {
+ color: #31CCEC;
+}
+span.ui.success.text {
+ color: #21BA45;
+}
+span.ui.warning.text {
+ color: #F2C037;
+}
+span.ui.disabled.text {
+ opacity: 0.45;
+}
+
+/* Sizes */
+span.ui.medium.text {
+ font-size: 1em;
+}
+span.ui.mini.text {
+ font-size: 0.4em;
+}
+span.ui.tiny.text {
+ font-size: 0.5em;
+}
+span.ui.small.text {
+ font-size: 0.75em;
+}
+span.ui.large.text {
+ font-size: 1.5em;
+}
+span.ui.big.text {
+ font-size: 2em;
+}
+span.ui.huge.text {
+ font-size: 4em;
+}
+span.ui.massive.text {
+ font-size: 8em;
+}
+
+
+/*******************************
+ Theme Overrides
+*******************************/
+
diff --git a/public/dist/components/text.min.css b/public/dist/components/text.min.css
new file mode 100644
index 000000000..08a6cf247
--- /dev/null
+++ b/public/dist/components/text.min.css
@@ -0,0 +1,9 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Text
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * https://github.com/fomantic/Fomantic-UI/blob/master/LICENSE.md
+ *
+ */span.ui.text{line-height:1}span.ui.primary.text{color:#2185d0}span.ui.inverted.primary.text{color:#54c8ff}span.ui.secondary.text{color:#1b1c1d}span.ui.inverted.secondary.text{color:#545454}span.ui.red.text{color:#db2828}span.ui.inverted.red.text{color:#ff695e}span.ui.orange.text{color:#f2711c}span.ui.inverted.orange.text{color:#ff851b}span.ui.yellow.text{color:#fbbd08}span.ui.inverted.yellow.text{color:#ffe21f}span.ui.olive.text{color:#b5cc18}span.ui.inverted.olive.text{color:#d9e778}span.ui.green.text{color:#21ba45}span.ui.inverted.green.text{color:#2ecc40}span.ui.teal.text{color:#00b5ad}span.ui.inverted.teal.text{color:#6dffff}span.ui.blue.text{color:#2185d0}span.ui.inverted.blue.text{color:#54c8ff}span.ui.violet.text{color:#6435c9}span.ui.inverted.violet.text{color:#a291fb}span.ui.purple.text{color:#a333c8}span.ui.inverted.purple.text{color:#dc73ff}span.ui.pink.text{color:#e03997}span.ui.inverted.pink.text{color:#ff8edf}span.ui.brown.text{color:#a5673f}span.ui.inverted.brown.text{color:#d67c1c}span.ui.grey.text{color:#767676}span.ui.inverted.grey.text{color:#dcddde}span.ui.black.text{color:#1b1c1d}span.ui.inverted.black.text{color:#545454}span.ui.error.text{color:#db2828}span.ui.info.text{color:#31ccec}span.ui.success.text{color:#21ba45}span.ui.warning.text{color:#f2c037}span.ui.disabled.text{opacity:.45}span.ui.medium.text{font-size:1em}span.ui.mini.text{font-size:.4em}span.ui.tiny.text{font-size:.5em}span.ui.small.text{font-size:.75em}span.ui.large.text{font-size:1.5em}span.ui.big.text{font-size:2em}span.ui.huge.text{font-size:4em}span.ui.massive.text{font-size:8em}
\ No newline at end of file
diff --git a/public/dist/components/toast.css b/public/dist/components/toast.css
new file mode 100644
index 000000000..0165a2545
--- /dev/null
+++ b/public/dist/components/toast.css
@@ -0,0 +1,776 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Toast
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+
+/*******************************
+ Toast container
+*******************************/
+
+.ui.toast-container {
+ position: fixed;
+ z-index: 9999;
+}
+.ui.toast-container.ui.attached {
+ width: 100%;
+ left: 0;
+}
+.ui.toast-container.ui.attached .vertical.attached {
+ border-radius: 0;
+}
+.ui.toast-container.ui.attached.ui.ui .attached.actions .button {
+ border-radius: 0;
+}
+.ui.toast-container.ui.attached .toast-box {
+ margin: 0;
+ width: 100%;
+ border-radius: 0;
+}
+.ui.toast-container.ui.attached .toast-box > .ui.toast,
+.ui.toast-container.ui.attached .toast-box > .ui.message {
+ margin-left: 0;
+}
+.ui.toast-container.ui.attached .toast-box.floating,
+.ui.toast-container.ui.attached .toast-box.hoverfloating:hover {
+ border: none;
+}
+.ui.toast-container.ui.attached .toast-box > .vertical > .content {
+ -webkit-box-flex: 1;
+ -ms-flex: 1;
+ flex: 1;
+}
+.ui.toast-container.ui.attached .toast-box > * {
+ width: 100%;
+ border-radius: 0;
+}
+.ui.toast-container.ui.attached .toast-box > * > .vertical:not(.actions) {
+ -webkit-box-flex: 1;
+ -ms-flex: 1;
+ flex: 1;
+}
+.ui.toast-container.ui.attached .toast-box > .attached.actions {
+ margin-right: 1px;
+}
+.ui.toast-container.ui.attached.top {
+ top: 0;
+}
+.ui.toast-container.ui.attached.bottom {
+ bottom: 0;
+}
+.ui.toast-container.top.right {
+ top: 0.85714286em;
+ right: 0.85714286em;
+ margin-left: 0.85714286em;
+}
+.ui.toast-container.top.left {
+ top: 0.85714286em;
+ left: 0.85714286em;
+ margin-right: 0.85714286em;
+}
+.ui.toast-container.top.center {
+ left: 50%;
+ -webkit-transform: translate(-50%, 0);
+ transform: translate(-50%, 0);
+ top: 0.85714286em;
+}
+.ui.toast-container.bottom.right {
+ bottom: 0.85714286em;
+ right: 0.85714286em;
+ margin-left: 0.85714286em;
+}
+.ui.toast-container.bottom.left {
+ bottom: 0.85714286em;
+ left: 0.85714286em;
+ margin-right: 0.85714286em;
+}
+.ui.toast-container.bottom.center {
+ left: 50%;
+ -webkit-transform: translate(-50%, 0);
+ transform: translate(-50%, 0);
+ bottom: 0.85714286em;
+}
+.ui.toast-container .visible.toast-box,
+.ui.toast-container .animating.toast-box,
+.ui.toast-container .toast-box {
+ display: table !important;
+}
+.ui.toast-container.horizontal {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-orient: horizontal;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: row;
+ flex-direction: row;
+}
+.ui.toast-container.horizontal .toast-box {
+ margin-right: 0.5em;
+}
+.ui.toast-container .toast-box {
+ margin-bottom: 0.5em;
+ border-radius: 0.28571429rem;
+ cursor: default;
+}
+.ui.toast-container .toast-box:hover {
+ opacity: 1;
+}
+.ui.toast-container .toast-box:not(.unclickable):hover {
+ cursor: pointer;
+}
+.ui.toast-container .toast-box.floating,
+.ui.toast-container .toast-box.hoverfloating:hover {
+ -webkit-box-shadow: 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15);
+ box-shadow: 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15);
+ border: 1px solid rgba(34, 36, 38, 0.12);
+}
+.ui.toast-container .toast-box.compact,
+.ui.toast-container .toast-box > .compact {
+ width: 350px;
+}
+.ui.toast-container .toast-box > .ui.toast,
+.ui.toast-container .toast-box > .ui.message {
+ margin: 0 -1px -0.01em;
+ position: relative;
+}
+.ui.toast-container .toast-box > .attached.progress {
+ z-index: 1;
+}
+.ui.toast-container .toast-box > .attached.progress.bottom {
+ margin: -0.2em -1px -0.01em;
+}
+.ui.toast-container .toast-box > .attached.progress.top {
+ margin: -0.01em -1px -0.2em;
+}
+.ui.toast-container .toast-box > .attached.progress .bar {
+ min-width: 0;
+}
+.ui.toast-container .toast-box > .attached.progress.info .bar.bar.bar {
+ background: #12a1bf;
+}
+.ui.toast-container .toast-box > .attached.progress.warning .bar.bar.bar {
+ background: #cf9b0d;
+}
+.ui.toast-container .toast-box > .attached.progress.success .bar.bar.bar {
+ background: #15792d;
+}
+.ui.toast-container .toast-box > .attached.progress.error .bar.bar.bar {
+ background: #9c1a1a;
+}
+.ui.toast-container .toast-box > .attached.progress.neutral .bar.bar.bar {
+ background: #d9d9d9;
+}
+.ui.toast-container .toast-box > .ui.message > .close.icon {
+ top: 0.3em;
+ right: 0.3em;
+}
+.ui.toast-container .toast-box > .ui.message > .actions:last-child {
+ margin-bottom: -1em;
+}
+.ui.toast-container .toast-box > .ui.message.icon {
+ -webkit-box-align: inherit;
+ -ms-flex-align: inherit;
+ align-items: inherit;
+}
+.ui.toast-container .toast-box > .ui.message.icon > :not(.icon):not(.actions) {
+ padding-left: 5rem;
+}
+.ui.toast-container .toast-box > .ui.message.icon > i.icon:not(.close) {
+ display: inline-block;
+ position: absolute;
+ width: 4rem;
+ top: 50%;
+ -webkit-transform: translateY(-50%);
+ transform: translateY(-50%);
+}
+.ui.toast-container .toast-box > .ui.message.icon:not(.vertical).actions > i.icon:not(.close) {
+ top: calc(50% - 1.2em);
+ -webkit-transform: none;
+ transform: none;
+}
+.ui.toast-container .toast-box > .ui.message.icon:not(.vertical).icon.icon.icon {
+ display: block;
+}
+.ui.toast-container .toast-box .ui.toast > .close.icon {
+ cursor: pointer;
+ margin: 0;
+ opacity: 0.7;
+ -webkit-transition: opacity 0.1s ease;
+ transition: opacity 0.1s ease;
+}
+.ui.toast-container .toast-box .ui.toast > .close.icon:hover {
+ opacity: 1;
+}
+.ui.toast-container .toast-box .ui.toast.vertical > .close.icon {
+ margin-top: -0.3em;
+ margin-right: -0.3em;
+}
+.ui.toast-container .toast-box .ui.toast:not(.vertical) > .close.icon {
+ position: absolute;
+ top: 0.3em;
+}
+.ui.toast-container .toast-box .ui.toast:not(.vertical) > .close.icon:not(.left) {
+ right: 0.3em;
+}
+.ui.toast-container .toast-box .ui.toast:not(.vertical) > .close.icon.left {
+ margin-left: -0.3em;
+}
+.ui.toast-container .toast-box .ui.card {
+ margin: 0;
+}
+.ui.toast-container .toast-box .ui.card.attached:not(.vertical).bottom {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+.ui.toast-container .toast-box .ui.card.attached:not(.vertical).bottom.horizontal > .image > img {
+ border-top-left-radius: 0;
+}
+.ui.toast-container .toast-box .ui.card.attached:not(.vertical).bottom.horizontal > .image:last-child > img {
+ border-top-right-radius: 0;
+}
+.ui.toast-container .toast-box .ui.card.attached:not(.vertical).top {
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.ui.toast-container .toast-box .ui.card.attached:not(.vertical).top.horizontal > .image > img {
+ border-bottom-left-radius: 0;
+}
+.ui.toast-container .toast-box .ui.card.attached:not(.vertical).top.horizontal > .image:last-child > img {
+ border-bottom-right-radius: 0;
+}
+.ui.toast-container .toast-box .ui.card.horizontal.actions > .image > img {
+ border-bottom-left-radius: 0;
+}
+.ui.toast-container .toast-box .ui.card.horizontal.actions > .image:last-child > img {
+ border-bottom-right-radius: 0;
+}
+.ui.toast-container .toast-box .progressing {
+ -webkit-animation-iteration-count: 1;
+ animation-iteration-count: 1;
+ -webkit-animation-timing-function: linear;
+ animation-timing-function: linear;
+}
+.ui.toast-container .toast-box .progressing.up {
+ -webkit-animation-name: progressUp;
+ animation-name: progressUp;
+}
+.ui.toast-container .toast-box .progressing.down {
+ -webkit-animation-name: progressDown;
+ animation-name: progressDown;
+}
+.ui.toast-container .toast-box .progressing.wait {
+ -webkit-animation-name: progressWait;
+ animation-name: progressWait;
+}
+.ui.toast-container .toast-box:hover .pausable.progressing {
+ -webkit-animation-play-state: paused;
+ animation-play-state: paused;
+}
+.ui.toast-container .toast-box .ui.toast:not(.vertical) {
+ display: block;
+}
+.ui.toast-container .toast-box :not(.comment):not(.card) .actions {
+ margin: 0.5em -1em -1em -1em;
+}
+.ui.toast-container .toast-box :not(.comment) .actions {
+ padding: 0.5em 0.5em 0.75em 0.5em;
+ text-align: right;
+}
+.ui.toast-container .toast-box :not(.comment) .actions.attached:not(.vertical) {
+ margin-right: 1px;
+}
+.ui.toast-container .toast-box :not(.comment) .actions:not(.basic):not(.attached) {
+ background: rgba(255, 255, 255, 0.25);
+ border-top: 1px solid rgba(0, 0, 0, 0.2);
+}
+.ui.toast-container .toast-box :not(.comment) .actions.left {
+ text-align: left;
+}
+.ui.toast-container .toast-box .vertical.actions > .button,
+.ui.toast-container .toast-box > .vertical > .vertical.vertical,
+.ui.toast-container .toast-box > .vertical.vertical.vertical {
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+}
+.ui.toast-container .toast-box :not(.comment) .vertical.actions {
+ -webkit-box-orient: vertical;
+ -webkit-box-direction: normal;
+ -ms-flex-direction: column;
+ flex-direction: column;
+}
+.ui.toast-container .toast-box :not(.comment) .vertical.actions > .button {
+ -webkit-box-pack: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+}
+.ui.toast-container .toast-box :not(.comment) .vertical.actions.attached > .button {
+ -webkit-box-align: center;
+ -ms-flex-align: center;
+ align-items: center;
+}
+.ui.toast-container .toast-box :not(.comment) .vertical.actions:not(.attached) {
+ border-top: 0;
+ margin-top: -0.75em;
+ margin-bottom: -0.75em;
+ margin-left: 1em;
+ -ms-flex-pack: distribute;
+ justify-content: space-around;
+}
+.ui.toast-container .toast-box :not(.comment) .vertical.actions:not(.attached):not(.basic) {
+ border-left: 1px solid rgba(0, 0, 0, 0.2);
+}
+.ui.toast-container .toast-box :not(.comment) .vertical.actions:not(.attached) > .button:not(:last-child) {
+ margin-bottom: 0.3em;
+}
+.ui.toast-container .toast-box :not(.comment) .vertical.actions:not(.attached).top {
+ -webkit-box-pack: start;
+ -ms-flex-pack: start;
+ justify-content: flex-start;
+}
+.ui.toast-container .toast-box :not(.comment) .vertical.actions:not(.attached).bottom {
+ -webkit-box-pack: end;
+ -ms-flex-pack: end;
+ justify-content: flex-end;
+}
+.ui.vertical.attached:not(.left).card > .image > img {
+ border-top-right-radius: 0;
+}
+.ui.vertical.attached:not(.left).card.horizontal > .image:last-child > img {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.ui.vertical.attached:not(.left).card,
+.ui.vertical.attached:not(.left).toast {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.ui.vertical.attached:not(.left).actions {
+ border-top-right-radius: 0.28571429rem;
+ border-bottom-right-radius: 0.28571429rem;
+}
+.ui.vertical.attached:not(.left).actions .button:first-child,
+.ui.vertical.attached:not(.left).actions .button:last-child {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.ui.vertical.attached:not(.left).message {
+ border-top-right-radius: 0;
+ border-bottom-left-radius: 0.28571429rem;
+}
+.ui.vertical.attached.left.card > .image > img {
+ border-top-left-radius: 0;
+}
+.ui.vertical.attached.left.card.horizontal > .image > img {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.ui.vertical.attached.left.card,
+.ui.vertical.attached.left.toast {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.ui.vertical.attached.left.actions {
+ border-top-left-radius: 0.28571429rem;
+ border-bottom-left-radius: 0.28571429rem;
+}
+.ui.vertical.attached.left.actions .button:first-child,
+.ui.vertical.attached.left.actions .button:last-child {
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.ui.vertical.attached.left.message.message.message {
+ border-top-right-radius: 0.28571429rem;
+ border-bottom-right-radius: 0.28571429rem;
+}
+.ui.attached:not(.vertical):not(.top).actions {
+ border-bottom-left-radius: 0.28571429rem;
+ border-bottom-right-radius: 0.28571429rem;
+}
+.ui.attached:not(.vertical):not(.top).actions .button:first-child {
+ border-bottom-left-radius: 0.28571429rem;
+}
+.ui.attached:not(.vertical):not(.top).actions .button:last-child {
+ border-bottom-right-radius: 0.28571429rem;
+}
+.ui.attached:not(.vertical).top.actions {
+ border-top-left-radius: 0.28571429rem;
+ border-top-right-radius: 0.28571429rem;
+}
+.ui.attached:not(.vertical).top.actions .button:first-child {
+ border-top-left-radius: 0.28571429rem;
+}
+.ui.attached:not(.vertical).top.actions .button:last-child {
+ border-top-right-radius: 0.28571429rem;
+}
+
+
+/*******************************
+ Toast
+*******************************/
+
+.ui.toast {
+ display: none;
+ border-radius: 0.28571429rem;
+ padding: 0.78571429em 1em;
+ margin: 0 -1px -0.01em;
+ color: rgba(0, 0, 0, 0.87);
+ background-color: #FFFFFF;
+}
+.ui.toast > .content > .header {
+ font-weight: bold;
+ color: inherit;
+ margin: 0;
+}
+.ui.toast.info {
+ background-color: #31CCEC;
+ color: rgba(255, 255, 255, 0.9);
+}
+.ui.toast.warning {
+ background-color: #F2C037;
+ color: rgba(255, 255, 255, 0.9);
+}
+.ui.toast.success {
+ background-color: #21BA45;
+ color: rgba(255, 255, 255, 0.9);
+}
+.ui.toast.error {
+ background-color: #DB2828;
+ color: rgba(255, 255, 255, 0.9);
+}
+.ui.toast.neutral {
+ background-color: #FFFFFF;
+ color: rgba(0, 0, 0, 0.87);
+}
+.ui.toast > i.icon:not(.close) {
+ font-size: 1.5em;
+}
+.ui.toast:not(.vertical):not(.centered):not(.center) > i.icon:not(.close) {
+ position: absolute;
+}
+.ui.toast:not(.vertical):not(.centered):not(.center) > .ui.image {
+ position: absolute;
+}
+.ui.toast:not(.vertical) > i.icon:not(.close) + .content {
+ padding-left: 3em;
+}
+.ui.toast:not(.vertical) > .close.icon + .content {
+ padding-left: 1.5em;
+}
+.ui.toast:not(.vertical) > .ui.image.avatar + .content {
+ padding-left: 3em;
+ min-height: 2em;
+}
+.ui.toast:not(.vertical) > .ui.image.mini + .content {
+ padding-left: 3.4em;
+ min-height: 35px;
+}
+.ui.toast:not(.vertical) > .ui.image.tiny + .content {
+ padding-left: 7em;
+ min-height: 80px;
+}
+.ui.toast:not(.vertical) > .ui.image.small + .content {
+ padding-left: 12em;
+ min-height: 150px;
+}
+.ui.toast:not(.vertical):not(.centered):not(.center) > .centered.image,
+.ui.toast:not(.vertical):not(.centered):not(.center) > .centered.icon {
+ -webkit-transform: translateY(-50%);
+ transform: translateY(-50%);
+ top: 50%;
+}
+.ui.toast:not(.vertical).actions > .centered.image {
+ top: calc(50% - 2em);
+}
+.ui.toast:not(.vertical).actions > .centered.icon {
+ top: calc(50% - 1.2em);
+}
+.ui.toast.vertical > .close.icon + .content {
+ padding-left: 1em;
+}
+.ui.toast.vertical > .ui.image + .content,
+.ui.toast.vertical > i.icon:not(.close) + .content {
+ padding-left: 1em;
+}
+.ui.toast.vertical > .ui.image {
+ -ms-flex-item-align: start;
+ align-self: flex-start;
+ -ms-flex-negative: 0;
+ flex-shrink: 0;
+
+/* IE11 fix */
+}
+.ui.toast.vertical > .centered.image,
+.ui.toast.vertical > .centered.icon {
+ -ms-flex-item-align: center;
+ align-self: center;
+}
+.ui.toast.attached.bottom {
+ border-top-left-radius: 0;
+ border-top-right-radius: 0;
+}
+.ui.toast.attached.top {
+ border-bottom-left-radius: 0;
+ border-bottom-right-radius: 0;
+}
+.ui.hoverfloating.message:hover {
+ -webkit-box-shadow: 0 0 0 1px inset, 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15);
+ box-shadow: 0 0 0 1px inset, 0 2px 4px 0 rgba(34, 36, 38, 0.12), 0 2px 10px 0 rgba(34, 36, 38, 0.15);
+}
+.ui.center.toast-container .toast-box,
+.ui.right.toast-container .toast-box {
+ margin-left: auto;
+}
+.ui.center.toast-container .toast-box {
+ margin-right: auto;
+}
+.ui.ui.toast-container .toast-box .centered.toast,
+.ui.ui.toast-container .toast-box .center.aligned.toast {
+ text-align: center;
+ display: -webkit-box;
+ display: -ms-flexbox;
+ display: flex;
+ -webkit-box-pack: center;
+ -ms-flex-pack: center;
+ justify-content: center;
+}
+.ui.ui.toast-container .toast-box .centered.toast > .content,
+.ui.ui.toast-container .toast-box .center.aligned.toast > .content,
+.ui.ui.toast-container .toast-box .centered.toast > .ui.image,
+.ui.ui.toast-container .toast-box .center.aligned.toast > .ui.image,
+.ui.ui.toast-container .toast-box .centered.toast > i.icon:not(.close),
+.ui.ui.toast-container .toast-box .center.aligned.toast > i.icon:not(.close) {
+ -ms-flex-item-align: center;
+ align-self: center;
+}
+.ui.toast-container .toast-box .toast .centered.content,
+.ui.toast-container .toast-box .toast .center.aligned.content {
+ text-align: center;
+}
+.ui.toast-container .toast-box .centered.actions,
+.ui.toast-container .toast-box .center.aligned.actions {
+ text-align: center;
+}
+.ui.toast-container .toast-box .centered.actions:not(.attached) > .button:not(.fluid),
+.ui.toast-container .toast-box .center.aligned.actions:not(.attached) > .button:not(.fluid) {
+ margin-left: 0.25em;
+ margin-right: 0.25em;
+}
+
+/*--------------
+ Colors
+-------------- */
+
+.ui.primary.toast {
+ background-color: #2185D0;
+ color: rgba(255, 255, 255, 0.9);
+}
+.ui.inverted.primary.toast,
+.ui.toast-container .toast-box > .inverted.primary.attached.progress .bar {
+ background-color: #54C8FF;
+ color: rgba(0, 0, 0, 0.87);
+}
+.ui.secondary.toast {
+ background-color: #1B1C1D;
+ color: rgba(255, 255, 255, 0.9);
+}
+.ui.inverted.secondary.toast,
+.ui.toast-container .toast-box > .inverted.secondary.attached.progress .bar {
+ background-color: #545454;
+ color: rgba(0, 0, 0, 0.87);
+}
+.ui.red.toast {
+ background-color: #DB2828;
+ color: rgba(255, 255, 255, 0.9);
+}
+.ui.inverted.red.toast,
+.ui.toast-container .toast-box > .inverted.red.attached.progress .bar {
+ background-color: #FF695E;
+ color: rgba(0, 0, 0, 0.87);
+}
+.ui.orange.toast {
+ background-color: #F2711C;
+ color: rgba(255, 255, 255, 0.9);
+}
+.ui.inverted.orange.toast,
+.ui.toast-container .toast-box > .inverted.orange.attached.progress .bar {
+ background-color: #FF851B;
+ color: rgba(0, 0, 0, 0.87);
+}
+.ui.yellow.toast {
+ background-color: #FBBD08;
+ color: rgba(255, 255, 255, 0.9);
+}
+.ui.inverted.yellow.toast,
+.ui.toast-container .toast-box > .inverted.yellow.attached.progress .bar {
+ background-color: #FFE21F;
+ color: rgba(0, 0, 0, 0.87);
+}
+.ui.olive.toast {
+ background-color: #B5CC18;
+ color: rgba(255, 255, 255, 0.9);
+}
+.ui.inverted.olive.toast,
+.ui.toast-container .toast-box > .inverted.olive.attached.progress .bar {
+ background-color: #D9E778;
+ color: rgba(0, 0, 0, 0.87);
+}
+.ui.green.toast {
+ background-color: #21BA45;
+ color: rgba(255, 255, 255, 0.9);
+}
+.ui.inverted.green.toast,
+.ui.toast-container .toast-box > .inverted.green.attached.progress .bar {
+ background-color: #2ECC40;
+ color: rgba(0, 0, 0, 0.87);
+}
+.ui.teal.toast {
+ background-color: #00B5AD;
+ color: rgba(255, 255, 255, 0.9);
+}
+.ui.inverted.teal.toast,
+.ui.toast-container .toast-box > .inverted.teal.attached.progress .bar {
+ background-color: #6DFFFF;
+ color: rgba(0, 0, 0, 0.87);
+}
+.ui.blue.toast {
+ background-color: #2185D0;
+ color: rgba(255, 255, 255, 0.9);
+}
+.ui.inverted.blue.toast,
+.ui.toast-container .toast-box > .inverted.blue.attached.progress .bar {
+ background-color: #54C8FF;
+ color: rgba(0, 0, 0, 0.87);
+}
+.ui.violet.toast {
+ background-color: #6435C9;
+ color: rgba(255, 255, 255, 0.9);
+}
+.ui.inverted.violet.toast,
+.ui.toast-container .toast-box > .inverted.violet.attached.progress .bar {
+ background-color: #A291FB;
+ color: rgba(0, 0, 0, 0.87);
+}
+.ui.purple.toast {
+ background-color: #A333C8;
+ color: rgba(255, 255, 255, 0.9);
+}
+.ui.inverted.purple.toast,
+.ui.toast-container .toast-box > .inverted.purple.attached.progress .bar {
+ background-color: #DC73FF;
+ color: rgba(0, 0, 0, 0.87);
+}
+.ui.pink.toast {
+ background-color: #E03997;
+ color: rgba(255, 255, 255, 0.9);
+}
+.ui.inverted.pink.toast,
+.ui.toast-container .toast-box > .inverted.pink.attached.progress .bar {
+ background-color: #FF8EDF;
+ color: rgba(0, 0, 0, 0.87);
+}
+.ui.brown.toast {
+ background-color: #A5673F;
+ color: rgba(255, 255, 255, 0.9);
+}
+.ui.inverted.brown.toast,
+.ui.toast-container .toast-box > .inverted.brown.attached.progress .bar {
+ background-color: #D67C1C;
+ color: rgba(0, 0, 0, 0.87);
+}
+.ui.grey.toast {
+ background-color: #767676;
+ color: rgba(255, 255, 255, 0.9);
+}
+.ui.inverted.grey.toast,
+.ui.toast-container .toast-box > .inverted.grey.attached.progress .bar {
+ background-color: #DCDDDE;
+ color: rgba(0, 0, 0, 0.87);
+}
+.ui.black.toast {
+ background-color: #1B1C1D;
+ color: rgba(255, 255, 255, 0.9);
+}
+.ui.inverted.black.toast,
+.ui.toast-container .toast-box > .inverted.black.attached.progress .bar {
+ background-color: #545454;
+ color: rgba(0, 0, 0, 0.87);
+}
+.ui.inverted.toast {
+ color: rgba(255, 255, 255, 0.9);
+ background-color: #1B1C1D;
+}
+@media only screen and (max-width: 420px) {
+ .ui.toast-container .toast-box.toast-box,
+ .ui.toast-container .toast-box > .compact,
+ .ui.toast-container .toast-box > .vertical > *,
+ .ui.toast-container .toast-box > * {
+ width: auto;
+ max-width: 100%;
+ }
+ .ui.toast-container .toast-box > *:not(.vertical) {
+ min-width: 280px;
+ }
+ .ui.toast-container .toast-box > .ui.card.horizontal,
+ .ui.toast-container .toast-box > .vertical > .ui.horizontal.card {
+ min-width: initial;
+ }
+}
+
+/*---------------
+ Progress Bar
+ ----------------*/
+
+@-webkit-keyframes progressDown {
+ 0% {
+ width: 100%;
+ }
+ 100% {
+ width: 0;
+ }
+}
+@keyframes progressDown {
+ 0% {
+ width: 100%;
+ }
+ 100% {
+ width: 0;
+ }
+}
+@-webkit-keyframes progressUp {
+ 0% {
+ width: 0;
+ }
+ 100% {
+ width: 100%;
+ }
+}
+@keyframes progressUp {
+ 0% {
+ width: 0;
+ }
+ 100% {
+ width: 100%;
+ }
+}
+@-webkit-keyframes progressWait {
+ 0% {
+ opacity: 1;
+ }
+ 100% {
+ opacity: 0;
+ }
+}
+@keyframes progressWait {
+ 0% {
+ opacity: 1;
+ }
+ 100% {
+ opacity: 0;
+ }
+}
diff --git a/public/dist/components/toast.js b/public/dist/components/toast.js
new file mode 100644
index 000000000..311449329
--- /dev/null
+++ b/public/dist/components/toast.js
@@ -0,0 +1,892 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Toast
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+'use strict';
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.toast = function(parameters) {
+ var
+ $allModules = $(this),
+ moduleSelector = $allModules.selector || '',
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+ returnedValue
+ ;
+ $allModules
+ .each(function() {
+ var
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.fn.toast.settings, parameters)
+ : $.extend({}, $.fn.toast.settings),
+
+ className = settings.className,
+ selector = settings.selector,
+ error = settings.error,
+ namespace = settings.namespace,
+ fields = settings.fields,
+
+ eventNamespace = '.' + namespace,
+ moduleNamespace = namespace + '-module',
+
+ $module = $(this),
+ $toastBox,
+ $toast,
+ $actions,
+ $progress,
+ $progressBar,
+ $animationObject,
+ $close,
+ $context = (settings.context)
+ ? $(settings.context)
+ : $('body'),
+
+ isToastComponent = $module.hasClass('toast') || $module.hasClass('message') || $module.hasClass('card'),
+
+ element = this,
+ instance = isToastComponent ? $module.data(moduleNamespace) : undefined,
+
+ module
+ ;
+ module = {
+
+ initialize: function() {
+ module.verbose('Initializing element');
+ if (!module.has.container()) {
+ module.create.container();
+ }
+ if(isToastComponent || settings.message !== '' || settings.title !== '' || module.get.iconClass() !== '' || settings.showImage || module.has.configActions()) {
+ if(typeof settings.showProgress !== 'string' || [className.top,className.bottom].indexOf(settings.showProgress) === -1 ) {
+ settings.showProgress = false;
+ }
+ module.create.toast();
+ if(settings.closeOnClick && (settings.closeIcon || $($toast).find(selector.input).length > 0 || module.has.configActions())){
+ settings.closeOnClick = false;
+ }
+ if(!settings.closeOnClick) {
+ $toastBox.addClass(className.unclickable);
+ }
+ module.bind.events();
+ }
+ module.instantiate();
+ if($toastBox) {
+ module.show();
+ }
+ },
+
+ instantiate: function() {
+ module.verbose('Storing instance of toast');
+ instance = module;
+ $module
+ .data(moduleNamespace, instance)
+ ;
+ },
+
+ destroy: function() {
+ if($toastBox) {
+ module.debug('Removing toast', $toastBox);
+ module.unbind.events();
+ $toastBox.remove();
+ $toastBox = undefined;
+ $toast = undefined;
+ $animationObject = undefined;
+ settings.onRemove.call($toastBox, element);
+ $progress = undefined;
+ $progressBar = undefined;
+ $close = undefined;
+ }
+ $module
+ .removeData(moduleNamespace)
+ ;
+ },
+
+ show: function(callback) {
+ callback = callback || function(){};
+ module.debug('Showing toast');
+ if(settings.onShow.call($toastBox, element) === false) {
+ module.debug('onShow callback returned false, cancelling toast animation');
+ return;
+ }
+ module.animate.show(callback);
+ },
+
+ close: function(callback) {
+ callback = callback || function(){};
+ module.remove.visible();
+ module.unbind.events();
+ module.animate.close(callback);
+
+ },
+
+ create: {
+ container: function() {
+ module.verbose('Creating container');
+ $context.append($('
',{class: settings.position + ' ' + className.container + ' ' +(settings.horizontal ? className.horizontal : '')}));
+ },
+ toast: function() {
+ $toastBox = $('
', {class: className.box});
+ var iconClass = module.get.iconClass();
+ if (!isToastComponent) {
+ module.verbose('Creating toast');
+ $toast = $('
');
+ var $content = $('
', {class: className.content});
+ if (iconClass !== '') {
+ $toast.append($(' ', {class: iconClass + ' ' + className.icon}));
+ }
+
+ if (settings.showImage) {
+ $toast.append($(' ', {
+ class: className.image + ' ' + settings.classImage,
+ src: settings.showImage
+ }));
+ }
+ if (settings.title !== '') {
+ $content.append($('
', {
+ class: className.title,
+ text: settings.title
+ }));
+ }
+
+ $content.append($('
', {class: className.message, html: module.helpers.escape(settings.message, settings.preserveHTML)}));
+
+ $toast
+ .addClass(settings.class + ' ' + className.toast)
+ .append($content)
+ ;
+ $toast.css('opacity', settings.opacity);
+ if (settings.closeIcon) {
+ $close = $(' ', {class: className.close + ' ' + (typeof settings.closeIcon === 'string' ? settings.closeIcon : '')});
+ if($close.hasClass(className.left)) {
+ $toast.prepend($close);
+ } else {
+ $toast.append($close);
+ }
+ }
+ } else {
+ $toast = settings.cloneModule ? $module.clone().removeAttr('id') : $module;
+ $close = $toast.find('> i'+module.helpers.toClass(className.close));
+ settings.closeIcon = ($close.length > 0);
+ if (iconClass !== '') {
+ $toast.find(selector.icon).attr('class',iconClass + ' ' + className.icon);
+ }
+ if (settings.showImage) {
+ $toast.find(selector.image).attr('src',settings.showImage);
+ }
+ if (settings.title !== '') {
+ $toast.find(selector.title).html(module.helpers.escape(settings.title, settings.preserveHTML));
+ }
+ if (settings.message !== '') {
+ $toast.find(selector.message).html(module.helpers.escape(settings.message, settings.preserveHTML));
+ }
+ }
+ if ($toast.hasClass(className.compact)) {
+ settings.compact = true;
+ }
+ if ($toast.hasClass('card')) {
+ settings.compact = false;
+ }
+ $actions = $toast.find('.actions');
+ if (module.has.configActions()) {
+ if ($actions.length === 0) {
+ $actions = $('
', {class: className.actions + ' ' + (settings.classActions || '')}).appendTo($toast);
+ }
+ if($toast.hasClass('card') && !$actions.hasClass(className.attached)) {
+ $actions.addClass(className.extraContent);
+ if($actions.hasClass(className.vertical)) {
+ $actions.removeClass(className.vertical);
+ module.error(error.verticalCard);
+ }
+ }
+ settings.actions.forEach(function (el) {
+ var icon = el[fields.icon] ? ' ' : '',
+ text = module.helpers.escape(el[fields.text] || '', settings.preserveHTML),
+ cls = module.helpers.deQuote(el[fields.class] || ''),
+ click = el[fields.click] && $.isFunction(el[fields.click]) ? el[fields.click] : function () {};
+ $actions.append($(' ', {
+ html: icon + text,
+ class: className.button + ' ' + cls,
+ click: function () {
+ if (click.call(element, $module) === false) {
+ return;
+ }
+ module.close();
+ }
+ }));
+ });
+ }
+ if ($actions && $actions.hasClass(className.vertical)) {
+ $toast.addClass(className.vertical);
+ }
+ if($actions.length > 0 && !$actions.hasClass(className.attached)) {
+ if ($actions && (!$actions.hasClass(className.basic) || $actions.hasClass(className.left))) {
+ $toast.addClass(className.actions);
+ }
+ }
+ if(settings.displayTime === 'auto'){
+ settings.displayTime = Math.max(settings.minDisplayTime, $toast.text().split(" ").length / settings.wordsPerMinute * 60000);
+ }
+ $toastBox.append($toast);
+
+ if($actions.length > 0 && $actions.hasClass(className.attached)) {
+ $actions.addClass(className.buttons);
+ $actions.detach();
+ $toast.addClass(className.attached);
+ if (!$actions.hasClass(className.vertical)) {
+ if ($actions.hasClass(className.top)) {
+ $toastBox.prepend($actions);
+ $toast.addClass(className.bottom);
+ } else {
+ $toastBox.append($actions);
+ $toast.addClass(className.top);
+ }
+ } else {
+ $toast.wrap(
+ $('
',{
+ class:className.vertical + ' ' +
+ className.attached + ' ' +
+ (settings.compact ? className.compact : '')
+ })
+ );
+ if($actions.hasClass(className.left)) {
+ $toast.addClass(className.left).parent().addClass(className.left).prepend($actions);
+ } else {
+ $toast.parent().append($actions);
+ }
+ }
+ }
+ if($module !== $toast) {
+ $module = $toast;
+ element = $toast[0];
+ }
+ if(settings.displayTime > 0) {
+ var progressingClass = className.progressing+' '+(settings.pauseOnHover ? className.pausable:'');
+ if (!!settings.showProgress) {
+ $progress = $('
', {
+ class: className.progress + ' ' + (settings.classProgress || settings.class),
+ 'data-percent': ''
+ });
+ if(!settings.classProgress) {
+ if ($toast.hasClass('toast') && !$toast.hasClass(className.inverted)) {
+ $progress.addClass(className.inverted);
+ } else {
+ $progress.removeClass(className.inverted);
+ }
+ }
+ $progressBar = $('
', {class: 'bar '+(settings.progressUp ? 'up ' : 'down ')+progressingClass});
+ $progress
+ .addClass(settings.showProgress)
+ .append($progressBar);
+ if ($progress.hasClass(className.top)) {
+ $toastBox.prepend($progress);
+ } else {
+ $toastBox.append($progress);
+ }
+ $progressBar.css('animation-duration', settings.displayTime / 1000 + 's');
+ }
+ $animationObject = $(' ',{class:'wait '+progressingClass});
+ $animationObject.css('animation-duration', settings.displayTime / 1000 + 's');
+ $animationObject.appendTo($toast);
+ }
+ if (settings.compact) {
+ $toastBox.addClass(className.compact);
+ $toast.addClass(className.compact);
+ if($progress) {
+ $progress.addClass(className.compact);
+ }
+ }
+ if (settings.newestOnTop) {
+ $toastBox.prependTo(module.get.container());
+ }
+ else {
+ $toastBox.appendTo(module.get.container());
+ }
+ }
+ },
+
+ bind: {
+ events: function() {
+ module.debug('Binding events to toast');
+ if(settings.closeOnClick || settings.closeIcon) {
+ (settings.closeIcon ? $close : $toast)
+ .on('click' + eventNamespace, module.event.click)
+ ;
+ }
+ if($animationObject) {
+ $animationObject.on('animationend' + eventNamespace, module.close);
+ }
+ $toastBox
+ .on('click' + eventNamespace, selector.approve, module.event.approve)
+ .on('click' + eventNamespace, selector.deny, module.event.deny)
+ ;
+ }
+ },
+
+ unbind: {
+ events: function() {
+ module.debug('Unbinding events to toast');
+ if(settings.closeOnClick || settings.closeIcon) {
+ (settings.closeIcon ? $close : $toast)
+ .off('click' + eventNamespace)
+ ;
+ }
+ if($animationObject) {
+ $animationObject.off('animationend' + eventNamespace);
+ }
+ $toastBox
+ .off('click' + eventNamespace)
+ ;
+ }
+ },
+
+ animate: {
+ show: function(callback) {
+ callback = $.isFunction(callback) ? callback : function(){};
+ if(settings.transition && module.can.useElement('transition') && $module.transition('is supported')) {
+ module.set.visible();
+ $toastBox
+ .transition({
+ animation : settings.transition.showMethod + ' in',
+ queue : false,
+ debug : settings.debug,
+ verbose : settings.verbose,
+ duration : settings.transition.showDuration,
+ onComplete : function() {
+ callback.call($toastBox, element);
+ settings.onVisible.call($toastBox, element);
+ }
+ })
+ ;
+ }
+ },
+ close: function(callback) {
+ callback = $.isFunction(callback) ? callback : function(){};
+ module.debug('Closing toast');
+ if(settings.onHide.call($toastBox, element) === false) {
+ module.debug('onHide callback returned false, cancelling toast animation');
+ return;
+ }
+ if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
+ $toastBox
+ .transition({
+ animation : settings.transition.hideMethod + ' out',
+ queue : false,
+ duration : settings.transition.hideDuration,
+ debug : settings.debug,
+ verbose : settings.verbose,
+ interval : 50,
+
+ onBeforeHide: function(callback){
+ callback = $.isFunction(callback)?callback : function(){};
+ if(settings.transition.closeEasing !== ''){
+ if($toastBox) {
+ $toastBox.css('opacity', 0);
+ $toastBox.wrap('
').parent().hide(settings.transition.closeDuration, settings.transition.closeEasing, function () {
+ if ($toastBox) {
+ $toastBox.parent().remove();
+ callback.call($toastBox);
+ }
+ });
+ }
+ } else {
+ callback.call($toastBox);
+ }
+ },
+ onComplete : function() {
+ callback.call($toastBox, element);
+ settings.onHidden.call($toastBox, element);
+ module.destroy();
+ }
+ })
+ ;
+ }
+ else {
+ module.error(error.noTransition);
+ }
+ },
+ pause: function() {
+ $animationObject.css('animationPlayState','paused');
+ if($progressBar) {
+ $progressBar.css('animationPlayState', 'paused');
+ }
+ },
+ continue: function() {
+ $animationObject.css('animationPlayState','running');
+ if($progressBar) {
+ $progressBar.css('animationPlayState', 'running');
+ }
+ }
+ },
+
+ has: {
+ container: function() {
+ module.verbose('Determining if there is already a container');
+ return ($context.find(module.helpers.toClass(settings.position) + selector.container + (settings.horizontal ? module.helpers.toClass(className.horizontal) : '')).length > 0);
+ },
+ toast: function(){
+ return !!module.get.toast();
+ },
+ toasts: function(){
+ return module.get.toasts().length > 0;
+ },
+ configActions: function () {
+ return Array.isArray(settings.actions) && settings.actions.length > 0;
+ }
+ },
+
+ get: {
+ container: function() {
+ return ($context.find(module.helpers.toClass(settings.position) + selector.container)[0]);
+ },
+ toastBox: function() {
+ return $toastBox || null;
+ },
+ toast: function() {
+ return $toast || null;
+ },
+ toasts: function() {
+ return $(module.get.container()).find(selector.box);
+ },
+ iconClass: function() {
+ return typeof settings.showIcon === 'string' ? settings.showIcon : settings.showIcon && settings.icons[settings.class] ? settings.icons[settings.class] : '';
+ },
+ remainingTime: function() {
+ return $animationObject ? $animationObject.css('opacity') * settings.displayTime : 0;
+ }
+ },
+
+ set: {
+ visible: function() {
+ $toast.addClass(className.visible);
+ }
+ },
+
+ remove: {
+ visible: function() {
+ $toast.removeClass(className.visible);
+ }
+ },
+
+ event: {
+ click: function(event) {
+ if($(event.target).closest('a').length === 0) {
+ settings.onClick.call($toastBox, element);
+ module.close();
+ }
+ },
+ approve: function() {
+ if(settings.onApprove.call(element, $module) === false) {
+ module.verbose('Approve callback returned false cancelling close');
+ return;
+ }
+ module.close();
+ },
+ deny: function() {
+ if(settings.onDeny.call(element, $module) === false) {
+ module.verbose('Deny callback returned false cancelling close');
+ return;
+ }
+ module.close();
+ }
+ },
+
+ helpers: {
+ toClass: function(selector) {
+ var
+ classes = selector.split(' '),
+ result = ''
+ ;
+
+ classes.forEach(function (element) {
+ result += '.' + element;
+ });
+
+ return result;
+ },
+ deQuote: function(string) {
+ return String(string).replace(/"/g,"");
+ },
+ escape: function(string, preserveHTML) {
+ if (preserveHTML){
+ return string;
+ }
+ var
+ badChars = /[<>"'`]/g,
+ shouldEscape = /[&<>"'`]/,
+ escape = {
+ "<": "<",
+ ">": ">",
+ '"': """,
+ "'": "'",
+ "`": "`"
+ },
+ escapedChar = function(chr) {
+ return escape[chr];
+ }
+ ;
+ if(shouldEscape.test(string)) {
+ string = string.replace(/&(?![a-z0-9#]{1,6};)/, "&");
+ return string.replace(badChars, escapedChar);
+ }
+ return string;
+ }
+ },
+
+ can: {
+ useElement: function(element){
+ if ($.fn[element] !== undefined) {
+ return true;
+ }
+ module.error(error.noElement.replace('{element}',element));
+ return false;
+ }
+ },
+
+ setting: function(name, value) {
+ module.debug('Changing setting', name, value);
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ if($.isPlainObject(settings[name])) {
+ $.extend(true, settings[name], value);
+ }
+ else {
+ settings[name] = value;
+ }
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ module.error(error.method, query);
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ returnedValue = $module;
+ }
+ })
+ ;
+
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.fn.toast.settings = {
+
+ name : 'Toast',
+ namespace : 'toast',
+
+ silent : false,
+ debug : false,
+ verbose : false,
+ performance : true,
+
+ context : 'body',
+
+ position : 'top right',
+ horizontal : false,
+ class : 'neutral',
+ classProgress : false,
+ classActions : false,
+ classImage : 'mini',
+
+ title : '',
+ message : '',
+ displayTime : 3000, // set to zero to require manually dismissal, otherwise hides on its own
+ minDisplayTime : 1000, // minimum displaytime in case displayTime is set to 'auto'
+ wordsPerMinute : 120,
+ showIcon : false,
+ newestOnTop : false,
+ showProgress : false,
+ pauseOnHover : true,
+ progressUp : false, //if true, the bar will start at 0% and increase to 100%
+ opacity : 1,
+ compact : true,
+ closeIcon : false,
+ closeOnClick : true,
+ cloneModule : true,
+ actions : false,
+ preserveHTML : true,
+ showImage : false,
+
+ // transition settings
+ transition : {
+ showMethod : 'scale',
+ showDuration : 500,
+ hideMethod : 'scale',
+ hideDuration : 500,
+ closeEasing : 'easeOutCubic', //Set to empty string to stack the closed toast area immediately (old behaviour)
+ closeDuration: 500
+ },
+
+ error: {
+ method : 'The method you called is not defined.',
+ noElement : 'This module requires ui {element}',
+ verticalCard : 'Vertical but not attached actions are not supported for card layout'
+ },
+
+ className : {
+ container : 'ui toast-container',
+ box : 'floating toast-box',
+ progress : 'ui attached active progress',
+ toast : 'ui toast',
+ icon : 'centered icon',
+ visible : 'visible',
+ content : 'content',
+ title : 'ui header',
+ message : 'message',
+ actions : 'actions',
+ extraContent : 'extra content',
+ button : 'ui button',
+ buttons : 'ui buttons',
+ close : 'close icon',
+ image : 'ui image',
+ vertical : 'vertical',
+ horizontal : 'horizontal',
+ attached : 'attached',
+ inverted : 'inverted',
+ compact : 'compact',
+ pausable : 'pausable',
+ progressing : 'progressing',
+ top : 'top',
+ bottom : 'bottom',
+ left : 'left',
+ basic : 'basic',
+ unclickable : 'unclickable'
+ },
+
+ icons : {
+ info : 'info',
+ success : 'checkmark',
+ warning : 'warning',
+ error : 'times'
+ },
+
+ selector : {
+ container : '.ui.toast-container',
+ box : '.toast-box',
+ toast : '.ui.toast',
+ title : '.header',
+ message : '.message:not(.ui)',
+ image : '> img.image, > .image > img',
+ icon : '> i.icon',
+ input : 'input:not([type="hidden"]), textarea, select, button, .ui.button, ui.dropdown',
+ approve : '.actions .positive, .actions .approve, .actions .ok',
+ deny : '.actions .negative, .actions .deny, .actions .cancel'
+ },
+
+ fields : {
+ class : 'class',
+ text : 'text',
+ icon : 'icon',
+ click : 'click'
+ },
+
+ // callbacks
+ onShow : function(){},
+ onVisible : function(){},
+ onClick : function(){},
+ onHide : function(){},
+ onHidden : function(){},
+ onRemove : function(){},
+ onApprove : function(){},
+ onDeny : function(){}
+};
+
+$.extend( $.easing, {
+ easeOutBounce: function (x, t, b, c, d) {
+ if ((t/=d) < (1/2.75)) {
+ return c*(7.5625*t*t) + b;
+ } else if (t < (2/2.75)) {
+ return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
+ } else if (t < (2.5/2.75)) {
+ return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
+ } else {
+ return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
+ }
+ },
+ easeOutCubic: function (t) {
+ return (--t)*t*t+1;
+ }
+});
+
+
+})( jQuery, window, document );
diff --git a/public/dist/components/toast.min.css b/public/dist/components/toast.min.css
new file mode 100644
index 000000000..e7d59b012
--- /dev/null
+++ b/public/dist/components/toast.min.css
@@ -0,0 +1,9 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Toast
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */.ui.toast-container{position:fixed;z-index:9999}.ui.toast-container.ui.attached{width:100%;left:0}.ui.toast-container.ui.attached .vertical.attached{border-radius:0}.ui.toast-container.ui.attached.ui.ui .attached.actions .button{border-radius:0}.ui.toast-container.ui.attached .toast-box{margin:0;width:100%;border-radius:0}.ui.toast-container.ui.attached .toast-box>.ui.message,.ui.toast-container.ui.attached .toast-box>.ui.toast{margin-left:0}.ui.toast-container.ui.attached .toast-box.floating,.ui.toast-container.ui.attached .toast-box.hoverfloating:hover{border:none}.ui.toast-container.ui.attached .toast-box>.vertical>.content{-webkit-box-flex:1;-ms-flex:1;flex:1}.ui.toast-container.ui.attached .toast-box>*{width:100%;border-radius:0}.ui.toast-container.ui.attached .toast-box>*>.vertical:not(.actions){-webkit-box-flex:1;-ms-flex:1;flex:1}.ui.toast-container.ui.attached .toast-box>.attached.actions{margin-right:1px}.ui.toast-container.ui.attached.top{top:0}.ui.toast-container.ui.attached.bottom{bottom:0}.ui.toast-container.top.right{top:.85714286em;right:.85714286em;margin-left:.85714286em}.ui.toast-container.top.left{top:.85714286em;left:.85714286em;margin-right:.85714286em}.ui.toast-container.top.center{left:50%;-webkit-transform:translate(-50%,0);transform:translate(-50%,0);top:.85714286em}.ui.toast-container.bottom.right{bottom:.85714286em;right:.85714286em;margin-left:.85714286em}.ui.toast-container.bottom.left{bottom:.85714286em;left:.85714286em;margin-right:.85714286em}.ui.toast-container.bottom.center{left:50%;-webkit-transform:translate(-50%,0);transform:translate(-50%,0);bottom:.85714286em}.ui.toast-container .animating.toast-box,.ui.toast-container .toast-box,.ui.toast-container .visible.toast-box{display:table!important}.ui.toast-container.horizontal{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.ui.toast-container.horizontal .toast-box{margin-right:.5em}.ui.toast-container .toast-box{margin-bottom:.5em;border-radius:.28571429rem;cursor:default}.ui.toast-container .toast-box:hover{opacity:1}.ui.toast-container .toast-box:not(.unclickable):hover{cursor:pointer}.ui.toast-container .toast-box.floating,.ui.toast-container .toast-box.hoverfloating:hover{-webkit-box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);border:1px solid rgba(34,36,38,.12)}.ui.toast-container .toast-box.compact,.ui.toast-container .toast-box>.compact{width:350px}.ui.toast-container .toast-box>.ui.message,.ui.toast-container .toast-box>.ui.toast{margin:0 -1px -.01em;position:relative}.ui.toast-container .toast-box>.attached.progress{z-index:1}.ui.toast-container .toast-box>.attached.progress.bottom{margin:-.2em -1px -.01em}.ui.toast-container .toast-box>.attached.progress.top{margin:-.01em -1px -.2em}.ui.toast-container .toast-box>.attached.progress .bar{min-width:0}.ui.toast-container .toast-box>.attached.progress.info .bar.bar.bar{background:#12a1bf}.ui.toast-container .toast-box>.attached.progress.warning .bar.bar.bar{background:#cf9b0d}.ui.toast-container .toast-box>.attached.progress.success .bar.bar.bar{background:#15792d}.ui.toast-container .toast-box>.attached.progress.error .bar.bar.bar{background:#9c1a1a}.ui.toast-container .toast-box>.attached.progress.neutral .bar.bar.bar{background:#d9d9d9}.ui.toast-container .toast-box>.ui.message>.close.icon{top:.3em;right:.3em}.ui.toast-container .toast-box>.ui.message>.actions:last-child{margin-bottom:-1em}.ui.toast-container .toast-box>.ui.message.icon{-webkit-box-align:inherit;-ms-flex-align:inherit;align-items:inherit}.ui.toast-container .toast-box>.ui.message.icon>:not(.icon):not(.actions){padding-left:5rem}.ui.toast-container .toast-box>.ui.message.icon>i.icon:not(.close){display:inline-block;position:absolute;width:4rem;top:50%;-webkit-transform:translateY(-50%);transform:translateY(-50%)}.ui.toast-container .toast-box>.ui.message.icon:not(.vertical).actions>i.icon:not(.close){top:calc(50% - 1.2em);-webkit-transform:none;transform:none}.ui.toast-container .toast-box>.ui.message.icon:not(.vertical).icon.icon.icon{display:block}.ui.toast-container .toast-box .ui.toast>.close.icon{cursor:pointer;margin:0;opacity:.7;-webkit-transition:opacity .1s ease;transition:opacity .1s ease}.ui.toast-container .toast-box .ui.toast>.close.icon:hover{opacity:1}.ui.toast-container .toast-box .ui.toast.vertical>.close.icon{margin-top:-.3em;margin-right:-.3em}.ui.toast-container .toast-box .ui.toast:not(.vertical)>.close.icon{position:absolute;top:.3em}.ui.toast-container .toast-box .ui.toast:not(.vertical)>.close.icon:not(.left){right:.3em}.ui.toast-container .toast-box .ui.toast:not(.vertical)>.close.icon.left{margin-left:-.3em}.ui.toast-container .toast-box .ui.card{margin:0}.ui.toast-container .toast-box .ui.card.attached:not(.vertical).bottom{border-top-left-radius:0;border-top-right-radius:0}.ui.toast-container .toast-box .ui.card.attached:not(.vertical).bottom.horizontal>.image>img{border-top-left-radius:0}.ui.toast-container .toast-box .ui.card.attached:not(.vertical).bottom.horizontal>.image:last-child>img{border-top-right-radius:0}.ui.toast-container .toast-box .ui.card.attached:not(.vertical).top{border-bottom-left-radius:0;border-bottom-right-radius:0}.ui.toast-container .toast-box .ui.card.attached:not(.vertical).top.horizontal>.image>img{border-bottom-left-radius:0}.ui.toast-container .toast-box .ui.card.attached:not(.vertical).top.horizontal>.image:last-child>img{border-bottom-right-radius:0}.ui.toast-container .toast-box .ui.card.horizontal.actions>.image>img{border-bottom-left-radius:0}.ui.toast-container .toast-box .ui.card.horizontal.actions>.image:last-child>img{border-bottom-right-radius:0}.ui.toast-container .toast-box .progressing{-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-timing-function:linear;animation-timing-function:linear}.ui.toast-container .toast-box .progressing.up{-webkit-animation-name:progressUp;animation-name:progressUp}.ui.toast-container .toast-box .progressing.down{-webkit-animation-name:progressDown;animation-name:progressDown}.ui.toast-container .toast-box .progressing.wait{-webkit-animation-name:progressWait;animation-name:progressWait}.ui.toast-container .toast-box:hover .pausable.progressing{-webkit-animation-play-state:paused;animation-play-state:paused}.ui.toast-container .toast-box .ui.toast:not(.vertical){display:block}.ui.toast-container .toast-box :not(.comment):not(.card) .actions{margin:.5em -1em -1em -1em}.ui.toast-container .toast-box :not(.comment) .actions{padding:.5em .5em .75em .5em;text-align:right}.ui.toast-container .toast-box :not(.comment) .actions.attached:not(.vertical){margin-right:1px}.ui.toast-container .toast-box :not(.comment) .actions:not(.basic):not(.attached){background:rgba(255,255,255,.25);border-top:1px solid rgba(0,0,0,.2)}.ui.toast-container .toast-box :not(.comment) .actions.left{text-align:left}.ui.toast-container .toast-box .vertical.actions>.button,.ui.toast-container .toast-box>.vertical.vertical.vertical,.ui.toast-container .toast-box>.vertical>.vertical.vertical{display:-webkit-box;display:-ms-flexbox;display:flex}.ui.toast-container .toast-box :not(.comment) .vertical.actions{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.ui.toast-container .toast-box :not(.comment) .vertical.actions>.button{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.ui.toast-container .toast-box :not(.comment) .vertical.actions.attached>.button{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.ui.toast-container .toast-box :not(.comment) .vertical.actions:not(.attached){border-top:0;margin-top:-.75em;margin-bottom:-.75em;margin-left:1em;-ms-flex-pack:distribute;justify-content:space-around}.ui.toast-container .toast-box :not(.comment) .vertical.actions:not(.attached):not(.basic){border-left:1px solid rgba(0,0,0,.2)}.ui.toast-container .toast-box :not(.comment) .vertical.actions:not(.attached)>.button:not(:last-child){margin-bottom:.3em}.ui.toast-container .toast-box :not(.comment) .vertical.actions:not(.attached).top{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.ui.toast-container .toast-box :not(.comment) .vertical.actions:not(.attached).bottom{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:flex-end}.ui.vertical.attached:not(.left).card>.image>img{border-top-right-radius:0}.ui.vertical.attached:not(.left).card.horizontal>.image:last-child>img{border-top-right-radius:0;border-bottom-right-radius:0}.ui.vertical.attached:not(.left).card,.ui.vertical.attached:not(.left).toast{border-top-right-radius:0;border-bottom-right-radius:0}.ui.vertical.attached:not(.left).actions{border-top-right-radius:.28571429rem;border-bottom-right-radius:.28571429rem}.ui.vertical.attached:not(.left).actions .button:first-child,.ui.vertical.attached:not(.left).actions .button:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.ui.vertical.attached:not(.left).message{border-top-right-radius:0;border-bottom-left-radius:.28571429rem}.ui.vertical.attached.left.card>.image>img{border-top-left-radius:0}.ui.vertical.attached.left.card.horizontal>.image>img{border-top-left-radius:0;border-bottom-left-radius:0}.ui.vertical.attached.left.card,.ui.vertical.attached.left.toast{border-top-left-radius:0;border-bottom-left-radius:0}.ui.vertical.attached.left.actions{border-top-left-radius:.28571429rem;border-bottom-left-radius:.28571429rem}.ui.vertical.attached.left.actions .button:first-child,.ui.vertical.attached.left.actions .button:last-child{border-top-right-radius:0;border-bottom-right-radius:0}.ui.vertical.attached.left.message.message.message{border-top-right-radius:.28571429rem;border-bottom-right-radius:.28571429rem}.ui.attached:not(.vertical):not(.top).actions{border-bottom-left-radius:.28571429rem;border-bottom-right-radius:.28571429rem}.ui.attached:not(.vertical):not(.top).actions .button:first-child{border-bottom-left-radius:.28571429rem}.ui.attached:not(.vertical):not(.top).actions .button:last-child{border-bottom-right-radius:.28571429rem}.ui.attached:not(.vertical).top.actions{border-top-left-radius:.28571429rem;border-top-right-radius:.28571429rem}.ui.attached:not(.vertical).top.actions .button:first-child{border-top-left-radius:.28571429rem}.ui.attached:not(.vertical).top.actions .button:last-child{border-top-right-radius:.28571429rem}.ui.toast{display:none;border-radius:.28571429rem;padding:.78571429em 1em;margin:0 -1px -.01em;color:rgba(0,0,0,.87);background-color:#fff}.ui.toast>.content>.header{font-weight:700;color:inherit;margin:0}.ui.toast.info{background-color:#31ccec;color:rgba(255,255,255,.9)}.ui.toast.warning{background-color:#f2c037;color:rgba(255,255,255,.9)}.ui.toast.success{background-color:#21ba45;color:rgba(255,255,255,.9)}.ui.toast.error{background-color:#db2828;color:rgba(255,255,255,.9)}.ui.toast.neutral{background-color:#fff;color:rgba(0,0,0,.87)}.ui.toast>i.icon:not(.close){font-size:1.5em}.ui.toast:not(.vertical):not(.centered):not(.center)>i.icon:not(.close){position:absolute}.ui.toast:not(.vertical):not(.centered):not(.center)>.ui.image{position:absolute}.ui.toast:not(.vertical)>i.icon:not(.close)+.content{padding-left:3em}.ui.toast:not(.vertical)>.close.icon+.content{padding-left:1.5em}.ui.toast:not(.vertical)>.ui.image.avatar+.content{padding-left:3em;min-height:2em}.ui.toast:not(.vertical)>.ui.image.mini+.content{padding-left:3.4em;min-height:35px}.ui.toast:not(.vertical)>.ui.image.tiny+.content{padding-left:7em;min-height:80px}.ui.toast:not(.vertical)>.ui.image.small+.content{padding-left:12em;min-height:150px}.ui.toast:not(.vertical):not(.centered):not(.center)>.centered.icon,.ui.toast:not(.vertical):not(.centered):not(.center)>.centered.image{-webkit-transform:translateY(-50%);transform:translateY(-50%);top:50%}.ui.toast:not(.vertical).actions>.centered.image{top:calc(50% - 2em)}.ui.toast:not(.vertical).actions>.centered.icon{top:calc(50% - 1.2em)}.ui.toast.vertical>.close.icon+.content{padding-left:1em}.ui.toast.vertical>.ui.image+.content,.ui.toast.vertical>i.icon:not(.close)+.content{padding-left:1em}.ui.toast.vertical>.ui.image{-ms-flex-item-align:start;align-self:flex-start;-ms-flex-negative:0;flex-shrink:0}.ui.toast.vertical>.centered.icon,.ui.toast.vertical>.centered.image{-ms-flex-item-align:center;align-self:center}.ui.toast.attached.bottom{border-top-left-radius:0;border-top-right-radius:0}.ui.toast.attached.top{border-bottom-left-radius:0;border-bottom-right-radius:0}.ui.hoverfloating.message:hover{-webkit-box-shadow:0 0 0 1px inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15);box-shadow:0 0 0 1px inset,0 2px 4px 0 rgba(34,36,38,.12),0 2px 10px 0 rgba(34,36,38,.15)}.ui.center.toast-container .toast-box,.ui.right.toast-container .toast-box{margin-left:auto}.ui.center.toast-container .toast-box{margin-right:auto}.ui.ui.toast-container .toast-box .center.aligned.toast,.ui.ui.toast-container .toast-box .centered.toast{text-align:center;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.ui.ui.toast-container .toast-box .center.aligned.toast>.content,.ui.ui.toast-container .toast-box .center.aligned.toast>.ui.image,.ui.ui.toast-container .toast-box .center.aligned.toast>i.icon:not(.close),.ui.ui.toast-container .toast-box .centered.toast>.content,.ui.ui.toast-container .toast-box .centered.toast>.ui.image,.ui.ui.toast-container .toast-box .centered.toast>i.icon:not(.close){-ms-flex-item-align:center;align-self:center}.ui.toast-container .toast-box .toast .center.aligned.content,.ui.toast-container .toast-box .toast .centered.content{text-align:center}.ui.toast-container .toast-box .center.aligned.actions,.ui.toast-container .toast-box .centered.actions{text-align:center}.ui.toast-container .toast-box .center.aligned.actions:not(.attached)>.button:not(.fluid),.ui.toast-container .toast-box .centered.actions:not(.attached)>.button:not(.fluid){margin-left:.25em;margin-right:.25em}.ui.primary.toast{background-color:#2185d0;color:rgba(255,255,255,.9)}.ui.inverted.primary.toast,.ui.toast-container .toast-box>.inverted.primary.attached.progress .bar{background-color:#54c8ff;color:rgba(0,0,0,.87)}.ui.secondary.toast{background-color:#1b1c1d;color:rgba(255,255,255,.9)}.ui.inverted.secondary.toast,.ui.toast-container .toast-box>.inverted.secondary.attached.progress .bar{background-color:#545454;color:rgba(0,0,0,.87)}.ui.red.toast{background-color:#db2828;color:rgba(255,255,255,.9)}.ui.inverted.red.toast,.ui.toast-container .toast-box>.inverted.red.attached.progress .bar{background-color:#ff695e;color:rgba(0,0,0,.87)}.ui.orange.toast{background-color:#f2711c;color:rgba(255,255,255,.9)}.ui.inverted.orange.toast,.ui.toast-container .toast-box>.inverted.orange.attached.progress .bar{background-color:#ff851b;color:rgba(0,0,0,.87)}.ui.yellow.toast{background-color:#fbbd08;color:rgba(255,255,255,.9)}.ui.inverted.yellow.toast,.ui.toast-container .toast-box>.inverted.yellow.attached.progress .bar{background-color:#ffe21f;color:rgba(0,0,0,.87)}.ui.olive.toast{background-color:#b5cc18;color:rgba(255,255,255,.9)}.ui.inverted.olive.toast,.ui.toast-container .toast-box>.inverted.olive.attached.progress .bar{background-color:#d9e778;color:rgba(0,0,0,.87)}.ui.green.toast{background-color:#21ba45;color:rgba(255,255,255,.9)}.ui.inverted.green.toast,.ui.toast-container .toast-box>.inverted.green.attached.progress .bar{background-color:#2ecc40;color:rgba(0,0,0,.87)}.ui.teal.toast{background-color:#00b5ad;color:rgba(255,255,255,.9)}.ui.inverted.teal.toast,.ui.toast-container .toast-box>.inverted.teal.attached.progress .bar{background-color:#6dffff;color:rgba(0,0,0,.87)}.ui.blue.toast{background-color:#2185d0;color:rgba(255,255,255,.9)}.ui.inverted.blue.toast,.ui.toast-container .toast-box>.inverted.blue.attached.progress .bar{background-color:#54c8ff;color:rgba(0,0,0,.87)}.ui.violet.toast{background-color:#6435c9;color:rgba(255,255,255,.9)}.ui.inverted.violet.toast,.ui.toast-container .toast-box>.inverted.violet.attached.progress .bar{background-color:#a291fb;color:rgba(0,0,0,.87)}.ui.purple.toast{background-color:#a333c8;color:rgba(255,255,255,.9)}.ui.inverted.purple.toast,.ui.toast-container .toast-box>.inverted.purple.attached.progress .bar{background-color:#dc73ff;color:rgba(0,0,0,.87)}.ui.pink.toast{background-color:#e03997;color:rgba(255,255,255,.9)}.ui.inverted.pink.toast,.ui.toast-container .toast-box>.inverted.pink.attached.progress .bar{background-color:#ff8edf;color:rgba(0,0,0,.87)}.ui.brown.toast{background-color:#a5673f;color:rgba(255,255,255,.9)}.ui.inverted.brown.toast,.ui.toast-container .toast-box>.inverted.brown.attached.progress .bar{background-color:#d67c1c;color:rgba(0,0,0,.87)}.ui.grey.toast{background-color:#767676;color:rgba(255,255,255,.9)}.ui.inverted.grey.toast,.ui.toast-container .toast-box>.inverted.grey.attached.progress .bar{background-color:#dcddde;color:rgba(0,0,0,.87)}.ui.black.toast{background-color:#1b1c1d;color:rgba(255,255,255,.9)}.ui.inverted.black.toast,.ui.toast-container .toast-box>.inverted.black.attached.progress .bar{background-color:#545454;color:rgba(0,0,0,.87)}.ui.inverted.toast{color:rgba(255,255,255,.9);background-color:#1b1c1d}@media only screen and (max-width:420px){.ui.toast-container .toast-box.toast-box,.ui.toast-container .toast-box>*,.ui.toast-container .toast-box>.compact,.ui.toast-container .toast-box>.vertical>*{width:auto;max-width:100%}.ui.toast-container .toast-box>:not(.vertical){min-width:280px}.ui.toast-container .toast-box>.ui.card.horizontal,.ui.toast-container .toast-box>.vertical>.ui.horizontal.card{min-width:initial}}@-webkit-keyframes progressDown{0%{width:100%}100%{width:0}}@keyframes progressDown{0%{width:100%}100%{width:0}}@-webkit-keyframes progressUp{0%{width:0}100%{width:100%}}@keyframes progressUp{0%{width:0}100%{width:100%}}@-webkit-keyframes progressWait{0%{opacity:1}100%{opacity:0}}@keyframes progressWait{0%{opacity:1}100%{opacity:0}}
\ No newline at end of file
diff --git a/public/dist/components/toast.min.js b/public/dist/components/toast.min.js
new file mode 100644
index 000000000..db032205a
--- /dev/null
+++ b/public/dist/components/toast.min.js
@@ -0,0 +1,11 @@
+/*
+ * # Fomantic UI - 2.8.8
+ * https://github.com/fomantic/Fomantic-UI
+ * http://fomantic-ui.com/
+ *
+ * Copyright 2021 Contributors
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+!function(A,e,n,D){"use strict";A.isFunction=A.isFunction||function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},e=void 0!==e&&e.Math==Math?e:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),A.fn.toast=function(w){var k,e=A(this),T=e.selector||"",x=(new Date).getTime(),I=[],P=w,O="string"==typeof P,M=[].slice.call(arguments,1);return e.each(function(){var o,s,a,i,c,l,r,u,d=A.isPlainObject(w)?A.extend(!0,{},A.fn.toast.settings,w):A.extend({},A.fn.toast.settings),p=d.className,f=d.selector,m=d.error,e=d.namespace,g=d.fields,n="."+e,t=e+"-module",h=A(this),v=d.context?A(d.context):A("body"),b=h.hasClass("toast")||h.hasClass("message")||h.hasClass("card"),C=this,y=b?h.data(t):D;u={initialize:function(){u.verbose("Initializing element"),u.has.container()||u.create.container(),(b||""!==d.message||""!==d.title||""!==u.get.iconClass()||d.showImage||u.has.configActions())&&("string"==typeof d.showProgress&&-1!==[p.top,p.bottom].indexOf(d.showProgress)||(d.showProgress=!1),u.create.toast(),d.closeOnClick&&(d.closeIcon||0 ",{class:d.position+" "+p.container+" "+(d.horizontal?p.horizontal:"")}))},toast:function(){o=A("
",{class:p.box});var e=u.get.iconClass();if(b)s=d.cloneModule?h.clone().removeAttr("id"):h,r=s.find("> i"+u.helpers.toClass(p.close)),d.closeIcon=0 ");var n=A("
",{class:p.content});""!==e&&s.append(A(" ",{class:e+" "+p.icon})),d.showImage&&s.append(A(" ",{class:p.image+" "+d.classImage,src:d.showImage})),""!==d.title&&n.append(A("
",{class:p.title,text:d.title})),n.append(A("
",{class:p.message,html:u.helpers.escape(d.message,d.preserveHTML)})),s.addClass(d.class+" "+p.toast).append(n),s.css("opacity",d.opacity),d.closeIcon&&((r=A(" ",{class:p.close+" "+("string"==typeof d.closeIcon?d.closeIcon:"")})).hasClass(p.left)?s.prepend(r):s.append(r))}if(s.hasClass(p.compact)&&(d.compact=!0),s.hasClass("card")&&(d.compact=!1),a=s.find(".actions"),u.has.configActions()&&(0===a.length&&(a=A("
",{class:p.actions+" "+(d.classActions||"")}).appendTo(s)),s.hasClass("card")&&!a.hasClass(p.attached)&&(a.addClass(p.extraContent),a.hasClass(p.vertical)&&(a.removeClass(p.vertical),u.error(m.verticalCard))),d.actions.forEach(function(e){var n=e[g.icon]?' ':"",t=u.helpers.escape(e[g.text]||"",d.preserveHTML),o=u.helpers.deQuote(e[g.class]||""),s=e[g.click]&&A.isFunction(e[g.click])?e[g.click]:function(){};a.append(A(" ",{html:n+t,class:p.button+" "+o,click:function(){!1!==s.call(C,h)&&u.close()}}))})),a&&a.hasClass(p.vertical)&&s.addClass(p.vertical),0 ",{class:p.vertical+" "+p.attached+" "+(d.compact?p.compact:"")})),a.hasClass(p.left)?s.addClass(p.left).parent().addClass(p.left).prepend(a):s.parent().append(a)):a.hasClass(p.top)?(o.prepend(a),s.addClass(p.bottom)):(o.append(a),s.addClass(p.top))),h!==s&&(C=(h=s)[0]),0 ",{class:p.progress+" "+(d.classProgress||d.class),"data-percent":""}),d.classProgress||(s.hasClass("toast")&&!s.hasClass(p.inverted)?i.addClass(p.inverted):i.removeClass(p.inverted)),c=A("
",{class:"bar "+(d.progressUp?"up ":"down ")+t}),i.addClass(d.showProgress).append(c),i.hasClass(p.top)?o.prepend(i):o.append(i),c.css("animation-duration",d.displayTime/1e3+"s")),(l=A(" ",{class:"wait "+t})).css("animation-duration",d.displayTime/1e3+"s"),l.appendTo(s)}d.compact&&(o.addClass(p.compact),s.addClass(p.compact),i&&i.addClass(p.compact)),d.newestOnTop?o.prependTo(u.get.container()):o.appendTo(u.get.container())}},bind:{events:function(){u.debug("Binding events to toast"),(d.closeOnClick||d.closeIcon)&&(d.closeIcon?r:s).on("click"+n,u.event.click),l&&l.on("animationend"+n,u.close),o.on("click"+n,f.approve,u.event.approve).on("click"+n,f.deny,u.event.deny)}},unbind:{events:function(){u.debug("Unbinding events to toast"),(d.closeOnClick||d.closeIcon)&&(d.closeIcon?r:s).off("click"+n),l&&l.off("animationend"+n),o.off("click"+n)}},animate:{show:function(e){e=A.isFunction(e)?e:function(){},d.transition&&u.can.useElement("transition")&&h.transition("is supported")&&(u.set.visible(),o.transition({animation:d.transition.showMethod+" in",queue:!1,debug:d.debug,verbose:d.verbose,duration:d.transition.showDuration,onComplete:function(){e.call(o,C),d.onVisible.call(o,C)}}))},close:function(e){e=A.isFunction(e)?e:function(){},u.debug("Closing toast"),!1!==d.onHide.call(o,C)?d.transition&&A.fn.transition!==D&&h.transition("is supported")?o.transition({animation:d.transition.hideMethod+" out",queue:!1,duration:d.transition.hideDuration,debug:d.debug,verbose:d.verbose,interval:50,onBeforeHide:function(e){e=A.isFunction(e)?e:function(){},""!==d.transition.closeEasing?o&&(o.css("opacity",0),o.wrap("
").parent().hide(d.transition.closeDuration,d.transition.closeEasing,function(){o&&(o.parent().remove(),e.call(o))})):e.call(o)},onComplete:function(){e.call(o,C),d.onHidden.call(o,C),u.destroy()}}):u.error(m.noTransition):u.debug("onHide callback returned false, cancelling toast animation")},pause:function(){l.css("animationPlayState","paused"),c&&c.css("animationPlayState","paused")},continue:function(){l.css("animationPlayState","running"),c&&c.css("animationPlayState","running")}},has:{container:function(){return u.verbose("Determining if there is already a container"),0":">",'"':""","'":"'","`":"`"};return/[&<>"'`]/.test(e)?(e=e.replace(/&(?![a-z0-9#]{1,6};)/,"&")).replace(/[<>"'`]/g,function(e){return t[e]}):e}},can:{useElement:function(e){return A.fn[e]!==D||(u.error(m.noElement.replace("{element}",e)),!1)}},setting:function(e,n){if(u.debug("Changing setting",e,n),A.isPlainObject(e))A.extend(!0,d,e);else{if(n===D)return d[e];A.isPlainObject(d[e])?A.extend(!0,d[e],n):d[e]=n}},internal:function(e,n){if(A.isPlainObject(e))A.extend(!0,u,e);else{if(n===D)return u[e];u[e]=n}},debug:function(){!d.silent&&d.debug&&(d.performance?u.performance.log(arguments):(u.debug=Function.prototype.bind.call(console.info,console,d.name+":"),u.debug.apply(console,arguments)))},verbose:function(){!d.silent&&d.verbose&&d.debug&&(d.performance?u.performance.log(arguments):(u.verbose=Function.prototype.bind.call(console.info,console,d.name+":"),u.verbose.apply(console,arguments)))},error:function(){d.silent||(u.error=Function.prototype.bind.call(console.error,console,d.name+":"),u.error.apply(console,arguments))},performance:{log:function(e){var n,t;d.performance&&(t=(n=(new Date).getTime())-(x||n),x=n,I.push({Name:e[0],Arguments:[].slice.call(e,1)||"",Element:C,"Execution Time":t})),clearTimeout(u.performance.timer),u.performance.timer=setTimeout(u.performance.display,500)},display:function(){var e=d.name+":",t=0;x=!1,clearTimeout(u.performance.timer),A.each(I,function(e,n){t+=n["Execution Time"]}),e+=" "+t+"ms",T&&(e+=" '"+T+"'"),(console.group!==D||console.table!==D)&&0 img.image, > .image > img",icon:"> i.icon",input:'input:not([type="hidden"]), textarea, select, button, .ui.button, ui.dropdown',approve:".actions .positive, .actions .approve, .actions .ok",deny:".actions .negative, .actions .deny, .actions .cancel"},fields:{class:"class",text:"text",icon:"icon",click:"click"},onShow:function(){},onVisible:function(){},onClick:function(){},onHide:function(){},onHidden:function(){},onRemove:function(){},onApprove:function(){},onDeny:function(){}},A.extend(A.easing,{easeOutBounce:function(e,n,t,o,s){return(n/=s)<1/2.75?o*(7.5625*n*n)+t:n<2/2.75?o*(7.5625*(n-=1.5/2.75)*n+.75)+t:n<2.5/2.75?o*(7.5625*(n-=2.25/2.75)*n+.9375)+t:o*(7.5625*(n-=2.625/2.75)*n+.984375)+t},easeOutCubic:function(e){return--e*e*e+1}})}(jQuery,window,document);
\ No newline at end of file
diff --git a/public/dist/components/transition.css b/public/dist/components/transition.css
new file mode 100644
index 000000000..a07e658a4
--- /dev/null
+++ b/public/dist/components/transition.css
@@ -0,0 +1,2059 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Transition
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+
+/*******************************
+ Transitions
+*******************************/
+
+.transition {
+ -webkit-animation-iteration-count: 1;
+ animation-iteration-count: 1;
+ -webkit-animation-duration: 300ms;
+ animation-duration: 300ms;
+ -webkit-animation-timing-function: ease;
+ animation-timing-function: ease;
+ -webkit-animation-fill-mode: both;
+ animation-fill-mode: both;
+}
+
+
+/*******************************
+ States
+*******************************/
+
+
+/* Animating */
+.animating.transition {
+ -webkit-backface-visibility: hidden;
+ backface-visibility: hidden;
+ visibility: visible !important;
+}
+
+/* Loading */
+.loading.transition {
+ position: absolute;
+ top: -99999px;
+ left: -99999px;
+}
+
+/* Hidden */
+.hidden.transition {
+ display: none;
+ visibility: hidden;
+}
+
+/* Visible */
+.visible.transition {
+ display: block !important;
+ visibility: visible !important;
+
+/* backface-visibility: @backfaceVisibility;
+ transform: @use3DAcceleration;*/
+}
+/* Disabled */
+.disabled.transition {
+ -webkit-animation-play-state: paused;
+ animation-play-state: paused;
+}
+
+
+/*******************************
+ Variations
+*******************************/
+
+.looping.transition {
+ -webkit-animation-iteration-count: infinite;
+ animation-iteration-count: infinite;
+}
+
+
+/*******************************
+ Transitions
+*******************************/
+
+/*
+ Some transitions adapted from Animate CSS
+ https://github.com/daneden/animate.css
+
+ Additional transitions adapted from Glide
+ by Nick Pettit - https://github.com/nickpettit/glide
+*/
+
+/*--------------
+ Browse
+ ---------------*/
+
+.transition.browse {
+ -webkit-animation-duration: 500ms;
+ animation-duration: 500ms;
+}
+.transition.browse.in {
+ -webkit-animation-name: browseIn;
+ animation-name: browseIn;
+}
+.transition.browse.out,
+.transition.browse.left.out {
+ -webkit-animation-name: browseOutLeft;
+ animation-name: browseOutLeft;
+}
+.transition.browse.right.out {
+ -webkit-animation-name: browseOutRight;
+ animation-name: browseOutRight;
+}
+
+/* In */
+@-webkit-keyframes browseIn {
+ 0% {
+ -webkit-transform: scale(0.8) translateZ(0px);
+ transform: scale(0.8) translateZ(0px);
+ z-index: -1;
+ }
+ 10% {
+ -webkit-transform: scale(0.8) translateZ(0px);
+ transform: scale(0.8) translateZ(0px);
+ z-index: -1;
+ opacity: 0.7;
+ }
+ 80% {
+ -webkit-transform: scale(1.05) translateZ(0px);
+ transform: scale(1.05) translateZ(0px);
+ opacity: 1;
+ z-index: 999;
+ }
+ 100% {
+ -webkit-transform: scale(1) translateZ(0px);
+ transform: scale(1) translateZ(0px);
+ z-index: 999;
+ }
+}
+@keyframes browseIn {
+ 0% {
+ -webkit-transform: scale(0.8) translateZ(0px);
+ transform: scale(0.8) translateZ(0px);
+ z-index: -1;
+ }
+ 10% {
+ -webkit-transform: scale(0.8) translateZ(0px);
+ transform: scale(0.8) translateZ(0px);
+ z-index: -1;
+ opacity: 0.7;
+ }
+ 80% {
+ -webkit-transform: scale(1.05) translateZ(0px);
+ transform: scale(1.05) translateZ(0px);
+ opacity: 1;
+ z-index: 999;
+ }
+ 100% {
+ -webkit-transform: scale(1) translateZ(0px);
+ transform: scale(1) translateZ(0px);
+ z-index: 999;
+ }
+}
+
+/* Out */
+@-webkit-keyframes browseOutLeft {
+ 0% {
+ z-index: 999;
+ -webkit-transform: translateX(0%) rotateY(0deg) rotateX(0deg);
+ transform: translateX(0%) rotateY(0deg) rotateX(0deg);
+ }
+ 50% {
+ z-index: -1;
+ -webkit-transform: translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);
+ transform: translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);
+ }
+ 80% {
+ opacity: 1;
+ }
+ 100% {
+ z-index: -1;
+ -webkit-transform: translateX(0%) rotateY(0deg) rotateX(0deg) translateZ(-10px);
+ transform: translateX(0%) rotateY(0deg) rotateX(0deg) translateZ(-10px);
+ opacity: 0;
+ }
+}
+@keyframes browseOutLeft {
+ 0% {
+ z-index: 999;
+ -webkit-transform: translateX(0%) rotateY(0deg) rotateX(0deg);
+ transform: translateX(0%) rotateY(0deg) rotateX(0deg);
+ }
+ 50% {
+ z-index: -1;
+ -webkit-transform: translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);
+ transform: translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);
+ }
+ 80% {
+ opacity: 1;
+ }
+ 100% {
+ z-index: -1;
+ -webkit-transform: translateX(0%) rotateY(0deg) rotateX(0deg) translateZ(-10px);
+ transform: translateX(0%) rotateY(0deg) rotateX(0deg) translateZ(-10px);
+ opacity: 0;
+ }
+}
+@-webkit-keyframes browseOutRight {
+ 0% {
+ z-index: 999;
+ -webkit-transform: translateX(0%) rotateY(0deg) rotateX(0deg);
+ transform: translateX(0%) rotateY(0deg) rotateX(0deg);
+ }
+ 50% {
+ z-index: 1;
+ -webkit-transform: translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);
+ transform: translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);
+ }
+ 80% {
+ opacity: 1;
+ }
+ 100% {
+ z-index: 1;
+ -webkit-transform: translateX(0%) rotateY(0deg) rotateX(0deg) translateZ(-10px);
+ transform: translateX(0%) rotateY(0deg) rotateX(0deg) translateZ(-10px);
+ opacity: 0;
+ }
+}
+@keyframes browseOutRight {
+ 0% {
+ z-index: 999;
+ -webkit-transform: translateX(0%) rotateY(0deg) rotateX(0deg);
+ transform: translateX(0%) rotateY(0deg) rotateX(0deg);
+ }
+ 50% {
+ z-index: 1;
+ -webkit-transform: translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);
+ transform: translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);
+ }
+ 80% {
+ opacity: 1;
+ }
+ 100% {
+ z-index: 1;
+ -webkit-transform: translateX(0%) rotateY(0deg) rotateX(0deg) translateZ(-10px);
+ transform: translateX(0%) rotateY(0deg) rotateX(0deg) translateZ(-10px);
+ opacity: 0;
+ }
+}
+
+/*--------------
+ Drop
+ ---------------*/
+
+.drop.transition {
+ -webkit-transform-origin: top center;
+ transform-origin: top center;
+ -webkit-animation-duration: 400ms;
+ animation-duration: 400ms;
+ -webkit-animation-timing-function: cubic-bezier(0.34, 1.61, 0.7, 1);
+ animation-timing-function: cubic-bezier(0.34, 1.61, 0.7, 1);
+}
+.drop.transition.in {
+ -webkit-animation-name: dropIn;
+ animation-name: dropIn;
+}
+.drop.transition.out {
+ -webkit-animation-name: dropOut;
+ animation-name: dropOut;
+}
+
+/* Drop */
+@-webkit-keyframes dropIn {
+ 0% {
+ opacity: 0;
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+ 100% {
+ opacity: 1;
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+}
+@keyframes dropIn {
+ 0% {
+ opacity: 0;
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+ 100% {
+ opacity: 1;
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+}
+@-webkit-keyframes dropOut {
+ 0% {
+ opacity: 1;
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+}
+@keyframes dropOut {
+ 0% {
+ opacity: 1;
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+}
+
+/*--------------
+ Fade
+ ---------------*/
+
+.transition.fade.in {
+ -webkit-animation-name: fadeIn;
+ animation-name: fadeIn;
+}
+.transition[class*="fade up"].in {
+ -webkit-animation-name: fadeInUp;
+ animation-name: fadeInUp;
+}
+.transition[class*="fade down"].in {
+ -webkit-animation-name: fadeInDown;
+ animation-name: fadeInDown;
+}
+.transition[class*="fade left"].in {
+ -webkit-animation-name: fadeInLeft;
+ animation-name: fadeInLeft;
+}
+.transition[class*="fade right"].in {
+ -webkit-animation-name: fadeInRight;
+ animation-name: fadeInRight;
+}
+.transition.fade.out {
+ -webkit-animation-name: fadeOut;
+ animation-name: fadeOut;
+}
+.transition[class*="fade up"].out {
+ -webkit-animation-name: fadeOutUp;
+ animation-name: fadeOutUp;
+}
+.transition[class*="fade down"].out {
+ -webkit-animation-name: fadeOutDown;
+ animation-name: fadeOutDown;
+}
+.transition[class*="fade left"].out {
+ -webkit-animation-name: fadeOutLeft;
+ animation-name: fadeOutLeft;
+}
+.transition[class*="fade right"].out {
+ -webkit-animation-name: fadeOutRight;
+ animation-name: fadeOutRight;
+}
+
+/* In */
+@-webkit-keyframes fadeIn {
+ 0% {
+ opacity: 0;
+ }
+ 100% {
+ opacity: 1;
+ }
+}
+@keyframes fadeIn {
+ 0% {
+ opacity: 0;
+ }
+ 100% {
+ opacity: 1;
+ }
+}
+@-webkit-keyframes fadeInUp {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(10%);
+ transform: translateY(10%);
+ }
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateY(0%);
+ transform: translateY(0%);
+ }
+}
+@keyframes fadeInUp {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(10%);
+ transform: translateY(10%);
+ }
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateY(0%);
+ transform: translateY(0%);
+ }
+}
+@-webkit-keyframes fadeInDown {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(-10%);
+ transform: translateY(-10%);
+ }
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateY(0%);
+ transform: translateY(0%);
+ }
+}
+@keyframes fadeInDown {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateY(-10%);
+ transform: translateY(-10%);
+ }
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateY(0%);
+ transform: translateY(0%);
+ }
+}
+@-webkit-keyframes fadeInLeft {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(10%);
+ transform: translateX(10%);
+ }
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateX(0%);
+ transform: translateX(0%);
+ }
+}
+@keyframes fadeInLeft {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(10%);
+ transform: translateX(10%);
+ }
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateX(0%);
+ transform: translateX(0%);
+ }
+}
+@-webkit-keyframes fadeInRight {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(-10%);
+ transform: translateX(-10%);
+ }
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateX(0%);
+ transform: translateX(0%);
+ }
+}
+@keyframes fadeInRight {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translateX(-10%);
+ transform: translateX(-10%);
+ }
+ 100% {
+ opacity: 1;
+ -webkit-transform: translateX(0%);
+ transform: translateX(0%);
+ }
+}
+
+/* Out */
+@-webkit-keyframes fadeOut {
+ 0% {
+ opacity: 1;
+ }
+ 100% {
+ opacity: 0;
+ }
+}
+@keyframes fadeOut {
+ 0% {
+ opacity: 1;
+ }
+ 100% {
+ opacity: 0;
+ }
+}
+@-webkit-keyframes fadeOutUp {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateY(0%);
+ transform: translateY(0%);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateY(5%);
+ transform: translateY(5%);
+ }
+}
+@keyframes fadeOutUp {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateY(0%);
+ transform: translateY(0%);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateY(5%);
+ transform: translateY(5%);
+ }
+}
+@-webkit-keyframes fadeOutDown {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateY(0%);
+ transform: translateY(0%);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateY(-5%);
+ transform: translateY(-5%);
+ }
+}
+@keyframes fadeOutDown {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateY(0%);
+ transform: translateY(0%);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateY(-5%);
+ transform: translateY(-5%);
+ }
+}
+@-webkit-keyframes fadeOutLeft {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateX(0%);
+ transform: translateX(0%);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateX(5%);
+ transform: translateX(5%);
+ }
+}
+@keyframes fadeOutLeft {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateX(0%);
+ transform: translateX(0%);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateX(5%);
+ transform: translateX(5%);
+ }
+}
+@-webkit-keyframes fadeOutRight {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateX(0%);
+ transform: translateX(0%);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateX(-5%);
+ transform: translateX(-5%);
+ }
+}
+@keyframes fadeOutRight {
+ 0% {
+ opacity: 1;
+ -webkit-transform: translateX(0%);
+ transform: translateX(0%);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: translateX(-5%);
+ transform: translateX(-5%);
+ }
+}
+
+/*--------------
+ Flips
+ ---------------*/
+
+.flip.transition.in,
+.flip.transition.out {
+ -webkit-animation-duration: 600ms;
+ animation-duration: 600ms;
+}
+.horizontal.flip.transition.in {
+ -webkit-animation-name: horizontalFlipIn;
+ animation-name: horizontalFlipIn;
+}
+.horizontal.flip.transition.out {
+ -webkit-animation-name: horizontalFlipOut;
+ animation-name: horizontalFlipOut;
+}
+.vertical.flip.transition.in {
+ -webkit-animation-name: verticalFlipIn;
+ animation-name: verticalFlipIn;
+}
+.vertical.flip.transition.out {
+ -webkit-animation-name: verticalFlipOut;
+ animation-name: verticalFlipOut;
+}
+
+/* In */
+@-webkit-keyframes horizontalFlipIn {
+ 0% {
+ -webkit-transform: perspective(2000px) rotateY(-90deg);
+ transform: perspective(2000px) rotateY(-90deg);
+ opacity: 0;
+ }
+ 100% {
+ -webkit-transform: perspective(2000px) rotateY(0deg);
+ transform: perspective(2000px) rotateY(0deg);
+ opacity: 1;
+ }
+}
+@keyframes horizontalFlipIn {
+ 0% {
+ -webkit-transform: perspective(2000px) rotateY(-90deg);
+ transform: perspective(2000px) rotateY(-90deg);
+ opacity: 0;
+ }
+ 100% {
+ -webkit-transform: perspective(2000px) rotateY(0deg);
+ transform: perspective(2000px) rotateY(0deg);
+ opacity: 1;
+ }
+}
+@-webkit-keyframes verticalFlipIn {
+ 0% {
+ -webkit-transform: perspective(2000px) rotateX(-90deg);
+ transform: perspective(2000px) rotateX(-90deg);
+ opacity: 0;
+ }
+ 100% {
+ -webkit-transform: perspective(2000px) rotateX(0deg);
+ transform: perspective(2000px) rotateX(0deg);
+ opacity: 1;
+ }
+}
+@keyframes verticalFlipIn {
+ 0% {
+ -webkit-transform: perspective(2000px) rotateX(-90deg);
+ transform: perspective(2000px) rotateX(-90deg);
+ opacity: 0;
+ }
+ 100% {
+ -webkit-transform: perspective(2000px) rotateX(0deg);
+ transform: perspective(2000px) rotateX(0deg);
+ opacity: 1;
+ }
+}
+
+/* Out */
+@-webkit-keyframes horizontalFlipOut {
+ 0% {
+ -webkit-transform: perspective(2000px) rotateY(0deg);
+ transform: perspective(2000px) rotateY(0deg);
+ opacity: 1;
+ }
+ 100% {
+ -webkit-transform: perspective(2000px) rotateY(90deg);
+ transform: perspective(2000px) rotateY(90deg);
+ opacity: 0;
+ }
+}
+@keyframes horizontalFlipOut {
+ 0% {
+ -webkit-transform: perspective(2000px) rotateY(0deg);
+ transform: perspective(2000px) rotateY(0deg);
+ opacity: 1;
+ }
+ 100% {
+ -webkit-transform: perspective(2000px) rotateY(90deg);
+ transform: perspective(2000px) rotateY(90deg);
+ opacity: 0;
+ }
+}
+@-webkit-keyframes verticalFlipOut {
+ 0% {
+ -webkit-transform: perspective(2000px) rotateX(0deg);
+ transform: perspective(2000px) rotateX(0deg);
+ opacity: 1;
+ }
+ 100% {
+ -webkit-transform: perspective(2000px) rotateX(-90deg);
+ transform: perspective(2000px) rotateX(-90deg);
+ opacity: 0;
+ }
+}
+@keyframes verticalFlipOut {
+ 0% {
+ -webkit-transform: perspective(2000px) rotateX(0deg);
+ transform: perspective(2000px) rotateX(0deg);
+ opacity: 1;
+ }
+ 100% {
+ -webkit-transform: perspective(2000px) rotateX(-90deg);
+ transform: perspective(2000px) rotateX(-90deg);
+ opacity: 0;
+ }
+}
+
+/*--------------
+ Scale
+ ---------------*/
+
+.scale.transition.in {
+ -webkit-animation-name: scaleIn;
+ animation-name: scaleIn;
+}
+.scale.transition.out {
+ -webkit-animation-name: scaleOut;
+ animation-name: scaleOut;
+}
+@-webkit-keyframes scaleIn {
+ 0% {
+ opacity: 0;
+ -webkit-transform: scale(0.8);
+ transform: scale(0.8);
+ }
+ 100% {
+ opacity: 1;
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+}
+@keyframes scaleIn {
+ 0% {
+ opacity: 0;
+ -webkit-transform: scale(0.8);
+ transform: scale(0.8);
+ }
+ 100% {
+ opacity: 1;
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+}
+
+/* Out */
+@-webkit-keyframes scaleOut {
+ 0% {
+ opacity: 1;
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: scale(0.9);
+ transform: scale(0.9);
+ }
+}
+@keyframes scaleOut {
+ 0% {
+ opacity: 1;
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: scale(0.9);
+ transform: scale(0.9);
+ }
+}
+
+/*--------------
+ Fly
+ ---------------*/
+
+
+/* Inward */
+.transition.fly {
+ -webkit-animation-duration: 0.6s;
+ animation-duration: 0.6s;
+ -webkit-transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
+ transition-timing-function: cubic-bezier(0.215, 0.61, 0.355, 1);
+}
+.transition.fly.in {
+ -webkit-animation-name: flyIn;
+ animation-name: flyIn;
+}
+.transition[class*="fly up"].in {
+ -webkit-animation-name: flyInUp;
+ animation-name: flyInUp;
+}
+.transition[class*="fly down"].in {
+ -webkit-animation-name: flyInDown;
+ animation-name: flyInDown;
+}
+.transition[class*="fly left"].in {
+ -webkit-animation-name: flyInLeft;
+ animation-name: flyInLeft;
+}
+.transition[class*="fly right"].in {
+ -webkit-animation-name: flyInRight;
+ animation-name: flyInRight;
+}
+
+/* Outward */
+.transition.fly.out {
+ -webkit-animation-name: flyOut;
+ animation-name: flyOut;
+}
+.transition[class*="fly up"].out {
+ -webkit-animation-name: flyOutUp;
+ animation-name: flyOutUp;
+}
+.transition[class*="fly down"].out {
+ -webkit-animation-name: flyOutDown;
+ animation-name: flyOutDown;
+}
+.transition[class*="fly left"].out {
+ -webkit-animation-name: flyOutLeft;
+ animation-name: flyOutLeft;
+}
+.transition[class*="fly right"].out {
+ -webkit-animation-name: flyOutRight;
+ animation-name: flyOutRight;
+}
+
+/* In */
+@-webkit-keyframes flyIn {
+ 0% {
+ opacity: 0;
+ -webkit-transform: scale3d(0.3, 0.3, 0.3);
+ transform: scale3d(0.3, 0.3, 0.3);
+ }
+ 20% {
+ -webkit-transform: scale3d(1.1, 1.1, 1.1);
+ transform: scale3d(1.1, 1.1, 1.1);
+ }
+ 40% {
+ -webkit-transform: scale3d(0.9, 0.9, 0.9);
+ transform: scale3d(0.9, 0.9, 0.9);
+ }
+ 60% {
+ opacity: 1;
+ -webkit-transform: scale3d(1.03, 1.03, 1.03);
+ transform: scale3d(1.03, 1.03, 1.03);
+ }
+ 80% {
+ -webkit-transform: scale3d(0.97, 0.97, 0.97);
+ transform: scale3d(0.97, 0.97, 0.97);
+ }
+ 100% {
+ opacity: 1;
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+}
+@keyframes flyIn {
+ 0% {
+ opacity: 0;
+ -webkit-transform: scale3d(0.3, 0.3, 0.3);
+ transform: scale3d(0.3, 0.3, 0.3);
+ }
+ 20% {
+ -webkit-transform: scale3d(1.1, 1.1, 1.1);
+ transform: scale3d(1.1, 1.1, 1.1);
+ }
+ 40% {
+ -webkit-transform: scale3d(0.9, 0.9, 0.9);
+ transform: scale3d(0.9, 0.9, 0.9);
+ }
+ 60% {
+ opacity: 1;
+ -webkit-transform: scale3d(1.03, 1.03, 1.03);
+ transform: scale3d(1.03, 1.03, 1.03);
+ }
+ 80% {
+ -webkit-transform: scale3d(0.97, 0.97, 0.97);
+ transform: scale3d(0.97, 0.97, 0.97);
+ }
+ 100% {
+ opacity: 1;
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+}
+@-webkit-keyframes flyInUp {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 1500px, 0);
+ transform: translate3d(0, 1500px, 0);
+ }
+ 60% {
+ opacity: 1;
+ -webkit-transform: translate3d(0, -20px, 0);
+ transform: translate3d(0, -20px, 0);
+ }
+ 75% {
+ -webkit-transform: translate3d(0, 10px, 0);
+ transform: translate3d(0, 10px, 0);
+ }
+ 90% {
+ -webkit-transform: translate3d(0, -5px, 0);
+ transform: translate3d(0, -5px, 0);
+ }
+ 100% {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+@keyframes flyInUp {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 1500px, 0);
+ transform: translate3d(0, 1500px, 0);
+ }
+ 60% {
+ opacity: 1;
+ -webkit-transform: translate3d(0, -20px, 0);
+ transform: translate3d(0, -20px, 0);
+ }
+ 75% {
+ -webkit-transform: translate3d(0, 10px, 0);
+ transform: translate3d(0, 10px, 0);
+ }
+ 90% {
+ -webkit-transform: translate3d(0, -5px, 0);
+ transform: translate3d(0, -5px, 0);
+ }
+ 100% {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+ }
+}
+@-webkit-keyframes flyInDown {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -1500px, 0);
+ transform: translate3d(0, -1500px, 0);
+ }
+ 60% {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 25px, 0);
+ transform: translate3d(0, 25px, 0);
+ }
+ 75% {
+ -webkit-transform: translate3d(0, -10px, 0);
+ transform: translate3d(0, -10px, 0);
+ }
+ 90% {
+ -webkit-transform: translate3d(0, 5px, 0);
+ transform: translate3d(0, 5px, 0);
+ }
+ 100% {
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+@keyframes flyInDown {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -1500px, 0);
+ transform: translate3d(0, -1500px, 0);
+ }
+ 60% {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 25px, 0);
+ transform: translate3d(0, 25px, 0);
+ }
+ 75% {
+ -webkit-transform: translate3d(0, -10px, 0);
+ transform: translate3d(0, -10px, 0);
+ }
+ 90% {
+ -webkit-transform: translate3d(0, 5px, 0);
+ transform: translate3d(0, 5px, 0);
+ }
+ 100% {
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+@-webkit-keyframes flyInLeft {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translate3d(1500px, 0, 0);
+ transform: translate3d(1500px, 0, 0);
+ }
+ 60% {
+ opacity: 1;
+ -webkit-transform: translate3d(-25px, 0, 0);
+ transform: translate3d(-25px, 0, 0);
+ }
+ 75% {
+ -webkit-transform: translate3d(10px, 0, 0);
+ transform: translate3d(10px, 0, 0);
+ }
+ 90% {
+ -webkit-transform: translate3d(-5px, 0, 0);
+ transform: translate3d(-5px, 0, 0);
+ }
+ 100% {
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+@keyframes flyInLeft {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translate3d(1500px, 0, 0);
+ transform: translate3d(1500px, 0, 0);
+ }
+ 60% {
+ opacity: 1;
+ -webkit-transform: translate3d(-25px, 0, 0);
+ transform: translate3d(-25px, 0, 0);
+ }
+ 75% {
+ -webkit-transform: translate3d(10px, 0, 0);
+ transform: translate3d(10px, 0, 0);
+ }
+ 90% {
+ -webkit-transform: translate3d(-5px, 0, 0);
+ transform: translate3d(-5px, 0, 0);
+ }
+ 100% {
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+@-webkit-keyframes flyInRight {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translate3d(-1500px, 0, 0);
+ transform: translate3d(-1500px, 0, 0);
+ }
+ 60% {
+ opacity: 1;
+ -webkit-transform: translate3d(25px, 0, 0);
+ transform: translate3d(25px, 0, 0);
+ }
+ 75% {
+ -webkit-transform: translate3d(-10px, 0, 0);
+ transform: translate3d(-10px, 0, 0);
+ }
+ 90% {
+ -webkit-transform: translate3d(5px, 0, 0);
+ transform: translate3d(5px, 0, 0);
+ }
+ 100% {
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+@keyframes flyInRight {
+ 0% {
+ opacity: 0;
+ -webkit-transform: translate3d(-1500px, 0, 0);
+ transform: translate3d(-1500px, 0, 0);
+ }
+ 60% {
+ opacity: 1;
+ -webkit-transform: translate3d(25px, 0, 0);
+ transform: translate3d(25px, 0, 0);
+ }
+ 75% {
+ -webkit-transform: translate3d(-10px, 0, 0);
+ transform: translate3d(-10px, 0, 0);
+ }
+ 90% {
+ -webkit-transform: translate3d(5px, 0, 0);
+ transform: translate3d(5px, 0, 0);
+ }
+ 100% {
+ -webkit-transform: none;
+ transform: none;
+ }
+}
+
+/* Out */
+@-webkit-keyframes flyOut {
+ 20% {
+ -webkit-transform: scale3d(0.9, 0.9, 0.9);
+ transform: scale3d(0.9, 0.9, 0.9);
+ }
+ 50%,
+ 55% {
+ opacity: 1;
+ -webkit-transform: scale3d(1.1, 1.1, 1.1);
+ transform: scale3d(1.1, 1.1, 1.1);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: scale3d(0.3, 0.3, 0.3);
+ transform: scale3d(0.3, 0.3, 0.3);
+ }
+}
+@keyframes flyOut {
+ 20% {
+ -webkit-transform: scale3d(0.9, 0.9, 0.9);
+ transform: scale3d(0.9, 0.9, 0.9);
+ }
+ 50%,
+ 55% {
+ opacity: 1;
+ -webkit-transform: scale3d(1.1, 1.1, 1.1);
+ transform: scale3d(1.1, 1.1, 1.1);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: scale3d(0.3, 0.3, 0.3);
+ transform: scale3d(0.3, 0.3, 0.3);
+ }
+}
+@-webkit-keyframes flyOutUp {
+ 20% {
+ -webkit-transform: translate3d(0, 10px, 0);
+ transform: translate3d(0, 10px, 0);
+ }
+ 40%,
+ 45% {
+ opacity: 1;
+ -webkit-transform: translate3d(0, -20px, 0);
+ transform: translate3d(0, -20px, 0);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 2000px, 0);
+ transform: translate3d(0, 2000px, 0);
+ }
+}
+@keyframes flyOutUp {
+ 20% {
+ -webkit-transform: translate3d(0, 10px, 0);
+ transform: translate3d(0, 10px, 0);
+ }
+ 40%,
+ 45% {
+ opacity: 1;
+ -webkit-transform: translate3d(0, -20px, 0);
+ transform: translate3d(0, -20px, 0);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: translate3d(0, 2000px, 0);
+ transform: translate3d(0, 2000px, 0);
+ }
+}
+@-webkit-keyframes flyOutDown {
+ 20% {
+ -webkit-transform: translate3d(0, -10px, 0);
+ transform: translate3d(0, -10px, 0);
+ }
+ 40%,
+ 45% {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 20px, 0);
+ transform: translate3d(0, 20px, 0);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -2000px, 0);
+ transform: translate3d(0, -2000px, 0);
+ }
+}
+@keyframes flyOutDown {
+ 20% {
+ -webkit-transform: translate3d(0, -10px, 0);
+ transform: translate3d(0, -10px, 0);
+ }
+ 40%,
+ 45% {
+ opacity: 1;
+ -webkit-transform: translate3d(0, 20px, 0);
+ transform: translate3d(0, 20px, 0);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: translate3d(0, -2000px, 0);
+ transform: translate3d(0, -2000px, 0);
+ }
+}
+@-webkit-keyframes flyOutRight {
+ 20% {
+ opacity: 1;
+ -webkit-transform: translate3d(20px, 0, 0);
+ transform: translate3d(20px, 0, 0);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: translate3d(-2000px, 0, 0);
+ transform: translate3d(-2000px, 0, 0);
+ }
+}
+@keyframes flyOutRight {
+ 20% {
+ opacity: 1;
+ -webkit-transform: translate3d(20px, 0, 0);
+ transform: translate3d(20px, 0, 0);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: translate3d(-2000px, 0, 0);
+ transform: translate3d(-2000px, 0, 0);
+ }
+}
+@-webkit-keyframes flyOutLeft {
+ 20% {
+ opacity: 1;
+ -webkit-transform: translate3d(-20px, 0, 0);
+ transform: translate3d(-20px, 0, 0);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: translate3d(2000px, 0, 0);
+ transform: translate3d(2000px, 0, 0);
+ }
+}
+@keyframes flyOutLeft {
+ 20% {
+ opacity: 1;
+ -webkit-transform: translate3d(-20px, 0, 0);
+ transform: translate3d(-20px, 0, 0);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: translate3d(2000px, 0, 0);
+ transform: translate3d(2000px, 0, 0);
+ }
+}
+
+/*--------------
+ Slide
+ ---------------*/
+
+.transition.slide.in,
+.transition[class*="slide down"].in {
+ -webkit-animation-name: slideInY;
+ animation-name: slideInY;
+ -webkit-transform-origin: top center;
+ transform-origin: top center;
+}
+.transition[class*="slide up"].in {
+ -webkit-animation-name: slideInY;
+ animation-name: slideInY;
+ -webkit-transform-origin: bottom center;
+ transform-origin: bottom center;
+}
+.transition[class*="slide left"].in {
+ -webkit-animation-name: slideInX;
+ animation-name: slideInX;
+ -webkit-transform-origin: right center;
+ transform-origin: right center;
+}
+.transition[class*="slide right"].in {
+ -webkit-animation-name: slideInX;
+ animation-name: slideInX;
+ -webkit-transform-origin: left center;
+ transform-origin: left center;
+}
+.transition.slide.out,
+.transition[class*="slide down"].out {
+ -webkit-animation-name: slideOutY;
+ animation-name: slideOutY;
+ -webkit-transform-origin: top center;
+ transform-origin: top center;
+}
+.transition[class*="slide up"].out {
+ -webkit-animation-name: slideOutY;
+ animation-name: slideOutY;
+ -webkit-transform-origin: bottom center;
+ transform-origin: bottom center;
+}
+.transition[class*="slide left"].out {
+ -webkit-animation-name: slideOutX;
+ animation-name: slideOutX;
+ -webkit-transform-origin: right center;
+ transform-origin: right center;
+}
+.transition[class*="slide right"].out {
+ -webkit-animation-name: slideOutX;
+ animation-name: slideOutX;
+ -webkit-transform-origin: left center;
+ transform-origin: left center;
+}
+
+/* In */
+@-webkit-keyframes slideInY {
+ 0% {
+ opacity: 0;
+ -webkit-transform: scaleY(0);
+ transform: scaleY(0);
+ }
+ 100% {
+ opacity: 1;
+ -webkit-transform: scaleY(1);
+ transform: scaleY(1);
+ }
+}
+@keyframes slideInY {
+ 0% {
+ opacity: 0;
+ -webkit-transform: scaleY(0);
+ transform: scaleY(0);
+ }
+ 100% {
+ opacity: 1;
+ -webkit-transform: scaleY(1);
+ transform: scaleY(1);
+ }
+}
+@-webkit-keyframes slideInX {
+ 0% {
+ opacity: 0;
+ -webkit-transform: scaleX(0);
+ transform: scaleX(0);
+ }
+ 100% {
+ opacity: 1;
+ -webkit-transform: scaleX(1);
+ transform: scaleX(1);
+ }
+}
+@keyframes slideInX {
+ 0% {
+ opacity: 0;
+ -webkit-transform: scaleX(0);
+ transform: scaleX(0);
+ }
+ 100% {
+ opacity: 1;
+ -webkit-transform: scaleX(1);
+ transform: scaleX(1);
+ }
+}
+
+/* Out */
+@-webkit-keyframes slideOutY {
+ 0% {
+ opacity: 1;
+ -webkit-transform: scaleY(1);
+ transform: scaleY(1);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: scaleY(0);
+ transform: scaleY(0);
+ }
+}
+@keyframes slideOutY {
+ 0% {
+ opacity: 1;
+ -webkit-transform: scaleY(1);
+ transform: scaleY(1);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: scaleY(0);
+ transform: scaleY(0);
+ }
+}
+@-webkit-keyframes slideOutX {
+ 0% {
+ opacity: 1;
+ -webkit-transform: scaleX(1);
+ transform: scaleX(1);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: scaleX(0);
+ transform: scaleX(0);
+ }
+}
+@keyframes slideOutX {
+ 0% {
+ opacity: 1;
+ -webkit-transform: scaleX(1);
+ transform: scaleX(1);
+ }
+ 100% {
+ opacity: 0;
+ -webkit-transform: scaleX(0);
+ transform: scaleX(0);
+ }
+}
+
+/*--------------
+ Swing
+ ---------------*/
+
+.transition.swing {
+ -webkit-animation-duration: 800ms;
+ animation-duration: 800ms;
+}
+.transition[class*="swing down"].in {
+ -webkit-animation-name: swingInX;
+ animation-name: swingInX;
+ -webkit-transform-origin: top center;
+ transform-origin: top center;
+}
+.transition[class*="swing up"].in {
+ -webkit-animation-name: swingInX;
+ animation-name: swingInX;
+ -webkit-transform-origin: bottom center;
+ transform-origin: bottom center;
+}
+.transition[class*="swing left"].in {
+ -webkit-animation-name: swingInY;
+ animation-name: swingInY;
+ -webkit-transform-origin: right center;
+ transform-origin: right center;
+}
+.transition[class*="swing right"].in {
+ -webkit-animation-name: swingInY;
+ animation-name: swingInY;
+ -webkit-transform-origin: left center;
+ transform-origin: left center;
+}
+.transition.swing.out,
+.transition[class*="swing down"].out {
+ -webkit-animation-name: swingOutX;
+ animation-name: swingOutX;
+ -webkit-transform-origin: top center;
+ transform-origin: top center;
+}
+.transition[class*="swing up"].out {
+ -webkit-animation-name: swingOutX;
+ animation-name: swingOutX;
+ -webkit-transform-origin: bottom center;
+ transform-origin: bottom center;
+}
+.transition[class*="swing left"].out {
+ -webkit-animation-name: swingOutY;
+ animation-name: swingOutY;
+ -webkit-transform-origin: right center;
+ transform-origin: right center;
+}
+.transition[class*="swing right"].out {
+ -webkit-animation-name: swingOutY;
+ animation-name: swingOutY;
+ -webkit-transform-origin: left center;
+ transform-origin: left center;
+}
+
+/* In */
+@-webkit-keyframes swingInX {
+ 0% {
+ -webkit-transform: perspective(1000px) rotateX(90deg);
+ transform: perspective(1000px) rotateX(90deg);
+ opacity: 0;
+ }
+ 40% {
+ -webkit-transform: perspective(1000px) rotateX(-30deg);
+ transform: perspective(1000px) rotateX(-30deg);
+ opacity: 1;
+ }
+ 60% {
+ -webkit-transform: perspective(1000px) rotateX(15deg);
+ transform: perspective(1000px) rotateX(15deg);
+ }
+ 80% {
+ -webkit-transform: perspective(1000px) rotateX(-7.5deg);
+ transform: perspective(1000px) rotateX(-7.5deg);
+ }
+ 100% {
+ -webkit-transform: perspective(1000px) rotateX(0deg);
+ transform: perspective(1000px) rotateX(0deg);
+ }
+}
+@keyframes swingInX {
+ 0% {
+ -webkit-transform: perspective(1000px) rotateX(90deg);
+ transform: perspective(1000px) rotateX(90deg);
+ opacity: 0;
+ }
+ 40% {
+ -webkit-transform: perspective(1000px) rotateX(-30deg);
+ transform: perspective(1000px) rotateX(-30deg);
+ opacity: 1;
+ }
+ 60% {
+ -webkit-transform: perspective(1000px) rotateX(15deg);
+ transform: perspective(1000px) rotateX(15deg);
+ }
+ 80% {
+ -webkit-transform: perspective(1000px) rotateX(-7.5deg);
+ transform: perspective(1000px) rotateX(-7.5deg);
+ }
+ 100% {
+ -webkit-transform: perspective(1000px) rotateX(0deg);
+ transform: perspective(1000px) rotateX(0deg);
+ }
+}
+@-webkit-keyframes swingInY {
+ 0% {
+ -webkit-transform: perspective(1000px) rotateY(-90deg);
+ transform: perspective(1000px) rotateY(-90deg);
+ opacity: 0;
+ }
+ 40% {
+ -webkit-transform: perspective(1000px) rotateY(30deg);
+ transform: perspective(1000px) rotateY(30deg);
+ opacity: 1;
+ }
+ 60% {
+ -webkit-transform: perspective(1000px) rotateY(-17.5deg);
+ transform: perspective(1000px) rotateY(-17.5deg);
+ }
+ 80% {
+ -webkit-transform: perspective(1000px) rotateY(7.5deg);
+ transform: perspective(1000px) rotateY(7.5deg);
+ }
+ 100% {
+ -webkit-transform: perspective(1000px) rotateY(0deg);
+ transform: perspective(1000px) rotateY(0deg);
+ }
+}
+@keyframes swingInY {
+ 0% {
+ -webkit-transform: perspective(1000px) rotateY(-90deg);
+ transform: perspective(1000px) rotateY(-90deg);
+ opacity: 0;
+ }
+ 40% {
+ -webkit-transform: perspective(1000px) rotateY(30deg);
+ transform: perspective(1000px) rotateY(30deg);
+ opacity: 1;
+ }
+ 60% {
+ -webkit-transform: perspective(1000px) rotateY(-17.5deg);
+ transform: perspective(1000px) rotateY(-17.5deg);
+ }
+ 80% {
+ -webkit-transform: perspective(1000px) rotateY(7.5deg);
+ transform: perspective(1000px) rotateY(7.5deg);
+ }
+ 100% {
+ -webkit-transform: perspective(1000px) rotateY(0deg);
+ transform: perspective(1000px) rotateY(0deg);
+ }
+}
+
+/* Out */
+@-webkit-keyframes swingOutX {
+ 0% {
+ -webkit-transform: perspective(1000px) rotateX(0deg);
+ transform: perspective(1000px) rotateX(0deg);
+ }
+ 40% {
+ -webkit-transform: perspective(1000px) rotateX(-7.5deg);
+ transform: perspective(1000px) rotateX(-7.5deg);
+ }
+ 60% {
+ -webkit-transform: perspective(1000px) rotateX(17.5deg);
+ transform: perspective(1000px) rotateX(17.5deg);
+ }
+ 80% {
+ -webkit-transform: perspective(1000px) rotateX(-30deg);
+ transform: perspective(1000px) rotateX(-30deg);
+ opacity: 1;
+ }
+ 100% {
+ -webkit-transform: perspective(1000px) rotateX(90deg);
+ transform: perspective(1000px) rotateX(90deg);
+ opacity: 0;
+ }
+}
+@keyframes swingOutX {
+ 0% {
+ -webkit-transform: perspective(1000px) rotateX(0deg);
+ transform: perspective(1000px) rotateX(0deg);
+ }
+ 40% {
+ -webkit-transform: perspective(1000px) rotateX(-7.5deg);
+ transform: perspective(1000px) rotateX(-7.5deg);
+ }
+ 60% {
+ -webkit-transform: perspective(1000px) rotateX(17.5deg);
+ transform: perspective(1000px) rotateX(17.5deg);
+ }
+ 80% {
+ -webkit-transform: perspective(1000px) rotateX(-30deg);
+ transform: perspective(1000px) rotateX(-30deg);
+ opacity: 1;
+ }
+ 100% {
+ -webkit-transform: perspective(1000px) rotateX(90deg);
+ transform: perspective(1000px) rotateX(90deg);
+ opacity: 0;
+ }
+}
+@-webkit-keyframes swingOutY {
+ 0% {
+ -webkit-transform: perspective(1000px) rotateY(0deg);
+ transform: perspective(1000px) rotateY(0deg);
+ }
+ 40% {
+ -webkit-transform: perspective(1000px) rotateY(7.5deg);
+ transform: perspective(1000px) rotateY(7.5deg);
+ }
+ 60% {
+ -webkit-transform: perspective(1000px) rotateY(-10deg);
+ transform: perspective(1000px) rotateY(-10deg);
+ }
+ 80% {
+ -webkit-transform: perspective(1000px) rotateY(30deg);
+ transform: perspective(1000px) rotateY(30deg);
+ opacity: 1;
+ }
+ 100% {
+ -webkit-transform: perspective(1000px) rotateY(-90deg);
+ transform: perspective(1000px) rotateY(-90deg);
+ opacity: 0;
+ }
+}
+@keyframes swingOutY {
+ 0% {
+ -webkit-transform: perspective(1000px) rotateY(0deg);
+ transform: perspective(1000px) rotateY(0deg);
+ }
+ 40% {
+ -webkit-transform: perspective(1000px) rotateY(7.5deg);
+ transform: perspective(1000px) rotateY(7.5deg);
+ }
+ 60% {
+ -webkit-transform: perspective(1000px) rotateY(-10deg);
+ transform: perspective(1000px) rotateY(-10deg);
+ }
+ 80% {
+ -webkit-transform: perspective(1000px) rotateY(30deg);
+ transform: perspective(1000px) rotateY(30deg);
+ opacity: 1;
+ }
+ 100% {
+ -webkit-transform: perspective(1000px) rotateY(-90deg);
+ transform: perspective(1000px) rotateY(-90deg);
+ opacity: 0;
+ }
+}
+
+/*--------------
+ Zoom
+ ---------------*/
+
+.transition.zoom.in {
+ -webkit-animation-name: zoomIn;
+ animation-name: zoomIn;
+}
+.transition.zoom.out {
+ -webkit-animation-name: zoomOut;
+ animation-name: zoomOut;
+}
+@-webkit-keyframes zoomIn {
+ 0% {
+ opacity: 1;
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+ 100% {
+ opacity: 1;
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+}
+@keyframes zoomIn {
+ 0% {
+ opacity: 1;
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+ 100% {
+ opacity: 1;
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+}
+@-webkit-keyframes zoomOut {
+ 0% {
+ opacity: 1;
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+ 100% {
+ opacity: 1;
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+}
+@keyframes zoomOut {
+ 0% {
+ opacity: 1;
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ }
+ 100% {
+ opacity: 1;
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ }
+}
+
+
+/*******************************
+ Static Animations
+*******************************/
+
+
+/*--------------
+ Emphasis
+---------------*/
+
+.flash.transition {
+ -webkit-animation-duration: 750ms;
+ animation-duration: 750ms;
+ -webkit-animation-name: flash;
+ animation-name: flash;
+}
+.shake.transition {
+ -webkit-animation-duration: 750ms;
+ animation-duration: 750ms;
+ -webkit-animation-name: shake;
+ animation-name: shake;
+}
+.bounce.transition {
+ -webkit-animation-duration: 750ms;
+ animation-duration: 750ms;
+ -webkit-animation-name: bounce;
+ animation-name: bounce;
+}
+.tada.transition {
+ -webkit-animation-duration: 750ms;
+ animation-duration: 750ms;
+ -webkit-animation-name: tada;
+ animation-name: tada;
+}
+.pulse.transition {
+ -webkit-animation-duration: 500ms;
+ animation-duration: 500ms;
+ -webkit-animation-name: pulse;
+ animation-name: pulse;
+}
+.jiggle.transition {
+ -webkit-animation-duration: 750ms;
+ animation-duration: 750ms;
+ -webkit-animation-name: jiggle;
+ animation-name: jiggle;
+}
+.transition.glow {
+ -webkit-animation-duration: 2000ms;
+ animation-duration: 2000ms;
+ -webkit-animation-timing-function: cubic-bezier(0.19, 1, 0.22, 1);
+ animation-timing-function: cubic-bezier(0.19, 1, 0.22, 1);
+}
+.transition.glow {
+ -webkit-animation-name: glow;
+ animation-name: glow;
+}
+
+/* Flash */
+@-webkit-keyframes flash {
+ 0%,
+ 50%,
+ 100% {
+ opacity: 1;
+ }
+ 25%,
+ 75% {
+ opacity: 0;
+ }
+}
+@keyframes flash {
+ 0%,
+ 50%,
+ 100% {
+ opacity: 1;
+ }
+ 25%,
+ 75% {
+ opacity: 0;
+ }
+}
+
+/* Shake */
+@-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);
+ 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);
+ }
+}
+
+/* Bounce */
+@-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);
+ transform: translateY(0);
+ }
+ 40% {
+ -webkit-transform: translateY(-30px);
+ transform: translateY(-30px);
+ }
+ 60% {
+ -webkit-transform: translateY(-15px);
+ transform: translateY(-15px);
+ }
+}
+
+/* Tada */
+@-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);
+ 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);
+ }
+}
+
+/* Pulse */
+@-webkit-keyframes pulse {
+ 0% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ opacity: 1;
+ }
+ 50% {
+ -webkit-transform: scale(0.9);
+ transform: scale(0.9);
+ opacity: 0.7;
+ }
+ 100% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ opacity: 1;
+ }
+}
+@keyframes pulse {
+ 0% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ opacity: 1;
+ }
+ 50% {
+ -webkit-transform: scale(0.9);
+ transform: scale(0.9);
+ opacity: 0.7;
+ }
+ 100% {
+ -webkit-transform: scale(1);
+ transform: scale(1);
+ opacity: 1;
+ }
+}
+
+/* Jiggle */
+@-webkit-keyframes jiggle {
+ 0% {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+ 30% {
+ -webkit-transform: scale3d(1.25, 0.75, 1);
+ transform: scale3d(1.25, 0.75, 1);
+ }
+ 40% {
+ -webkit-transform: scale3d(0.75, 1.25, 1);
+ transform: scale3d(0.75, 1.25, 1);
+ }
+ 50% {
+ -webkit-transform: scale3d(1.15, 0.85, 1);
+ transform: scale3d(1.15, 0.85, 1);
+ }
+ 65% {
+ -webkit-transform: scale3d(0.95, 1.05, 1);
+ transform: scale3d(0.95, 1.05, 1);
+ }
+ 75% {
+ -webkit-transform: scale3d(1.05, 0.95, 1);
+ transform: scale3d(1.05, 0.95, 1);
+ }
+ 100% {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+}
+@keyframes jiggle {
+ 0% {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+ 30% {
+ -webkit-transform: scale3d(1.25, 0.75, 1);
+ transform: scale3d(1.25, 0.75, 1);
+ }
+ 40% {
+ -webkit-transform: scale3d(0.75, 1.25, 1);
+ transform: scale3d(0.75, 1.25, 1);
+ }
+ 50% {
+ -webkit-transform: scale3d(1.15, 0.85, 1);
+ transform: scale3d(1.15, 0.85, 1);
+ }
+ 65% {
+ -webkit-transform: scale3d(0.95, 1.05, 1);
+ transform: scale3d(0.95, 1.05, 1);
+ }
+ 75% {
+ -webkit-transform: scale3d(1.05, 0.95, 1);
+ transform: scale3d(1.05, 0.95, 1);
+ }
+ 100% {
+ -webkit-transform: scale3d(1, 1, 1);
+ transform: scale3d(1, 1, 1);
+ }
+}
+
+/* Glow */
+@-webkit-keyframes glow {
+ 0% {
+ background-color: #FCFCFD;
+ }
+ 30% {
+ background-color: #FFF6CD;
+ }
+ 100% {
+ background-color: #FCFCFD;
+ }
+}
+@keyframes glow {
+ 0% {
+ background-color: #FCFCFD;
+ }
+ 30% {
+ background-color: #FFF6CD;
+ }
+ 100% {
+ background-color: #FCFCFD;
+ }
+}
+
+
+/*******************************
+ Site Overrides
+*******************************/
+
diff --git a/public/dist/components/transition.js b/public/dist/components/transition.js
new file mode 100644
index 000000000..064890bd0
--- /dev/null
+++ b/public/dist/components/transition.js
@@ -0,0 +1,1109 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Transition
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+'use strict';
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.transition = function() {
+ var
+ $allModules = $(this),
+ moduleSelector = $allModules.selector || '',
+
+ time = new Date().getTime(),
+ performance = [],
+
+ moduleArguments = arguments,
+ query = moduleArguments[0],
+ queryArguments = [].slice.call(arguments, 1),
+ methodInvoked = (typeof query === 'string'),
+
+ returnedValue
+ ;
+ $allModules
+ .each(function(index) {
+ var
+ $module = $(this),
+ element = this,
+
+ // set at run time
+ settings,
+ instance,
+
+ error,
+ className,
+ metadata,
+ animationEnd,
+
+ moduleNamespace,
+ eventNamespace,
+ module
+ ;
+
+ module = {
+
+ initialize: function() {
+
+ // get full settings
+ settings = module.get.settings.apply(element, moduleArguments);
+
+ // shorthand
+ className = settings.className;
+ error = settings.error;
+ metadata = settings.metadata;
+
+ // define namespace
+ eventNamespace = '.' + settings.namespace;
+ moduleNamespace = 'module-' + settings.namespace;
+ instance = $module.data(moduleNamespace) || module;
+
+ // get vendor specific events
+ animationEnd = module.get.animationEndEvent();
+
+ if(methodInvoked) {
+ methodInvoked = module.invoke(query);
+ }
+
+ // method not invoked, lets run an animation
+ if(methodInvoked === false) {
+ module.verbose('Converted arguments into settings object', settings);
+ if(settings.interval) {
+ module.delay(settings.animate);
+ }
+ else {
+ module.animate();
+ }
+ module.instantiate();
+ }
+ },
+
+ instantiate: function() {
+ module.verbose('Storing instance of module', module);
+ instance = module;
+ $module
+ .data(moduleNamespace, instance)
+ ;
+ },
+
+ destroy: function() {
+ module.verbose('Destroying previous module for', element);
+ $module
+ .removeData(moduleNamespace)
+ ;
+ },
+
+ refresh: function() {
+ module.verbose('Refreshing display type on next animation');
+ delete module.displayType;
+ },
+
+ forceRepaint: function() {
+ module.verbose('Forcing element repaint');
+ var
+ $parentElement = $module.parent(),
+ $nextElement = $module.next()
+ ;
+ if($nextElement.length === 0) {
+ $module.detach().appendTo($parentElement);
+ }
+ else {
+ $module.detach().insertBefore($nextElement);
+ }
+ },
+
+ repaint: function() {
+ module.verbose('Repainting element');
+ var
+ fakeAssignment = element.offsetWidth
+ ;
+ },
+
+ delay: function(interval) {
+ var
+ direction = module.get.animationDirection(),
+ shouldReverse,
+ delay
+ ;
+ if(!direction) {
+ direction = module.can.transition()
+ ? module.get.direction()
+ : 'static'
+ ;
+ }
+ interval = (interval !== undefined)
+ ? interval
+ : settings.interval
+ ;
+ shouldReverse = (settings.reverse == 'auto' && direction == className.outward);
+ delay = (shouldReverse || settings.reverse == true)
+ ? ($allModules.length - index) * settings.interval
+ : index * settings.interval
+ ;
+ module.debug('Delaying animation by', delay);
+ setTimeout(module.animate, delay);
+ },
+
+ animate: function(overrideSettings) {
+ settings = overrideSettings || settings;
+ if(!module.is.supported()) {
+ module.error(error.support);
+ return false;
+ }
+ module.debug('Preparing animation', settings.animation);
+ if(module.is.animating()) {
+ if(settings.queue) {
+ if(!settings.allowRepeats && module.has.direction() && module.is.occurring() && module.queuing !== true) {
+ module.debug('Animation is currently occurring, preventing queueing same animation', settings.animation);
+ }
+ else {
+ module.queue(settings.animation);
+ }
+ return false;
+ }
+ else if(!settings.allowRepeats && module.is.occurring()) {
+ module.debug('Animation is already occurring, will not execute repeated animation', settings.animation);
+ return false;
+ }
+ else {
+ module.debug('New animation started, completing previous early', settings.animation);
+ instance.complete();
+ }
+ }
+ if( module.can.animate() ) {
+ module.set.animating(settings.animation);
+ }
+ else {
+ module.error(error.noAnimation, settings.animation, element);
+ }
+ },
+
+ reset: function() {
+ module.debug('Resetting animation to beginning conditions');
+ module.remove.animationCallbacks();
+ module.restore.conditions();
+ module.remove.animating();
+ },
+
+ queue: function(animation) {
+ module.debug('Queueing animation of', animation);
+ module.queuing = true;
+ $module
+ .one(animationEnd + '.queue' + eventNamespace, function() {
+ module.queuing = false;
+ module.repaint();
+ module.animate.apply(this, settings);
+ })
+ ;
+ },
+
+ complete: function (event) {
+ if(event && event.target === element) {
+ event.stopPropagation();
+ }
+ module.debug('Animation complete', settings.animation);
+ module.remove.completeCallback();
+ module.remove.failSafe();
+ if(!module.is.looping()) {
+ if( module.is.outward() ) {
+ module.verbose('Animation is outward, hiding element');
+ module.restore.conditions();
+ module.hide();
+ }
+ else if( module.is.inward() ) {
+ module.verbose('Animation is outward, showing element');
+ module.restore.conditions();
+ module.show();
+ }
+ else {
+ module.verbose('Static animation completed');
+ module.restore.conditions();
+ settings.onComplete.call(element);
+ }
+ }
+ },
+
+ force: {
+ visible: function() {
+ var
+ style = $module.attr('style'),
+ userStyle = module.get.userStyle(style),
+ displayType = module.get.displayType(),
+ overrideStyle = userStyle + 'display: ' + displayType + ' !important;',
+ inlineDisplay = $module[0].style.display,
+ mustStayHidden = !displayType || (inlineDisplay === 'none' && settings.skipInlineHidden) || $module[0].tagName.match(/(script|link|style)/i)
+ ;
+ if (mustStayHidden){
+ module.remove.transition();
+ return false;
+ }
+ module.verbose('Overriding default display to show element', displayType);
+ $module
+ .attr('style', overrideStyle)
+ ;
+ return true;
+ },
+ hidden: function() {
+ var
+ style = $module.attr('style'),
+ currentDisplay = $module.css('display'),
+ emptyStyle = (style === undefined || style === '')
+ ;
+ if(currentDisplay !== 'none' && !module.is.hidden()) {
+ module.verbose('Overriding default display to hide element');
+ $module
+ .css('display', 'none')
+ ;
+ }
+ else if(emptyStyle) {
+ $module
+ .removeAttr('style')
+ ;
+ }
+ }
+ },
+
+ has: {
+ direction: function(animation) {
+ var
+ hasDirection = false
+ ;
+ animation = animation || settings.animation;
+ if(typeof animation === 'string') {
+ animation = animation.split(' ');
+ $.each(animation, function(index, word){
+ if(word === className.inward || word === className.outward) {
+ hasDirection = true;
+ }
+ });
+ }
+ return hasDirection;
+ },
+ inlineDisplay: function() {
+ var
+ style = $module.attr('style') || ''
+ ;
+ return Array.isArray(style.match(/display.*?;/, ''));
+ }
+ },
+
+ set: {
+ animating: function(animation) {
+ // remove previous callbacks
+ module.remove.completeCallback();
+
+ // determine exact animation
+ animation = animation || settings.animation;
+ var animationClass = module.get.animationClass(animation);
+
+ // save animation class in cache to restore class names
+ module.save.animation(animationClass);
+
+ if(module.force.visible()) {
+ module.remove.hidden();
+ module.remove.direction();
+
+ module.start.animation(animationClass);
+ }
+ },
+ duration: function(animationName, duration) {
+ duration = duration || settings.duration;
+ duration = (typeof duration == 'number')
+ ? duration + 'ms'
+ : duration
+ ;
+ if(duration || duration === 0) {
+ module.verbose('Setting animation duration', duration);
+ $module
+ .css({
+ 'animation-duration': duration
+ })
+ ;
+ }
+ },
+ direction: function(direction) {
+ direction = direction || module.get.direction();
+ if(direction == className.inward) {
+ module.set.inward();
+ }
+ else {
+ module.set.outward();
+ }
+ },
+ looping: function() {
+ module.debug('Transition set to loop');
+ $module
+ .addClass(className.looping)
+ ;
+ },
+ hidden: function() {
+ $module
+ .addClass(className.transition)
+ .addClass(className.hidden)
+ ;
+ },
+ inward: function() {
+ module.debug('Setting direction to inward');
+ $module
+ .removeClass(className.outward)
+ .addClass(className.inward)
+ ;
+ },
+ outward: function() {
+ module.debug('Setting direction to outward');
+ $module
+ .removeClass(className.inward)
+ .addClass(className.outward)
+ ;
+ },
+ visible: function() {
+ $module
+ .addClass(className.transition)
+ .addClass(className.visible)
+ ;
+ }
+ },
+
+ start: {
+ animation: function(animationClass) {
+ animationClass = animationClass || module.get.animationClass();
+ module.debug('Starting tween', animationClass);
+ $module
+ .addClass(animationClass)
+ .one(animationEnd + '.complete' + eventNamespace, module.complete)
+ ;
+ if(settings.useFailSafe) {
+ module.add.failSafe();
+ }
+ module.set.duration(settings.duration);
+ settings.onStart.call(element);
+ }
+ },
+
+ save: {
+ animation: function(animation) {
+ if(!module.cache) {
+ module.cache = {};
+ }
+ module.cache.animation = animation;
+ },
+ displayType: function(displayType) {
+ if(displayType !== 'none') {
+ $module.data(metadata.displayType, displayType);
+ }
+ },
+ transitionExists: function(animation, exists) {
+ $.fn.transition.exists[animation] = exists;
+ module.verbose('Saving existence of transition', animation, exists);
+ }
+ },
+
+ restore: {
+ conditions: function() {
+ var
+ animation = module.get.currentAnimation()
+ ;
+ if(animation) {
+ $module
+ .removeClass(animation)
+ ;
+ module.verbose('Removing animation class', module.cache);
+ }
+ module.remove.duration();
+ }
+ },
+
+ add: {
+ failSafe: function() {
+ var
+ duration = module.get.duration()
+ ;
+ module.timer = setTimeout(function() {
+ $module.triggerHandler(animationEnd);
+ }, duration + settings.failSafeDelay);
+ module.verbose('Adding fail safe timer', module.timer);
+ }
+ },
+
+ remove: {
+ animating: function() {
+ $module.removeClass(className.animating);
+ },
+ animationCallbacks: function() {
+ module.remove.queueCallback();
+ module.remove.completeCallback();
+ },
+ queueCallback: function() {
+ $module.off('.queue' + eventNamespace);
+ },
+ completeCallback: function() {
+ $module.off('.complete' + eventNamespace);
+ },
+ display: function() {
+ $module.css('display', '');
+ },
+ direction: function() {
+ $module
+ .removeClass(className.inward)
+ .removeClass(className.outward)
+ ;
+ },
+ duration: function() {
+ $module
+ .css('animation-duration', '')
+ ;
+ },
+ failSafe: function() {
+ module.verbose('Removing fail safe timer', module.timer);
+ if(module.timer) {
+ clearTimeout(module.timer);
+ }
+ },
+ hidden: function() {
+ $module.removeClass(className.hidden);
+ },
+ visible: function() {
+ $module.removeClass(className.visible);
+ },
+ looping: function() {
+ module.debug('Transitions are no longer looping');
+ if( module.is.looping() ) {
+ module.reset();
+ $module
+ .removeClass(className.looping)
+ ;
+ }
+ },
+ transition: function() {
+ $module
+ .removeClass(className.transition)
+ .removeClass(className.visible)
+ .removeClass(className.hidden)
+ ;
+ }
+ },
+ get: {
+ settings: function(animation, duration, onComplete) {
+ // single settings object
+ if(typeof animation == 'object') {
+ return $.extend(true, {}, $.fn.transition.settings, animation);
+ }
+ // all arguments provided
+ else if(typeof onComplete == 'function') {
+ return $.extend({}, $.fn.transition.settings, {
+ animation : animation,
+ onComplete : onComplete,
+ duration : duration
+ });
+ }
+ // only duration provided
+ else if(typeof duration == 'string' || typeof duration == 'number') {
+ return $.extend({}, $.fn.transition.settings, {
+ animation : animation,
+ duration : duration
+ });
+ }
+ // duration is actually settings object
+ else if(typeof duration == 'object') {
+ return $.extend({}, $.fn.transition.settings, duration, {
+ animation : animation
+ });
+ }
+ // duration is actually callback
+ else if(typeof duration == 'function') {
+ return $.extend({}, $.fn.transition.settings, {
+ animation : animation,
+ onComplete : duration
+ });
+ }
+ // only animation provided
+ else {
+ return $.extend({}, $.fn.transition.settings, {
+ animation : animation
+ });
+ }
+ },
+ animationClass: function(animation) {
+ var
+ animationClass = animation || settings.animation,
+ directionClass = (module.can.transition() && !module.has.direction())
+ ? module.get.direction() + ' '
+ : ''
+ ;
+ return className.animating + ' '
+ + className.transition + ' '
+ + directionClass
+ + animationClass
+ ;
+ },
+ currentAnimation: function() {
+ return (module.cache && module.cache.animation !== undefined)
+ ? module.cache.animation
+ : false
+ ;
+ },
+ currentDirection: function() {
+ return module.is.inward()
+ ? className.inward
+ : className.outward
+ ;
+ },
+ direction: function() {
+ return module.is.hidden() || !module.is.visible()
+ ? className.inward
+ : className.outward
+ ;
+ },
+ animationDirection: function(animation) {
+ var
+ direction
+ ;
+ animation = animation || settings.animation;
+ if(typeof animation === 'string') {
+ animation = animation.split(' ');
+ // search animation name for out/in class
+ $.each(animation, function(index, word){
+ if(word === className.inward) {
+ direction = className.inward;
+ }
+ else if(word === className.outward) {
+ direction = className.outward;
+ }
+ });
+ }
+ // return found direction
+ if(direction) {
+ return direction;
+ }
+ return false;
+ },
+ duration: function(duration) {
+ duration = duration || settings.duration;
+ if(duration === false) {
+ duration = $module.css('animation-duration') || 0;
+ }
+ return (typeof duration === 'string')
+ ? (duration.indexOf('ms') > -1)
+ ? parseFloat(duration)
+ : parseFloat(duration) * 1000
+ : duration
+ ;
+ },
+ displayType: function(shouldDetermine) {
+ shouldDetermine = (shouldDetermine !== undefined)
+ ? shouldDetermine
+ : true
+ ;
+ if(settings.displayType) {
+ return settings.displayType;
+ }
+ if(shouldDetermine && $module.data(metadata.displayType) === undefined) {
+ var currentDisplay = $module.css('display');
+ if(currentDisplay === '' || currentDisplay === 'none'){
+ // create fake element to determine display state
+ module.can.transition(true);
+ } else {
+ module.save.displayType(currentDisplay);
+ }
+ }
+ return $module.data(metadata.displayType);
+ },
+ userStyle: function(style) {
+ style = style || $module.attr('style') || '';
+ return style.replace(/display.*?;/, '');
+ },
+ transitionExists: function(animation) {
+ return $.fn.transition.exists[animation];
+ },
+ animationStartEvent: function() {
+ var
+ element = document.createElement('div'),
+ animations = {
+ 'animation' :'animationstart',
+ 'OAnimation' :'oAnimationStart',
+ 'MozAnimation' :'mozAnimationStart',
+ 'WebkitAnimation' :'webkitAnimationStart'
+ },
+ animation
+ ;
+ for(animation in animations){
+ if( element.style[animation] !== undefined ){
+ return animations[animation];
+ }
+ }
+ return false;
+ },
+ animationEndEvent: function() {
+ var
+ element = document.createElement('div'),
+ animations = {
+ 'animation' :'animationend',
+ 'OAnimation' :'oAnimationEnd',
+ 'MozAnimation' :'mozAnimationEnd',
+ 'WebkitAnimation' :'webkitAnimationEnd'
+ },
+ animation
+ ;
+ for(animation in animations){
+ if( element.style[animation] !== undefined ){
+ return animations[animation];
+ }
+ }
+ return false;
+ }
+
+ },
+
+ can: {
+ transition: function(forced) {
+ var
+ animation = settings.animation,
+ transitionExists = module.get.transitionExists(animation),
+ displayType = module.get.displayType(false),
+ elementClass,
+ tagName,
+ $clone,
+ currentAnimation,
+ inAnimation,
+ directionExists
+ ;
+ if( transitionExists === undefined || forced) {
+ module.verbose('Determining whether animation exists');
+ elementClass = $module.attr('class');
+ tagName = $module.prop('tagName');
+
+ $clone = $('<' + tagName + ' />').addClass( elementClass ).insertAfter($module);
+ currentAnimation = $clone
+ .addClass(animation)
+ .removeClass(className.inward)
+ .removeClass(className.outward)
+ .addClass(className.animating)
+ .addClass(className.transition)
+ .css('animationName')
+ ;
+ inAnimation = $clone
+ .addClass(className.inward)
+ .css('animationName')
+ ;
+ if(!displayType) {
+ displayType = $clone
+ .attr('class', elementClass)
+ .removeAttr('style')
+ .removeClass(className.hidden)
+ .removeClass(className.visible)
+ .show()
+ .css('display')
+ ;
+ module.verbose('Determining final display state', displayType);
+ module.save.displayType(displayType);
+ }
+
+ $clone.remove();
+ if(currentAnimation != inAnimation) {
+ module.debug('Direction exists for animation', animation);
+ directionExists = true;
+ }
+ else if(currentAnimation == 'none' || !currentAnimation) {
+ module.debug('No animation defined in css', animation);
+ return;
+ }
+ else {
+ module.debug('Static animation found', animation, displayType);
+ directionExists = false;
+ }
+ module.save.transitionExists(animation, directionExists);
+ }
+ return (transitionExists !== undefined)
+ ? transitionExists
+ : directionExists
+ ;
+ },
+ animate: function() {
+ // can transition does not return a value if animation does not exist
+ return (module.can.transition() !== undefined);
+ }
+ },
+
+ is: {
+ animating: function() {
+ return $module.hasClass(className.animating);
+ },
+ inward: function() {
+ return $module.hasClass(className.inward);
+ },
+ outward: function() {
+ return $module.hasClass(className.outward);
+ },
+ looping: function() {
+ return $module.hasClass(className.looping);
+ },
+ occurring: function(animation) {
+ animation = animation || settings.animation;
+ animation = '.' + animation.replace(' ', '.');
+ return ( $module.filter(animation).length > 0 );
+ },
+ visible: function() {
+ return $module.is(':visible');
+ },
+ hidden: function() {
+ return $module.css('visibility') === 'hidden';
+ },
+ supported: function() {
+ return(animationEnd !== false);
+ }
+ },
+
+ hide: function() {
+ module.verbose('Hiding element');
+ if( module.is.animating() ) {
+ module.reset();
+ }
+ element.blur(); // IE will trigger focus change if element is not blurred before hiding
+ module.remove.display();
+ module.remove.visible();
+ if($.isFunction(settings.onBeforeHide)){
+ settings.onBeforeHide.call(element,function(){
+ module.hideNow();
+ });
+ } else {
+ module.hideNow();
+ }
+
+ },
+
+ hideNow: function() {
+ module.set.hidden();
+ module.force.hidden();
+ settings.onHide.call(element);
+ settings.onComplete.call(element);
+ // module.repaint();
+ },
+
+ show: function(display) {
+ module.verbose('Showing element', display);
+ if(module.force.visible()) {
+ module.remove.hidden();
+ module.set.visible();
+ settings.onShow.call(element);
+ settings.onComplete.call(element);
+ // module.repaint();
+ }
+ },
+
+ toggle: function() {
+ if( module.is.visible() ) {
+ module.hide();
+ }
+ else {
+ module.show();
+ }
+ },
+
+ stop: function() {
+ module.debug('Stopping current animation');
+ $module.triggerHandler(animationEnd);
+ },
+
+ stopAll: function() {
+ module.debug('Stopping all animation');
+ module.remove.queueCallback();
+ $module.triggerHandler(animationEnd);
+ },
+
+ clear: {
+ queue: function() {
+ module.debug('Clearing animation queue');
+ module.remove.queueCallback();
+ }
+ },
+
+ enable: function() {
+ module.verbose('Starting animation');
+ $module.removeClass(className.disabled);
+ },
+
+ disable: function() {
+ module.debug('Stopping animation');
+ $module.addClass(className.disabled);
+ },
+
+ setting: function(name, value) {
+ module.debug('Changing setting', name, value);
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ if($.isPlainObject(settings[name])) {
+ $.extend(true, settings[name], value);
+ }
+ else {
+ settings[name] = value;
+ }
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if($allModules.length > 1) {
+ title += ' ' + '(' + $allModules.length + ')';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ // modified for transition to return invoke success
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return (found !== undefined)
+ ? found
+ : false
+ ;
+ }
+ };
+ module.initialize();
+ })
+ ;
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+// Records if CSS transition is available
+$.fn.transition.exists = {};
+
+$.fn.transition.settings = {
+
+ // module info
+ name : 'Transition',
+
+ // hide all output from this component regardless of other settings
+ silent : false,
+
+ // debug content outputted to console
+ debug : false,
+
+ // verbose debug output
+ verbose : false,
+
+ // performance data output
+ performance : true,
+
+ // event namespace
+ namespace : 'transition',
+
+ // delay between animations in group
+ interval : 0,
+
+ // whether group animations should be reversed
+ reverse : 'auto',
+
+ // animation callback event
+ onStart : function() {},
+ onComplete : function() {},
+ onShow : function() {},
+ onHide : function() {},
+
+ // whether timeout should be used to ensure callback fires in cases animationend does not
+ useFailSafe : true,
+
+ // delay in ms for fail safe
+ failSafeDelay : 100,
+
+ // whether EXACT animation can occur twice in a row
+ allowRepeats : false,
+
+ // Override final display type on visible
+ displayType : false,
+
+ // animation duration
+ animation : 'fade',
+ duration : false,
+
+ // new animations will occur after previous ones
+ queue : true,
+
+// whether initially inline hidden objects should be skipped for transition
+ skipInlineHidden: false,
+
+ metadata : {
+ displayType: 'display'
+ },
+
+ className : {
+ animating : 'animating',
+ disabled : 'disabled',
+ hidden : 'hidden',
+ inward : 'in',
+ loading : 'loading',
+ looping : 'looping',
+ outward : 'out',
+ transition : 'transition',
+ visible : 'visible'
+ },
+
+ // possible errors
+ error: {
+ noAnimation : 'Element is no longer attached to DOM. Unable to animate. Use silent setting to surpress this warning in production.',
+ repeated : 'That animation is already occurring, cancelling repeated animation',
+ method : 'The method you called is not defined',
+ support : 'This browser does not support CSS animations'
+ }
+
+};
+
+
+})( jQuery, window, document );
diff --git a/public/dist/components/transition.min.css b/public/dist/components/transition.min.css
new file mode 100644
index 000000000..c967afeb8
--- /dev/null
+++ b/public/dist/components/transition.min.css
@@ -0,0 +1,9 @@
+/*!
+ * # Fomantic-UI 2.8.8 - Transition
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */.transition{-webkit-animation-iteration-count:1;animation-iteration-count:1;-webkit-animation-duration:.3s;animation-duration:.3s;-webkit-animation-timing-function:ease;animation-timing-function:ease;-webkit-animation-fill-mode:both;animation-fill-mode:both}.animating.transition{-webkit-backface-visibility:hidden;backface-visibility:hidden;visibility:visible!important}.loading.transition{position:absolute;top:-99999px;left:-99999px}.hidden.transition{display:none;visibility:hidden}.visible.transition{display:block!important;visibility:visible!important}.disabled.transition{-webkit-animation-play-state:paused;animation-play-state:paused}.looping.transition{-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}.transition.browse{-webkit-animation-duration:.5s;animation-duration:.5s}.transition.browse.in{-webkit-animation-name:browseIn;animation-name:browseIn}.transition.browse.left.out,.transition.browse.out{-webkit-animation-name:browseOutLeft;animation-name:browseOutLeft}.transition.browse.right.out{-webkit-animation-name:browseOutRight;animation-name:browseOutRight}@-webkit-keyframes browseIn{0%{-webkit-transform:scale(.8) translateZ(0);transform:scale(.8) translateZ(0);z-index:-1}10%{-webkit-transform:scale(.8) translateZ(0);transform:scale(.8) translateZ(0);z-index:-1;opacity:.7}80%{-webkit-transform:scale(1.05) translateZ(0);transform:scale(1.05) translateZ(0);opacity:1;z-index:999}100%{-webkit-transform:scale(1) translateZ(0);transform:scale(1) translateZ(0);z-index:999}}@keyframes browseIn{0%{-webkit-transform:scale(.8) translateZ(0);transform:scale(.8) translateZ(0);z-index:-1}10%{-webkit-transform:scale(.8) translateZ(0);transform:scale(.8) translateZ(0);z-index:-1;opacity:.7}80%{-webkit-transform:scale(1.05) translateZ(0);transform:scale(1.05) translateZ(0);opacity:1;z-index:999}100%{-webkit-transform:scale(1) translateZ(0);transform:scale(1) translateZ(0);z-index:999}}@-webkit-keyframes browseOutLeft{0%{z-index:999;-webkit-transform:translateX(0) rotateY(0) rotateX(0);transform:translateX(0) rotateY(0) rotateX(0)}50%{z-index:-1;-webkit-transform:translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);transform:translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px)}80%{opacity:1}100%{z-index:-1;-webkit-transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);opacity:0}}@keyframes browseOutLeft{0%{z-index:999;-webkit-transform:translateX(0) rotateY(0) rotateX(0);transform:translateX(0) rotateY(0) rotateX(0)}50%{z-index:-1;-webkit-transform:translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);transform:translateX(-105%) rotateY(35deg) rotateX(10deg) translateZ(-10px)}80%{opacity:1}100%{z-index:-1;-webkit-transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);opacity:0}}@-webkit-keyframes browseOutRight{0%{z-index:999;-webkit-transform:translateX(0) rotateY(0) rotateX(0);transform:translateX(0) rotateY(0) rotateX(0)}50%{z-index:1;-webkit-transform:translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);transform:translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px)}80%{opacity:1}100%{z-index:1;-webkit-transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);opacity:0}}@keyframes browseOutRight{0%{z-index:999;-webkit-transform:translateX(0) rotateY(0) rotateX(0);transform:translateX(0) rotateY(0) rotateX(0)}50%{z-index:1;-webkit-transform:translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px);transform:translateX(105%) rotateY(35deg) rotateX(10deg) translateZ(-10px)}80%{opacity:1}100%{z-index:1;-webkit-transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);transform:translateX(0) rotateY(0) rotateX(0) translateZ(-10px);opacity:0}}.drop.transition{-webkit-transform-origin:top center;transform-origin:top center;-webkit-animation-duration:.4s;animation-duration:.4s;-webkit-animation-timing-function:cubic-bezier(.34,1.61,.7,1);animation-timing-function:cubic-bezier(.34,1.61,.7,1)}.drop.transition.in{-webkit-animation-name:dropIn;animation-name:dropIn}.drop.transition.out{-webkit-animation-name:dropOut;animation-name:dropOut}@-webkit-keyframes dropIn{0%{opacity:0;-webkit-transform:scale(0);transform:scale(0)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes dropIn{0%{opacity:0;-webkit-transform:scale(0);transform:scale(0)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes dropOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(0);transform:scale(0)}}@keyframes dropOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(0);transform:scale(0)}}.transition.fade.in{-webkit-animation-name:fadeIn;animation-name:fadeIn}.transition[class*="fade up"].in{-webkit-animation-name:fadeInUp;animation-name:fadeInUp}.transition[class*="fade down"].in{-webkit-animation-name:fadeInDown;animation-name:fadeInDown}.transition[class*="fade left"].in{-webkit-animation-name:fadeInLeft;animation-name:fadeInLeft}.transition[class*="fade right"].in{-webkit-animation-name:fadeInRight;animation-name:fadeInRight}.transition.fade.out{-webkit-animation-name:fadeOut;animation-name:fadeOut}.transition[class*="fade up"].out{-webkit-animation-name:fadeOutUp;animation-name:fadeOutUp}.transition[class*="fade down"].out{-webkit-animation-name:fadeOutDown;animation-name:fadeOutDown}.transition[class*="fade left"].out{-webkit-animation-name:fadeOutLeft;animation-name:fadeOutLeft}.transition[class*="fade right"].out{-webkit-animation-name:fadeOutRight;animation-name:fadeOutRight}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}@-webkit-keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(10%);transform:translateY(10%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInUp{0%{opacity:0;-webkit-transform:translateY(10%);transform:translateY(10%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-10%);transform:translateY(-10%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInDown{0%{opacity:0;-webkit-transform:translateY(-10%);transform:translateY(-10%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(10%);transform:translateX(10%)}100%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes fadeInLeft{0%{opacity:0;-webkit-transform:translateX(10%);transform:translateX(10%)}100%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(-10%);transform:translateX(-10%)}100%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@keyframes fadeInRight{0%{opacity:0;-webkit-transform:translateX(-10%);transform:translateX(-10%)}100%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}}@-webkit-keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@keyframes fadeOut{0%{opacity:1}100%{opacity:0}}@-webkit-keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(5%);transform:translateY(5%)}}@keyframes fadeOutUp{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(5%);transform:translateY(5%)}}@-webkit-keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(-5%);transform:translateY(-5%)}}@keyframes fadeOutDown{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0;-webkit-transform:translateY(-5%);transform:translateY(-5%)}}@-webkit-keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(5%);transform:translateX(5%)}}@keyframes fadeOutLeft{0%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(5%);transform:translateX(5%)}}@-webkit-keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(-5%);transform:translateX(-5%)}}@keyframes fadeOutRight{0%{opacity:1;-webkit-transform:translateX(0);transform:translateX(0)}100%{opacity:0;-webkit-transform:translateX(-5%);transform:translateX(-5%)}}.flip.transition.in,.flip.transition.out{-webkit-animation-duration:.6s;animation-duration:.6s}.horizontal.flip.transition.in{-webkit-animation-name:horizontalFlipIn;animation-name:horizontalFlipIn}.horizontal.flip.transition.out{-webkit-animation-name:horizontalFlipOut;animation-name:horizontalFlipOut}.vertical.flip.transition.in{-webkit-animation-name:verticalFlipIn;animation-name:verticalFlipIn}.vertical.flip.transition.out{-webkit-animation-name:verticalFlipOut;animation-name:verticalFlipOut}@-webkit-keyframes horizontalFlipIn{0%{-webkit-transform:perspective(2000px) rotateY(-90deg);transform:perspective(2000px) rotateY(-90deg);opacity:0}100%{-webkit-transform:perspective(2000px) rotateY(0);transform:perspective(2000px) rotateY(0);opacity:1}}@keyframes horizontalFlipIn{0%{-webkit-transform:perspective(2000px) rotateY(-90deg);transform:perspective(2000px) rotateY(-90deg);opacity:0}100%{-webkit-transform:perspective(2000px) rotateY(0);transform:perspective(2000px) rotateY(0);opacity:1}}@-webkit-keyframes verticalFlipIn{0%{-webkit-transform:perspective(2000px) rotateX(-90deg);transform:perspective(2000px) rotateX(-90deg);opacity:0}100%{-webkit-transform:perspective(2000px) rotateX(0);transform:perspective(2000px) rotateX(0);opacity:1}}@keyframes verticalFlipIn{0%{-webkit-transform:perspective(2000px) rotateX(-90deg);transform:perspective(2000px) rotateX(-90deg);opacity:0}100%{-webkit-transform:perspective(2000px) rotateX(0);transform:perspective(2000px) rotateX(0);opacity:1}}@-webkit-keyframes horizontalFlipOut{0%{-webkit-transform:perspective(2000px) rotateY(0);transform:perspective(2000px) rotateY(0);opacity:1}100%{-webkit-transform:perspective(2000px) rotateY(90deg);transform:perspective(2000px) rotateY(90deg);opacity:0}}@keyframes horizontalFlipOut{0%{-webkit-transform:perspective(2000px) rotateY(0);transform:perspective(2000px) rotateY(0);opacity:1}100%{-webkit-transform:perspective(2000px) rotateY(90deg);transform:perspective(2000px) rotateY(90deg);opacity:0}}@-webkit-keyframes verticalFlipOut{0%{-webkit-transform:perspective(2000px) rotateX(0);transform:perspective(2000px) rotateX(0);opacity:1}100%{-webkit-transform:perspective(2000px) rotateX(-90deg);transform:perspective(2000px) rotateX(-90deg);opacity:0}}@keyframes verticalFlipOut{0%{-webkit-transform:perspective(2000px) rotateX(0);transform:perspective(2000px) rotateX(0);opacity:1}100%{-webkit-transform:perspective(2000px) rotateX(-90deg);transform:perspective(2000px) rotateX(-90deg);opacity:0}}.scale.transition.in{-webkit-animation-name:scaleIn;animation-name:scaleIn}.scale.transition.out{-webkit-animation-name:scaleOut;animation-name:scaleOut}@-webkit-keyframes scaleIn{0%{opacity:0;-webkit-transform:scale(.8);transform:scale(.8)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes scaleIn{0%{opacity:0;-webkit-transform:scale(.8);transform:scale(.8)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes scaleOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(.9);transform:scale(.9)}}@keyframes scaleOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:0;-webkit-transform:scale(.9);transform:scale(.9)}}.transition.fly{-webkit-animation-duration:.6s;animation-duration:.6s;-webkit-transition-timing-function:cubic-bezier(.215,.61,.355,1);transition-timing-function:cubic-bezier(.215,.61,.355,1)}.transition.fly.in{-webkit-animation-name:flyIn;animation-name:flyIn}.transition[class*="fly up"].in{-webkit-animation-name:flyInUp;animation-name:flyInUp}.transition[class*="fly down"].in{-webkit-animation-name:flyInDown;animation-name:flyInDown}.transition[class*="fly left"].in{-webkit-animation-name:flyInLeft;animation-name:flyInLeft}.transition[class*="fly right"].in{-webkit-animation-name:flyInRight;animation-name:flyInRight}.transition.fly.out{-webkit-animation-name:flyOut;animation-name:flyOut}.transition[class*="fly up"].out{-webkit-animation-name:flyOutUp;animation-name:flyOutUp}.transition[class*="fly down"].out{-webkit-animation-name:flyOutDown;animation-name:flyOutDown}.transition[class*="fly left"].out{-webkit-animation-name:flyOutLeft;animation-name:flyOutLeft}.transition[class*="fly right"].out{-webkit-animation-name:flyOutRight;animation-name:flyOutRight}@-webkit-keyframes flyIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes flyIn{0%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}20%{-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}40%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}60%{opacity:1;-webkit-transform:scale3d(1.03,1.03,1.03);transform:scale3d(1.03,1.03,1.03)}80%{-webkit-transform:scale3d(.97,.97,.97);transform:scale3d(.97,.97,.97)}100%{opacity:1;-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes flyInUp{0%{opacity:0;-webkit-transform:translate3d(0,1500px,0);transform:translate3d(0,1500px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@keyframes flyInUp{0%{opacity:0;-webkit-transform:translate3d(0,1500px,0);transform:translate3d(0,1500px,0)}60%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}75%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}90%{-webkit-transform:translate3d(0,-5px,0);transform:translate3d(0,-5px,0)}100%{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}@-webkit-keyframes flyInDown{0%{opacity:0;-webkit-transform:translate3d(0,-1500px,0);transform:translate3d(0,-1500px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;transform:none}}@keyframes flyInDown{0%{opacity:0;-webkit-transform:translate3d(0,-1500px,0);transform:translate3d(0,-1500px,0)}60%{opacity:1;-webkit-transform:translate3d(0,25px,0);transform:translate3d(0,25px,0)}75%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}90%{-webkit-transform:translate3d(0,5px,0);transform:translate3d(0,5px,0)}100%{-webkit-transform:none;transform:none}}@-webkit-keyframes flyInLeft{0%{opacity:0;-webkit-transform:translate3d(1500px,0,0);transform:translate3d(1500px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes flyInLeft{0%{opacity:0;-webkit-transform:translate3d(1500px,0,0);transform:translate3d(1500px,0,0)}60%{opacity:1;-webkit-transform:translate3d(-25px,0,0);transform:translate3d(-25px,0,0)}75%{-webkit-transform:translate3d(10px,0,0);transform:translate3d(10px,0,0)}90%{-webkit-transform:translate3d(-5px,0,0);transform:translate3d(-5px,0,0)}100%{-webkit-transform:none;transform:none}}@-webkit-keyframes flyInRight{0%{opacity:0;-webkit-transform:translate3d(-1500px,0,0);transform:translate3d(-1500px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;transform:none}}@keyframes flyInRight{0%{opacity:0;-webkit-transform:translate3d(-1500px,0,0);transform:translate3d(-1500px,0,0)}60%{opacity:1;-webkit-transform:translate3d(25px,0,0);transform:translate3d(25px,0,0)}75%{-webkit-transform:translate3d(-10px,0,0);transform:translate3d(-10px,0,0)}90%{-webkit-transform:translate3d(5px,0,0);transform:translate3d(5px,0,0)}100%{-webkit-transform:none;transform:none}}@-webkit-keyframes flyOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@keyframes flyOut{20%{-webkit-transform:scale3d(.9,.9,.9);transform:scale3d(.9,.9,.9)}50%,55%{opacity:1;-webkit-transform:scale3d(1.1,1.1,1.1);transform:scale3d(1.1,1.1,1.1)}100%{opacity:0;-webkit-transform:scale3d(.3,.3,.3);transform:scale3d(.3,.3,.3)}}@-webkit-keyframes flyOutUp{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@keyframes flyOutUp{20%{-webkit-transform:translate3d(0,10px,0);transform:translate3d(0,10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,-20px,0);transform:translate3d(0,-20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,2000px,0);transform:translate3d(0,2000px,0)}}@-webkit-keyframes flyOutDown{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@keyframes flyOutDown{20%{-webkit-transform:translate3d(0,-10px,0);transform:translate3d(0,-10px,0)}40%,45%{opacity:1;-webkit-transform:translate3d(0,20px,0);transform:translate3d(0,20px,0)}100%{opacity:0;-webkit-transform:translate3d(0,-2000px,0);transform:translate3d(0,-2000px,0)}}@-webkit-keyframes flyOutRight{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@keyframes flyOutRight{20%{opacity:1;-webkit-transform:translate3d(20px,0,0);transform:translate3d(20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(-2000px,0,0);transform:translate3d(-2000px,0,0)}}@-webkit-keyframes flyOutLeft{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}@keyframes flyOutLeft{20%{opacity:1;-webkit-transform:translate3d(-20px,0,0);transform:translate3d(-20px,0,0)}100%{opacity:0;-webkit-transform:translate3d(2000px,0,0);transform:translate3d(2000px,0,0)}}.transition.slide.in,.transition[class*="slide down"].in{-webkit-animation-name:slideInY;animation-name:slideInY;-webkit-transform-origin:top center;transform-origin:top center}.transition[class*="slide up"].in{-webkit-animation-name:slideInY;animation-name:slideInY;-webkit-transform-origin:bottom center;transform-origin:bottom center}.transition[class*="slide left"].in{-webkit-animation-name:slideInX;animation-name:slideInX;-webkit-transform-origin:right center;transform-origin:right center}.transition[class*="slide right"].in{-webkit-animation-name:slideInX;animation-name:slideInX;-webkit-transform-origin:left center;transform-origin:left center}.transition.slide.out,.transition[class*="slide down"].out{-webkit-animation-name:slideOutY;animation-name:slideOutY;-webkit-transform-origin:top center;transform-origin:top center}.transition[class*="slide up"].out{-webkit-animation-name:slideOutY;animation-name:slideOutY;-webkit-transform-origin:bottom center;transform-origin:bottom center}.transition[class*="slide left"].out{-webkit-animation-name:slideOutX;animation-name:slideOutX;-webkit-transform-origin:right center;transform-origin:right center}.transition[class*="slide right"].out{-webkit-animation-name:slideOutX;animation-name:slideOutX;-webkit-transform-origin:left center;transform-origin:left center}@-webkit-keyframes slideInY{0%{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}100%{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}}@keyframes slideInY{0%{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}100%{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}}@-webkit-keyframes slideInX{0%{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}100%{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}}@keyframes slideInX{0%{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}100%{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}}@-webkit-keyframes slideOutY{0%{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}100%{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}}@keyframes slideOutY{0%{opacity:1;-webkit-transform:scaleY(1);transform:scaleY(1)}100%{opacity:0;-webkit-transform:scaleY(0);transform:scaleY(0)}}@-webkit-keyframes slideOutX{0%{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}100%{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}}@keyframes slideOutX{0%{opacity:1;-webkit-transform:scaleX(1);transform:scaleX(1)}100%{opacity:0;-webkit-transform:scaleX(0);transform:scaleX(0)}}.transition.swing{-webkit-animation-duration:.8s;animation-duration:.8s}.transition[class*="swing down"].in{-webkit-animation-name:swingInX;animation-name:swingInX;-webkit-transform-origin:top center;transform-origin:top center}.transition[class*="swing up"].in{-webkit-animation-name:swingInX;animation-name:swingInX;-webkit-transform-origin:bottom center;transform-origin:bottom center}.transition[class*="swing left"].in{-webkit-animation-name:swingInY;animation-name:swingInY;-webkit-transform-origin:right center;transform-origin:right center}.transition[class*="swing right"].in{-webkit-animation-name:swingInY;animation-name:swingInY;-webkit-transform-origin:left center;transform-origin:left center}.transition.swing.out,.transition[class*="swing down"].out{-webkit-animation-name:swingOutX;animation-name:swingOutX;-webkit-transform-origin:top center;transform-origin:top center}.transition[class*="swing up"].out{-webkit-animation-name:swingOutX;animation-name:swingOutX;-webkit-transform-origin:bottom center;transform-origin:bottom center}.transition[class*="swing left"].out{-webkit-animation-name:swingOutY;animation-name:swingOutY;-webkit-transform-origin:right center;transform-origin:right center}.transition[class*="swing right"].out{-webkit-animation-name:swingOutY;animation-name:swingOutY;-webkit-transform-origin:left center;transform-origin:left center}@-webkit-keyframes swingInX{0%{-webkit-transform:perspective(1000px) rotateX(90deg);transform:perspective(1000px) rotateX(90deg);opacity:0}40%{-webkit-transform:perspective(1000px) rotateX(-30deg);transform:perspective(1000px) rotateX(-30deg);opacity:1}60%{-webkit-transform:perspective(1000px) rotateX(15deg);transform:perspective(1000px) rotateX(15deg)}80%{-webkit-transform:perspective(1000px) rotateX(-7.5deg);transform:perspective(1000px) rotateX(-7.5deg)}100%{-webkit-transform:perspective(1000px) rotateX(0);transform:perspective(1000px) rotateX(0)}}@keyframes swingInX{0%{-webkit-transform:perspective(1000px) rotateX(90deg);transform:perspective(1000px) rotateX(90deg);opacity:0}40%{-webkit-transform:perspective(1000px) rotateX(-30deg);transform:perspective(1000px) rotateX(-30deg);opacity:1}60%{-webkit-transform:perspective(1000px) rotateX(15deg);transform:perspective(1000px) rotateX(15deg)}80%{-webkit-transform:perspective(1000px) rotateX(-7.5deg);transform:perspective(1000px) rotateX(-7.5deg)}100%{-webkit-transform:perspective(1000px) rotateX(0);transform:perspective(1000px) rotateX(0)}}@-webkit-keyframes swingInY{0%{-webkit-transform:perspective(1000px) rotateY(-90deg);transform:perspective(1000px) rotateY(-90deg);opacity:0}40%{-webkit-transform:perspective(1000px) rotateY(30deg);transform:perspective(1000px) rotateY(30deg);opacity:1}60%{-webkit-transform:perspective(1000px) rotateY(-17.5deg);transform:perspective(1000px) rotateY(-17.5deg)}80%{-webkit-transform:perspective(1000px) rotateY(7.5deg);transform:perspective(1000px) rotateY(7.5deg)}100%{-webkit-transform:perspective(1000px) rotateY(0);transform:perspective(1000px) rotateY(0)}}@keyframes swingInY{0%{-webkit-transform:perspective(1000px) rotateY(-90deg);transform:perspective(1000px) rotateY(-90deg);opacity:0}40%{-webkit-transform:perspective(1000px) rotateY(30deg);transform:perspective(1000px) rotateY(30deg);opacity:1}60%{-webkit-transform:perspective(1000px) rotateY(-17.5deg);transform:perspective(1000px) rotateY(-17.5deg)}80%{-webkit-transform:perspective(1000px) rotateY(7.5deg);transform:perspective(1000px) rotateY(7.5deg)}100%{-webkit-transform:perspective(1000px) rotateY(0);transform:perspective(1000px) rotateY(0)}}@-webkit-keyframes swingOutX{0%{-webkit-transform:perspective(1000px) rotateX(0);transform:perspective(1000px) rotateX(0)}40%{-webkit-transform:perspective(1000px) rotateX(-7.5deg);transform:perspective(1000px) rotateX(-7.5deg)}60%{-webkit-transform:perspective(1000px) rotateX(17.5deg);transform:perspective(1000px) rotateX(17.5deg)}80%{-webkit-transform:perspective(1000px) rotateX(-30deg);transform:perspective(1000px) rotateX(-30deg);opacity:1}100%{-webkit-transform:perspective(1000px) rotateX(90deg);transform:perspective(1000px) rotateX(90deg);opacity:0}}@keyframes swingOutX{0%{-webkit-transform:perspective(1000px) rotateX(0);transform:perspective(1000px) rotateX(0)}40%{-webkit-transform:perspective(1000px) rotateX(-7.5deg);transform:perspective(1000px) rotateX(-7.5deg)}60%{-webkit-transform:perspective(1000px) rotateX(17.5deg);transform:perspective(1000px) rotateX(17.5deg)}80%{-webkit-transform:perspective(1000px) rotateX(-30deg);transform:perspective(1000px) rotateX(-30deg);opacity:1}100%{-webkit-transform:perspective(1000px) rotateX(90deg);transform:perspective(1000px) rotateX(90deg);opacity:0}}@-webkit-keyframes swingOutY{0%{-webkit-transform:perspective(1000px) rotateY(0);transform:perspective(1000px) rotateY(0)}40%{-webkit-transform:perspective(1000px) rotateY(7.5deg);transform:perspective(1000px) rotateY(7.5deg)}60%{-webkit-transform:perspective(1000px) rotateY(-10deg);transform:perspective(1000px) rotateY(-10deg)}80%{-webkit-transform:perspective(1000px) rotateY(30deg);transform:perspective(1000px) rotateY(30deg);opacity:1}100%{-webkit-transform:perspective(1000px) rotateY(-90deg);transform:perspective(1000px) rotateY(-90deg);opacity:0}}@keyframes swingOutY{0%{-webkit-transform:perspective(1000px) rotateY(0);transform:perspective(1000px) rotateY(0)}40%{-webkit-transform:perspective(1000px) rotateY(7.5deg);transform:perspective(1000px) rotateY(7.5deg)}60%{-webkit-transform:perspective(1000px) rotateY(-10deg);transform:perspective(1000px) rotateY(-10deg)}80%{-webkit-transform:perspective(1000px) rotateY(30deg);transform:perspective(1000px) rotateY(30deg);opacity:1}100%{-webkit-transform:perspective(1000px) rotateY(-90deg);transform:perspective(1000px) rotateY(-90deg);opacity:0}}.transition.zoom.in{-webkit-animation-name:zoomIn;animation-name:zoomIn}.transition.zoom.out{-webkit-animation-name:zoomOut;animation-name:zoomOut}@-webkit-keyframes zoomIn{0%{opacity:1;-webkit-transform:scale(0);transform:scale(0)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes zoomIn{0%{opacity:1;-webkit-transform:scale(0);transform:scale(0)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@-webkit-keyframes zoomOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:1;-webkit-transform:scale(0);transform:scale(0)}}@keyframes zoomOut{0%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}100%{opacity:1;-webkit-transform:scale(0);transform:scale(0)}}.flash.transition{-webkit-animation-duration:750ms;animation-duration:750ms;-webkit-animation-name:flash;animation-name:flash}.shake.transition{-webkit-animation-duration:750ms;animation-duration:750ms;-webkit-animation-name:shake;animation-name:shake}.bounce.transition{-webkit-animation-duration:750ms;animation-duration:750ms;-webkit-animation-name:bounce;animation-name:bounce}.tada.transition{-webkit-animation-duration:750ms;animation-duration:750ms;-webkit-animation-name:tada;animation-name:tada}.pulse.transition{-webkit-animation-duration:.5s;animation-duration:.5s;-webkit-animation-name:pulse;animation-name:pulse}.jiggle.transition{-webkit-animation-duration:750ms;animation-duration:750ms;-webkit-animation-name:jiggle;animation-name:jiggle}.transition.glow{-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:cubic-bezier(.19,1,.22,1);animation-timing-function:cubic-bezier(.19,1,.22,1)}.transition.glow{-webkit-animation-name:glow;animation-name:glow}@-webkit-keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@keyframes flash{0%,100%,50%{opacity:1}25%,75%{opacity:0}}@-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);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)}}@-webkit-keyframes bounce{0%,100%,20%,50%,80%{-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%,100%,20%,50%,80%{-webkit-transform:translateY(0);transform:translateY(0)}40%{-webkit-transform:translateY(-30px);transform:translateY(-30px)}60%{-webkit-transform:translateY(-15px);transform:translateY(-15px)}}@-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);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)}}@-webkit-keyframes pulse{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}50%{-webkit-transform:scale(.9);transform:scale(.9);opacity:.7}100%{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@keyframes pulse{0%{-webkit-transform:scale(1);transform:scale(1);opacity:1}50%{-webkit-transform:scale(.9);transform:scale(.9);opacity:.7}100%{-webkit-transform:scale(1);transform:scale(1);opacity:1}}@-webkit-keyframes jiggle{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(.75,1.25,1);transform:scale3d(.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@keyframes jiggle{0%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}30%{-webkit-transform:scale3d(1.25,.75,1);transform:scale3d(1.25,.75,1)}40%{-webkit-transform:scale3d(.75,1.25,1);transform:scale3d(.75,1.25,1)}50%{-webkit-transform:scale3d(1.15,.85,1);transform:scale3d(1.15,.85,1)}65%{-webkit-transform:scale3d(.95,1.05,1);transform:scale3d(.95,1.05,1)}75%{-webkit-transform:scale3d(1.05,.95,1);transform:scale3d(1.05,.95,1)}100%{-webkit-transform:scale3d(1,1,1);transform:scale3d(1,1,1)}}@-webkit-keyframes glow{0%{background-color:#fcfcfd}30%{background-color:#fff6cd}100%{background-color:#fcfcfd}}@keyframes glow{0%{background-color:#fcfcfd}30%{background-color:#fff6cd}100%{background-color:#fcfcfd}}
\ No newline at end of file
diff --git a/public/dist/components/transition.min.js b/public/dist/components/transition.min.js
new file mode 100644
index 000000000..be0df16f6
--- /dev/null
+++ b/public/dist/components/transition.min.js
@@ -0,0 +1,11 @@
+/*
+ * # Fomantic UI - 2.8.8
+ * https://github.com/fomantic/Fomantic-UI
+ * http://fomantic-ui.com/
+ *
+ * Copyright 2021 Contributors
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+!function(C,n,S,T){"use strict";C.isFunction=C.isFunction||function(n){return"function"==typeof n&&"number"!=typeof n.nodeType},n=void 0!==n&&n.Math==Math?n:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),C.fn.transition=function(){var d,r=C(this),p=r.selector||"",g=(new Date).getTime(),v=[],b=arguments,y=b[0],h=[].slice.call(arguments,1),w="string"==typeof y;return r.each(function(t){var u,s,e,c,i,a,n,o,m,f=C(this),l=this;(m={initialize:function(){u=m.get.settings.apply(l,b),c=u.className,e=u.error,i=u.metadata,o="."+u.namespace,n="module-"+u.namespace,s=f.data(n)||m,a=m.get.animationEndEvent(),!1===(w=w&&m.invoke(y))&&(m.verbose("Converted arguments into settings object",u),u.interval?m.delay(u.animate):m.animate(),m.instantiate())},instantiate:function(){m.verbose("Storing instance of module",m),s=m,f.data(n,s)},destroy:function(){m.verbose("Destroying previous module for",l),f.removeData(n)},refresh:function(){m.verbose("Refreshing display type on next animation"),delete m.displayType},forceRepaint:function(){m.verbose("Forcing element repaint");var n=f.parent(),e=f.next();0===e.length?f.detach().appendTo(n):f.detach().insertBefore(e)},repaint:function(){m.verbose("Repainting element");l.offsetWidth},delay:function(n){var e,i=m.get.animationDirection();i=i||(m.can.transition()?m.get.direction():"static"),n=n!==T?n:u.interval,e="auto"==u.reverse&&i==c.outward||1==u.reverse?(r.length-t)*u.interval:t*u.interval,m.debug("Delaying animation by",e),setTimeout(m.animate,e)},animate:function(n){if(u=n||u,!m.is.supported())return m.error(e.support),!1;if(m.debug("Preparing animation",u.animation),m.is.animating()){if(u.queue)return!u.allowRepeats&&m.has.direction()&&m.is.occurring()&&!0!==m.queuing?m.debug("Animation is currently occurring, preventing queueing same animation",u.animation):m.queue(u.animation),!1;if(!u.allowRepeats&&m.is.occurring())return m.debug("Animation is already occurring, will not execute repeated animation",u.animation),!1;m.debug("New animation started, completing previous early",u.animation),s.complete()}m.can.animate()?m.set.animating(u.animation):m.error(e.noAnimation,u.animation,l)},reset:function(){m.debug("Resetting animation to beginning conditions"),m.remove.animationCallbacks(),m.restore.conditions(),m.remove.animating()},queue:function(n){m.debug("Queueing animation of",n),m.queuing=!0,f.one(a+".queue"+o,function(){m.queuing=!1,m.repaint(),m.animate.apply(this,u)})},complete:function(n){n&&n.target===l&&n.stopPropagation(),m.debug("Animation complete",u.animation),m.remove.completeCallback(),m.remove.failSafe(),m.is.looping()||(m.is.outward()?(m.verbose("Animation is outward, hiding element"),m.restore.conditions(),m.hide()):m.is.inward()?(m.verbose("Animation is outward, showing element"),m.restore.conditions(),m.show()):(m.verbose("Static animation completed"),m.restore.conditions(),u.onComplete.call(l)))},force:{visible:function(){var n=f.attr("style"),e=m.get.userStyle(n),i=m.get.displayType(),t=e+"display: "+i+" !important;",a=f[0].style.display;return!i||"none"===a&&u.skipInlineHidden||f[0].tagName.match(/(script|link|style)/i)?(m.remove.transition(),!1):(m.verbose("Overriding default display to show element",i),f.attr("style",t),!0)},hidden:function(){var n=f.attr("style"),e=f.css("display"),i=n===T||""===n;"none"===e||m.is.hidden()?i&&f.removeAttr("style"):(m.verbose("Overriding default display to hide element"),f.css("display","none"))}},has:{direction:function(n){var i=!1;return"string"==typeof(n=n||u.animation)&&(n=n.split(" "),C.each(n,function(n,e){e!==c.inward&&e!==c.outward||(i=!0)})),i},inlineDisplay:function(){var n=f.attr("style")||"";return Array.isArray(n.match(/display.*?;/,""))}},set:{animating:function(n){m.remove.completeCallback(),n=n||u.animation;var e=m.get.animationClass(n);m.save.animation(e),m.force.visible()&&(m.remove.hidden(),m.remove.direction(),m.start.animation(e))},duration:function(n,e){!(e="number"==typeof(e=e||u.duration)?e+"ms":e)&&0!==e||(m.verbose("Setting animation duration",e),f.css({"animation-duration":e}))},direction:function(n){(n=n||m.get.direction())==c.inward?m.set.inward():m.set.outward()},looping:function(){m.debug("Transition set to loop"),f.addClass(c.looping)},hidden:function(){f.addClass(c.transition).addClass(c.hidden)},inward:function(){m.debug("Setting direction to inward"),f.removeClass(c.outward).addClass(c.inward)},outward:function(){m.debug("Setting direction to outward"),f.removeClass(c.inward).addClass(c.outward)},visible:function(){f.addClass(c.transition).addClass(c.visible)}},start:{animation:function(n){n=n||m.get.animationClass(),m.debug("Starting tween",n),f.addClass(n).one(a+".complete"+o,m.complete),u.useFailSafe&&m.add.failSafe(),m.set.duration(u.duration),u.onStart.call(l)}},save:{animation:function(n){m.cache||(m.cache={}),m.cache.animation=n},displayType:function(n){"none"!==n&&f.data(i.displayType,n)},transitionExists:function(n,e){C.fn.transition.exists[n]=e,m.verbose("Saving existence of transition",n,e)}},restore:{conditions:function(){var n=m.get.currentAnimation();n&&(f.removeClass(n),m.verbose("Removing animation class",m.cache)),m.remove.duration()}},add:{failSafe:function(){var n=m.get.duration();m.timer=setTimeout(function(){f.triggerHandler(a)},n+u.failSafeDelay),m.verbose("Adding fail safe timer",m.timer)}},remove:{animating:function(){f.removeClass(c.animating)},animationCallbacks:function(){m.remove.queueCallback(),m.remove.completeCallback()},queueCallback:function(){f.off(".queue"+o)},completeCallback:function(){f.off(".complete"+o)},display:function(){f.css("display","")},direction:function(){f.removeClass(c.inward).removeClass(c.outward)},duration:function(){f.css("animation-duration","")},failSafe:function(){m.verbose("Removing fail safe timer",m.timer),m.timer&&clearTimeout(m.timer)},hidden:function(){f.removeClass(c.hidden)},visible:function(){f.removeClass(c.visible)},looping:function(){m.debug("Transitions are no longer looping"),m.is.looping()&&(m.reset(),f.removeClass(c.looping))},transition:function(){f.removeClass(c.transition).removeClass(c.visible).removeClass(c.hidden)}},get:{settings:function(n,e,i){return"object"==typeof n?C.extend(!0,{},C.fn.transition.settings,n):"function"==typeof i?C.extend({},C.fn.transition.settings,{animation:n,onComplete:i,duration:e}):"string"==typeof e||"number"==typeof e?C.extend({},C.fn.transition.settings,{animation:n,duration:e}):"object"==typeof e?C.extend({},C.fn.transition.settings,e,{animation:n}):"function"==typeof e?C.extend({},C.fn.transition.settings,{animation:n,onComplete:e}):C.extend({},C.fn.transition.settings,{animation:n})},animationClass:function(n){var e=n||u.animation,i=m.can.transition()&&!m.has.direction()?m.get.direction()+" ":"";return c.animating+" "+c.transition+" "+i+e},currentAnimation:function(){return!(!m.cache||m.cache.animation===T)&&m.cache.animation},currentDirection:function(){return m.is.inward()?c.inward:c.outward},direction:function(){return m.is.hidden()||!m.is.visible()?c.inward:c.outward},animationDirection:function(n){var i;return"string"==typeof(n=n||u.animation)&&(n=n.split(" "),C.each(n,function(n,e){e===c.inward?i=c.inward:e===c.outward&&(i=c.outward)})),i||!1},duration:function(n){return!1===(n=n||u.duration)&&(n=f.css("animation-duration")||0),"string"==typeof n?-1 ").addClass(e).insertAfter(f)).addClass(s).removeClass(c.inward).removeClass(c.outward).addClass(c.animating).addClass(c.transition).css("animationName"),o=t.addClass(c.inward).css("animationName"),d||(d=t.attr("class",e).removeAttr("style").removeClass(c.hidden).removeClass(c.visible).show().css("display"),m.verbose("Determining final display state",d),m.save.displayType(d)),t.remove(),a!=o)m.debug("Direction exists for animation",s),r=!0;else{if("none"==a||!a)return void m.debug("No animation defined in css",s);m.debug("Static animation found",s,d),r=!1}m.save.transitionExists(s,r)}return l!==T?l:r},animate:function(){return m.can.transition()!==T}},is:{animating:function(){return f.hasClass(c.animating)},inward:function(){return f.hasClass(c.inward)},outward:function(){return f.hasClass(c.outward)},looping:function(){return f.hasClass(c.looping)},occurring:function(n){return n="."+(n=n||u.animation).replace(" ","."),0 0) {
+ module.debug('Element removed from DOM, tearing down events');
+ module.destroy();
+ }
+ });
+ }
+ });
+ },
+ resize: function() {
+ module.debug('Window resized');
+ if(settings.refreshOnResize) {
+ requestAnimationFrame(module.refresh);
+ }
+ },
+ load: function() {
+ module.debug('Page finished loading');
+ requestAnimationFrame(module.refresh);
+ },
+ // publishes scrollchange event on one scroll
+ scroll: function() {
+ if(settings.throttle) {
+ clearTimeout(module.timer);
+ module.timer = setTimeout(function() {
+ $context.triggerHandler('scrollchange' + eventNamespace, [ $context.scrollTop() ]);
+ }, settings.throttle);
+ }
+ else {
+ requestAnimationFrame(function() {
+ $context.triggerHandler('scrollchange' + eventNamespace, [ $context.scrollTop() ]);
+ });
+ }
+ },
+ // subscribes to scrollchange
+ scrollchange: function(event, scrollPosition) {
+ module.checkVisibility(scrollPosition);
+ },
+ },
+
+ precache: function(images, callback) {
+ if (!(images instanceof Array)) {
+ images = [images];
+ }
+ var
+ imagesLength = images.length,
+ loadedCounter = 0,
+ cache = [],
+ cacheImage = document.createElement('img'),
+ handleLoad = function() {
+ loadedCounter++;
+ if (loadedCounter >= images.length) {
+ if ($.isFunction(callback)) {
+ callback();
+ }
+ }
+ }
+ ;
+ while (imagesLength--) {
+ cacheImage = document.createElement('img');
+ cacheImage.onload = handleLoad;
+ cacheImage.onerror = handleLoad;
+ cacheImage.src = images[imagesLength];
+ cache.push(cacheImage);
+ }
+ },
+
+ enableCallbacks: function() {
+ module.debug('Allowing callbacks to occur');
+ disabled = false;
+ },
+
+ disableCallbacks: function() {
+ module.debug('Disabling all callbacks temporarily');
+ disabled = true;
+ },
+
+ should: {
+ trackChanges: function() {
+ if(methodInvoked) {
+ module.debug('One time query, no need to bind events');
+ return false;
+ }
+ module.debug('Callbacks being attached');
+ return true;
+ }
+ },
+
+ setup: {
+ cache: function() {
+ module.cache = {
+ occurred : {},
+ screen : {},
+ element : {},
+ };
+ },
+ image: function() {
+ var
+ src = $module.data(metadata.src)
+ ;
+ if(src) {
+ module.verbose('Lazy loading image', src);
+ settings.once = true;
+ settings.observeChanges = false;
+
+ // show when top visible
+ settings.onOnScreen = function() {
+ module.debug('Image on screen', element);
+ module.precache(src, function() {
+ module.set.image(src, function() {
+ loadedCount++;
+ if(loadedCount == moduleCount) {
+ settings.onAllLoaded.call(this);
+ }
+ settings.onLoad.call(this);
+ });
+ });
+ };
+ }
+ },
+ fixed: function() {
+ module.debug('Setting up fixed');
+ settings.once = false;
+ settings.observeChanges = false;
+ settings.initialCheck = true;
+ settings.refreshOnLoad = true;
+ if(!parameters.transition) {
+ settings.transition = false;
+ }
+ module.create.placeholder();
+ module.debug('Added placeholder', $placeholder);
+ settings.onTopPassed = function() {
+ module.debug('Element passed, adding fixed position', $module);
+ module.show.placeholder();
+ module.set.fixed();
+ if(settings.transition) {
+ if($.fn.transition !== undefined) {
+ $module.transition(settings.transition, settings.duration);
+ }
+ }
+ };
+ settings.onTopPassedReverse = function() {
+ module.debug('Element returned to position, removing fixed', $module);
+ module.hide.placeholder();
+ module.remove.fixed();
+ };
+ }
+ },
+
+ create: {
+ placeholder: function() {
+ module.verbose('Creating fixed position placeholder');
+ $placeholder = $module
+ .clone(false)
+ .css('display', 'none')
+ .addClass(className.placeholder)
+ .insertAfter($module)
+ ;
+ }
+ },
+
+ show: {
+ placeholder: function() {
+ module.verbose('Showing placeholder');
+ $placeholder
+ .css('display', 'block')
+ .css('visibility', 'hidden')
+ ;
+ }
+ },
+ hide: {
+ placeholder: function() {
+ module.verbose('Hiding placeholder');
+ $placeholder
+ .css('display', 'none')
+ .css('visibility', '')
+ ;
+ }
+ },
+
+ set: {
+ fixed: function() {
+ module.verbose('Setting element to fixed position');
+ $module
+ .addClass(className.fixed)
+ .css({
+ position : 'fixed',
+ top : settings.offset + 'px',
+ left : 'auto',
+ zIndex : settings.zIndex
+ })
+ ;
+ settings.onFixed.call(element);
+ },
+ image: function(src, callback) {
+ $module
+ .attr('src', src)
+ ;
+ if(settings.transition) {
+ if( $.fn.transition !== undefined) {
+ if($module.hasClass(className.visible)) {
+ module.debug('Transition already occurred on this image, skipping animation');
+ return;
+ }
+ $module.transition(settings.transition, settings.duration, callback);
+ }
+ else {
+ $module.fadeIn(settings.duration, callback);
+ }
+ }
+ else {
+ $module.show();
+ }
+ }
+ },
+
+ is: {
+ onScreen: function() {
+ var
+ calculations = module.get.elementCalculations()
+ ;
+ return calculations.onScreen;
+ },
+ offScreen: function() {
+ var
+ calculations = module.get.elementCalculations()
+ ;
+ return calculations.offScreen;
+ },
+ visible: function() {
+ if(module.cache && module.cache.element) {
+ return !(module.cache.element.width === 0 && module.cache.element.offset.top === 0);
+ }
+ return false;
+ },
+ verticallyScrollableContext: function() {
+ var
+ overflowY = ($context.get(0) !== window)
+ ? $context.css('overflow-y')
+ : false
+ ;
+ return (overflowY == 'auto' || overflowY == 'scroll');
+ },
+ horizontallyScrollableContext: function() {
+ var
+ overflowX = ($context.get(0) !== window)
+ ? $context.css('overflow-x')
+ : false
+ ;
+ return (overflowX == 'auto' || overflowX == 'scroll');
+ }
+ },
+
+ refresh: function() {
+ module.debug('Refreshing constants (width/height)');
+ if(settings.type == 'fixed') {
+ module.resetFixed();
+ }
+ module.reset();
+ module.save.position();
+ if(settings.checkOnRefresh) {
+ module.checkVisibility();
+ }
+ settings.onRefresh.call(element);
+ },
+
+ resetFixed: function () {
+ module.remove.fixed();
+ module.remove.occurred();
+ },
+
+ reset: function() {
+ module.verbose('Resetting all cached values');
+ if( $.isPlainObject(module.cache) ) {
+ module.cache.screen = {};
+ module.cache.element = {};
+ }
+ },
+
+ checkVisibility: function(scroll) {
+ module.verbose('Checking visibility of element', module.cache.element);
+
+ if( !disabled && module.is.visible() ) {
+
+ // save scroll position
+ module.save.scroll(scroll);
+
+ // update calculations derived from scroll
+ module.save.calculations();
+
+ // percentage
+ module.passed();
+
+ // reverse (must be first)
+ module.passingReverse();
+ module.topVisibleReverse();
+ module.bottomVisibleReverse();
+ module.topPassedReverse();
+ module.bottomPassedReverse();
+
+ // one time
+ module.onScreen();
+ module.offScreen();
+ module.passing();
+ module.topVisible();
+ module.bottomVisible();
+ module.topPassed();
+ module.bottomPassed();
+
+ // on update callback
+ if(settings.onUpdate) {
+ settings.onUpdate.call(element, module.get.elementCalculations());
+ }
+ }
+ },
+
+ passed: function(amount, newCallback) {
+ var
+ calculations = module.get.elementCalculations()
+ ;
+ // assign callback
+ if(amount && newCallback) {
+ settings.onPassed[amount] = newCallback;
+ }
+ else if(amount !== undefined) {
+ return (module.get.pixelsPassed(amount) > calculations.pixelsPassed);
+ }
+ else if(calculations.passing) {
+ $.each(settings.onPassed, function(amount, callback) {
+ if(calculations.bottomVisible || calculations.pixelsPassed > module.get.pixelsPassed(amount)) {
+ module.execute(callback, amount);
+ }
+ else if(!settings.once) {
+ module.remove.occurred(callback);
+ }
+ });
+ }
+ },
+
+ onScreen: function(newCallback) {
+ var
+ calculations = module.get.elementCalculations(),
+ callback = newCallback || settings.onOnScreen,
+ callbackName = 'onScreen'
+ ;
+ if(newCallback) {
+ module.debug('Adding callback for onScreen', newCallback);
+ settings.onOnScreen = newCallback;
+ }
+ if(calculations.onScreen) {
+ module.execute(callback, callbackName);
+ }
+ else if(!settings.once) {
+ module.remove.occurred(callbackName);
+ }
+ if(newCallback !== undefined) {
+ return calculations.onOnScreen;
+ }
+ },
+
+ offScreen: function(newCallback) {
+ var
+ calculations = module.get.elementCalculations(),
+ callback = newCallback || settings.onOffScreen,
+ callbackName = 'offScreen'
+ ;
+ if(newCallback) {
+ module.debug('Adding callback for offScreen', newCallback);
+ settings.onOffScreen = newCallback;
+ }
+ if(calculations.offScreen) {
+ module.execute(callback, callbackName);
+ }
+ else if(!settings.once) {
+ module.remove.occurred(callbackName);
+ }
+ if(newCallback !== undefined) {
+ return calculations.onOffScreen;
+ }
+ },
+
+ passing: function(newCallback) {
+ var
+ calculations = module.get.elementCalculations(),
+ callback = newCallback || settings.onPassing,
+ callbackName = 'passing'
+ ;
+ if(newCallback) {
+ module.debug('Adding callback for passing', newCallback);
+ settings.onPassing = newCallback;
+ }
+ if(calculations.passing) {
+ module.execute(callback, callbackName);
+ }
+ else if(!settings.once) {
+ module.remove.occurred(callbackName);
+ }
+ if(newCallback !== undefined) {
+ return calculations.passing;
+ }
+ },
+
+
+ topVisible: function(newCallback) {
+ var
+ calculations = module.get.elementCalculations(),
+ callback = newCallback || settings.onTopVisible,
+ callbackName = 'topVisible'
+ ;
+ if(newCallback) {
+ module.debug('Adding callback for top visible', newCallback);
+ settings.onTopVisible = newCallback;
+ }
+ if(calculations.topVisible) {
+ module.execute(callback, callbackName);
+ }
+ else if(!settings.once) {
+ module.remove.occurred(callbackName);
+ }
+ if(newCallback === undefined) {
+ return calculations.topVisible;
+ }
+ },
+
+ bottomVisible: function(newCallback) {
+ var
+ calculations = module.get.elementCalculations(),
+ callback = newCallback || settings.onBottomVisible,
+ callbackName = 'bottomVisible'
+ ;
+ if(newCallback) {
+ module.debug('Adding callback for bottom visible', newCallback);
+ settings.onBottomVisible = newCallback;
+ }
+ if(calculations.bottomVisible) {
+ module.execute(callback, callbackName);
+ }
+ else if(!settings.once) {
+ module.remove.occurred(callbackName);
+ }
+ if(newCallback === undefined) {
+ return calculations.bottomVisible;
+ }
+ },
+
+ topPassed: function(newCallback) {
+ var
+ calculations = module.get.elementCalculations(),
+ callback = newCallback || settings.onTopPassed,
+ callbackName = 'topPassed'
+ ;
+ if(newCallback) {
+ module.debug('Adding callback for top passed', newCallback);
+ settings.onTopPassed = newCallback;
+ }
+ if(calculations.topPassed) {
+ module.execute(callback, callbackName);
+ }
+ else if(!settings.once) {
+ module.remove.occurred(callbackName);
+ }
+ if(newCallback === undefined) {
+ return calculations.topPassed;
+ }
+ },
+
+ bottomPassed: function(newCallback) {
+ var
+ calculations = module.get.elementCalculations(),
+ callback = newCallback || settings.onBottomPassed,
+ callbackName = 'bottomPassed'
+ ;
+ if(newCallback) {
+ module.debug('Adding callback for bottom passed', newCallback);
+ settings.onBottomPassed = newCallback;
+ }
+ if(calculations.bottomPassed) {
+ module.execute(callback, callbackName);
+ }
+ else if(!settings.once) {
+ module.remove.occurred(callbackName);
+ }
+ if(newCallback === undefined) {
+ return calculations.bottomPassed;
+ }
+ },
+
+ passingReverse: function(newCallback) {
+ var
+ calculations = module.get.elementCalculations(),
+ callback = newCallback || settings.onPassingReverse,
+ callbackName = 'passingReverse'
+ ;
+ if(newCallback) {
+ module.debug('Adding callback for passing reverse', newCallback);
+ settings.onPassingReverse = newCallback;
+ }
+ if(!calculations.passing) {
+ if(module.get.occurred('passing')) {
+ module.execute(callback, callbackName);
+ }
+ }
+ else if(!settings.once) {
+ module.remove.occurred(callbackName);
+ }
+ if(newCallback !== undefined) {
+ return !calculations.passing;
+ }
+ },
+
+
+ topVisibleReverse: function(newCallback) {
+ var
+ calculations = module.get.elementCalculations(),
+ callback = newCallback || settings.onTopVisibleReverse,
+ callbackName = 'topVisibleReverse'
+ ;
+ if(newCallback) {
+ module.debug('Adding callback for top visible reverse', newCallback);
+ settings.onTopVisibleReverse = newCallback;
+ }
+ if(!calculations.topVisible) {
+ if(module.get.occurred('topVisible')) {
+ module.execute(callback, callbackName);
+ }
+ }
+ else if(!settings.once) {
+ module.remove.occurred(callbackName);
+ }
+ if(newCallback === undefined) {
+ return !calculations.topVisible;
+ }
+ },
+
+ bottomVisibleReverse: function(newCallback) {
+ var
+ calculations = module.get.elementCalculations(),
+ callback = newCallback || settings.onBottomVisibleReverse,
+ callbackName = 'bottomVisibleReverse'
+ ;
+ if(newCallback) {
+ module.debug('Adding callback for bottom visible reverse', newCallback);
+ settings.onBottomVisibleReverse = newCallback;
+ }
+ if(!calculations.bottomVisible) {
+ if(module.get.occurred('bottomVisible')) {
+ module.execute(callback, callbackName);
+ }
+ }
+ else if(!settings.once) {
+ module.remove.occurred(callbackName);
+ }
+ if(newCallback === undefined) {
+ return !calculations.bottomVisible;
+ }
+ },
+
+ topPassedReverse: function(newCallback) {
+ var
+ calculations = module.get.elementCalculations(),
+ callback = newCallback || settings.onTopPassedReverse,
+ callbackName = 'topPassedReverse'
+ ;
+ if(newCallback) {
+ module.debug('Adding callback for top passed reverse', newCallback);
+ settings.onTopPassedReverse = newCallback;
+ }
+ if(!calculations.topPassed) {
+ if(module.get.occurred('topPassed')) {
+ module.execute(callback, callbackName);
+ }
+ }
+ else if(!settings.once) {
+ module.remove.occurred(callbackName);
+ }
+ if(newCallback === undefined) {
+ return !calculations.onTopPassed;
+ }
+ },
+
+ bottomPassedReverse: function(newCallback) {
+ var
+ calculations = module.get.elementCalculations(),
+ callback = newCallback || settings.onBottomPassedReverse,
+ callbackName = 'bottomPassedReverse'
+ ;
+ if(newCallback) {
+ module.debug('Adding callback for bottom passed reverse', newCallback);
+ settings.onBottomPassedReverse = newCallback;
+ }
+ if(!calculations.bottomPassed) {
+ if(module.get.occurred('bottomPassed')) {
+ module.execute(callback, callbackName);
+ }
+ }
+ else if(!settings.once) {
+ module.remove.occurred(callbackName);
+ }
+ if(newCallback === undefined) {
+ return !calculations.bottomPassed;
+ }
+ },
+
+ execute: function(callback, callbackName) {
+ var
+ calculations = module.get.elementCalculations(),
+ screen = module.get.screenCalculations()
+ ;
+ callback = callback || false;
+ if(callback) {
+ if(settings.continuous) {
+ module.debug('Callback being called continuously', callbackName, calculations);
+ callback.call(element, calculations, screen);
+ }
+ else if(!module.get.occurred(callbackName)) {
+ module.debug('Conditions met', callbackName, calculations);
+ callback.call(element, calculations, screen);
+ }
+ }
+ module.save.occurred(callbackName);
+ },
+
+ remove: {
+ fixed: function() {
+ module.debug('Removing fixed position');
+ $module
+ .removeClass(className.fixed)
+ .css({
+ position : '',
+ top : '',
+ left : '',
+ zIndex : ''
+ })
+ ;
+ settings.onUnfixed.call(element);
+ },
+ placeholder: function() {
+ module.debug('Removing placeholder content');
+ if($placeholder) {
+ $placeholder.remove();
+ }
+ },
+ occurred: function(callback) {
+ if(callback) {
+ var
+ occurred = module.cache.occurred
+ ;
+ if(occurred[callback] !== undefined && occurred[callback] === true) {
+ module.debug('Callback can now be called again', callback);
+ module.cache.occurred[callback] = false;
+ }
+ }
+ else {
+ module.cache.occurred = {};
+ }
+ }
+ },
+
+ save: {
+ calculations: function() {
+ module.verbose('Saving all calculations necessary to determine positioning');
+ module.save.direction();
+ module.save.screenCalculations();
+ module.save.elementCalculations();
+ },
+ occurred: function(callback) {
+ if(callback) {
+ if(module.cache.occurred[callback] === undefined || (module.cache.occurred[callback] !== true)) {
+ module.verbose('Saving callback occurred', callback);
+ module.cache.occurred[callback] = true;
+ }
+ }
+ },
+ scroll: function(scrollPosition) {
+ scrollPosition = scrollPosition + settings.offset || $context.scrollTop() + settings.offset;
+ module.cache.scroll = scrollPosition;
+ },
+ direction: function() {
+ var
+ scroll = module.get.scroll(),
+ lastScroll = module.get.lastScroll(),
+ direction
+ ;
+ if(scroll > lastScroll && lastScroll) {
+ direction = 'down';
+ }
+ else if(scroll < lastScroll && lastScroll) {
+ direction = 'up';
+ }
+ else {
+ direction = 'static';
+ }
+ module.cache.direction = direction;
+ return module.cache.direction;
+ },
+ elementPosition: function() {
+ var
+ element = module.cache.element,
+ screen = module.get.screenSize()
+ ;
+ module.verbose('Saving element position');
+ // (quicker than $.extend)
+ element.fits = (element.height < screen.height);
+ element.offset = $module.offset();
+ element.width = $module.outerWidth();
+ element.height = $module.outerHeight();
+ // compensate for scroll in context
+ if(module.is.verticallyScrollableContext()) {
+ element.offset.top += $context.scrollTop() - $context.offset().top;
+ }
+ if(module.is.horizontallyScrollableContext()) {
+ element.offset.left += $context.scrollLeft() - $context.offset().left;
+ }
+ // store
+ module.cache.element = element;
+ return element;
+ },
+ elementCalculations: function() {
+ var
+ screen = module.get.screenCalculations(),
+ element = module.get.elementPosition()
+ ;
+ // offset
+ if(settings.includeMargin) {
+ element.margin = {};
+ element.margin.top = parseInt($module.css('margin-top'), 10);
+ element.margin.bottom = parseInt($module.css('margin-bottom'), 10);
+ element.top = element.offset.top - element.margin.top;
+ element.bottom = element.offset.top + element.height + element.margin.bottom;
+ }
+ else {
+ element.top = element.offset.top;
+ element.bottom = element.offset.top + element.height;
+ }
+
+ // visibility
+ element.topPassed = (screen.top >= element.top);
+ element.bottomPassed = (screen.top >= element.bottom);
+ element.topVisible = (screen.bottom >= element.top) && !element.topPassed;
+ element.bottomVisible = (screen.bottom >= element.bottom) && !element.bottomPassed;
+ element.pixelsPassed = 0;
+ element.percentagePassed = 0;
+
+ // meta calculations
+ element.onScreen = ((element.topVisible || element.passing) && !element.bottomPassed);
+ element.passing = (element.topPassed && !element.bottomPassed);
+ element.offScreen = (!element.onScreen);
+
+ // passing calculations
+ if(element.passing) {
+ element.pixelsPassed = (screen.top - element.top);
+ element.percentagePassed = (screen.top - element.top) / element.height;
+ }
+ module.cache.element = element;
+ module.verbose('Updated element calculations', element);
+ return element;
+ },
+ screenCalculations: function() {
+ var
+ scroll = module.get.scroll()
+ ;
+ module.save.direction();
+ module.cache.screen.top = scroll;
+ module.cache.screen.bottom = scroll + module.cache.screen.height;
+ return module.cache.screen;
+ },
+ screenSize: function() {
+ module.verbose('Saving window position');
+ module.cache.screen = {
+ height: $context.height()
+ };
+ },
+ position: function() {
+ module.save.screenSize();
+ module.save.elementPosition();
+ }
+ },
+
+ get: {
+ pixelsPassed: function(amount) {
+ var
+ element = module.get.elementCalculations()
+ ;
+ if(amount.search('%') > -1) {
+ return ( element.height * (parseInt(amount, 10) / 100) );
+ }
+ return parseInt(amount, 10);
+ },
+ occurred: function(callback) {
+ return (module.cache.occurred !== undefined)
+ ? module.cache.occurred[callback] || false
+ : false
+ ;
+ },
+ direction: function() {
+ if(module.cache.direction === undefined) {
+ module.save.direction();
+ }
+ return module.cache.direction;
+ },
+ elementPosition: function() {
+ if(module.cache.element === undefined) {
+ module.save.elementPosition();
+ }
+ return module.cache.element;
+ },
+ elementCalculations: function() {
+ if(module.cache.element === undefined) {
+ module.save.elementCalculations();
+ }
+ return module.cache.element;
+ },
+ screenCalculations: function() {
+ if(module.cache.screen === undefined) {
+ module.save.screenCalculations();
+ }
+ return module.cache.screen;
+ },
+ screenSize: function() {
+ if(module.cache.screen === undefined) {
+ module.save.screenSize();
+ }
+ return module.cache.screen;
+ },
+ scroll: function() {
+ if(module.cache.scroll === undefined) {
+ module.save.scroll();
+ }
+ return module.cache.scroll;
+ },
+ lastScroll: function() {
+ if(module.cache.screen === undefined) {
+ module.debug('First scroll event, no last scroll could be found');
+ return false;
+ }
+ return module.cache.screen.top;
+ }
+ },
+
+ setting: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ settings[name] = value;
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ module.error(error.method, query);
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ instance.save.scroll();
+ instance.save.calculations();
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ }
+ })
+ ;
+
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.fn.visibility.settings = {
+
+ name : 'Visibility',
+ namespace : 'visibility',
+
+ debug : false,
+ verbose : false,
+ performance : true,
+
+ // whether to use mutation observers to follow changes
+ observeChanges : true,
+
+ // check position immediately on init
+ initialCheck : true,
+
+ // whether to refresh calculations after all page images load
+ refreshOnLoad : true,
+
+ // whether to refresh calculations after page resize event
+ refreshOnResize : true,
+
+ // should call callbacks on refresh event (resize, etc)
+ checkOnRefresh : true,
+
+ // callback should only occur one time
+ once : true,
+
+ // callback should fire continuously whe evaluates to true
+ continuous : false,
+
+ // offset to use with scroll top
+ offset : 0,
+
+ // whether to include margin in elements position
+ includeMargin : false,
+
+ // scroll context for visibility checks
+ context : window,
+
+ // visibility check delay in ms (defaults to animationFrame)
+ throttle : false,
+
+ // special visibility type (image, fixed)
+ type : false,
+
+ // z-index to use with visibility 'fixed'
+ zIndex : '10',
+
+ // image only animation settings
+ transition : 'fade in',
+ duration : 1000,
+
+ // array of callbacks for percentage
+ onPassed : {},
+
+ // standard callbacks
+ onOnScreen : false,
+ onOffScreen : false,
+ onPassing : false,
+ onTopVisible : false,
+ onBottomVisible : false,
+ onTopPassed : false,
+ onBottomPassed : false,
+
+ // reverse callbacks
+ onPassingReverse : false,
+ onTopVisibleReverse : false,
+ onBottomVisibleReverse : false,
+ onTopPassedReverse : false,
+ onBottomPassedReverse : false,
+
+ // special callbacks for image
+ onLoad : function() {},
+ onAllLoaded : function() {},
+
+ // special callbacks for fixed position
+ onFixed : function() {},
+ onUnfixed : function() {},
+
+ // utility callbacks
+ onUpdate : false, // disabled by default for performance
+ onRefresh : function(){},
+
+ metadata : {
+ src: 'src'
+ },
+
+ className: {
+ fixed : 'fixed',
+ placeholder : 'constraint',
+ visible : 'visible'
+ },
+
+ error : {
+ method : 'The method you called is not defined.',
+ visible : 'Element is hidden, you must call refresh after element becomes visible'
+ }
+
+};
+
+})( jQuery, window, document );
diff --git a/public/dist/components/visibility.min.js b/public/dist/components/visibility.min.js
new file mode 100644
index 000000000..bdcc29cd6
--- /dev/null
+++ b/public/dist/components/visibility.min.js
@@ -0,0 +1,11 @@
+/*
+ * # Fomantic UI - 2.8.8
+ * https://github.com/fomantic/Fomantic-UI
+ * http://fomantic-ui.com/
+ *
+ * Copyright 2021 Contributors
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+!function(O,z,A,w){"use strict";O.isFunction=O.isFunction||function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},z=void 0!==z&&z.Math==Math?z:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),O.fn.visibility=function(h){var P,e=O(this),x=e.selector||"",y=(new Date).getTime(),C=[],S=h,R="string"==typeof S,V=[].slice.call(arguments,1),k=e.length,T=0;return e.each(function(){var e,o,n,r,i=O.isPlainObject(h)?O.extend(!0,{},O.fn.visibility.settings,h):O.extend({},O.fn.visibility.settings),t=i.className,s=i.namespace,a=i.error,c=i.metadata,l="."+s,d="module-"+s,u=O(z),f=O(this),b=O(i.context),g=f.data(d),m=z.requestAnimationFrame||z.mozRequestAnimationFrame||z.webkitRequestAnimationFrame||z.msRequestAnimationFrame||function(e){setTimeout(e,0)},p=this,v=!1;r={initialize:function(){r.debug("Initializing",i),r.setup.cache(),r.should.trackChanges()&&("image"==i.type&&r.setup.image(),"fixed"==i.type&&r.setup.fixed(),i.observeChanges&&r.observeChanges(),r.bind.events()),r.save.position(),r.is.visible()||r.error(a.visible,f),i.initialCheck&&r.checkVisibility(),r.instantiate()},instantiate:function(){r.debug("Storing instance",r),f.data(d,r),g=r},destroy:function(){r.verbose("Destroying previous module"),n&&n.disconnect(),o&&o.disconnect(),u.off("load"+l,r.event.load).off("resize"+l,r.event.resize),b.off("scroll"+l,r.event.scroll).off("scrollchange"+l,r.event.scrollchange),"fixed"==i.type&&(r.resetFixed(),r.remove.placeholder()),f.off(l).removeData(d)},observeChanges:function(){"MutationObserver"in z&&(o=new MutationObserver(r.event.contextChanged),n=new MutationObserver(r.event.changed),o.observe(A,{childList:!0,subtree:!0}),n.observe(p,{childList:!0,subtree:!0}),r.debug("Setting up mutation observer",n))},bind:{events:function(){r.verbose("Binding visibility events to scroll and resize"),i.refreshOnLoad&&u.on("load"+l,r.event.load),u.on("resize"+l,r.event.resize),b.off("scroll"+l).on("scroll"+l,r.event.scroll).on("scrollchange"+l,r.event.scrollchange)}},event:{changed:function(e){r.verbose("DOM tree modified, updating visibility calculations"),r.timer=setTimeout(function(){r.verbose("DOM tree modified, updating sticky menu"),r.refresh()},100)},contextChanged:function(e){[].forEach.call(e,function(e){e.removedNodes&&[].forEach.call(e.removedNodes,function(e){(e==p||0=e.length&&O.isFunction(o)&&o()};n--;)(s=A.createElement("img")).onload=c,s.onerror=c,s.src=e[n],i.push(s)},enableCallbacks:function(){r.debug("Allowing callbacks to occur"),v=!1},disableCallbacks:function(){r.debug("Disabling all callbacks temporarily"),v=!0},should:{trackChanges:function(){return R?(r.debug("One time query, no need to bind events"),!1):(r.debug("Callbacks being attached"),!0)}},setup:{cache:function(){r.cache={occurred:{},screen:{},element:{}}},image:function(){var e=f.data(c.src);e&&(r.verbose("Lazy loading image",e),i.once=!0,i.observeChanges=!1,i.onOnScreen=function(){r.debug("Image on screen",p),r.precache(e,function(){r.set.image(e,function(){++T==k&&i.onAllLoaded.call(this),i.onLoad.call(this)})})})},fixed:function(){r.debug("Setting up fixed"),i.once=!1,i.observeChanges=!1,i.initialCheck=!0,i.refreshOnLoad=!0,h.transition||(i.transition=!1),r.create.placeholder(),r.debug("Added placeholder",e),i.onTopPassed=function(){r.debug("Element passed, adding fixed position",f),r.show.placeholder(),r.set.fixed(),i.transition&&O.fn.transition!==w&&f.transition(i.transition,i.duration)},i.onTopPassedReverse=function(){r.debug("Element returned to position, removing fixed",f),r.hide.placeholder(),r.remove.fixed()}}},create:{placeholder:function(){r.verbose("Creating fixed position placeholder"),e=f.clone(!1).css("display","none").addClass(t.placeholder).insertAfter(f)}},show:{placeholder:function(){r.verbose("Showing placeholder"),e.css("display","block").css("visibility","hidden")}},hide:{placeholder:function(){r.verbose("Hiding placeholder"),e.css("display","none").css("visibility","")}},set:{fixed:function(){r.verbose("Setting element to fixed position"),f.addClass(t.fixed).css({position:"fixed",top:i.offset+"px",left:"auto",zIndex:i.zIndex}),i.onFixed.call(p)},image:function(e,o){if(f.attr("src",e),i.transition)if(O.fn.transition!==w){if(f.hasClass(t.visible))return void r.debug("Transition already occurred on this image, skipping animation");f.transition(i.transition,i.duration,o)}else f.fadeIn(i.duration,o);else f.show()}},is:{onScreen:function(){return r.get.elementCalculations().onScreen},offScreen:function(){return r.get.elementCalculations().offScreen},visible:function(){return!(!r.cache||!r.cache.element)&&!(0===r.cache.element.width&&0===r.cache.element.offset.top)},verticallyScrollableContext:function(){var e=b.get(0)!==z&&b.css("overflow-y");return"auto"==e||"scroll"==e},horizontallyScrollableContext:function(){var e=b.get(0)!==z&&b.css("overflow-x");return"auto"==e||"scroll"==e}},refresh:function(){r.debug("Refreshing constants (width/height)"),"fixed"==i.type&&r.resetFixed(),r.reset(),r.save.position(),i.checkOnRefresh&&r.checkVisibility(),i.onRefresh.call(p)},resetFixed:function(){r.remove.fixed(),r.remove.occurred()},reset:function(){r.verbose("Resetting all cached values"),O.isPlainObject(r.cache)&&(r.cache.screen={},r.cache.element={})},checkVisibility:function(e){r.verbose("Checking visibility of element",r.cache.element),!v&&r.is.visible()&&(r.save.scroll(e),r.save.calculations(),r.passed(),r.passingReverse(),r.topVisibleReverse(),r.bottomVisibleReverse(),r.topPassedReverse(),r.bottomPassedReverse(),r.onScreen(),r.offScreen(),r.passing(),r.topVisible(),r.bottomVisible(),r.topPassed(),r.bottomPassed(),i.onUpdate&&i.onUpdate.call(p,r.get.elementCalculations()))},passed:function(e,o){var n=r.get.elementCalculations();if(e&&o)i.onPassed[e]=o;else{if(e!==w)return r.get.pixelsPassed(e)>n.pixelsPassed;n.passing&&O.each(i.onPassed,function(e,o){n.bottomVisible||n.pixelsPassed>r.get.pixelsPassed(e)?r.execute(o,e):i.once||r.remove.occurred(o)})}},onScreen:function(e){var o=r.get.elementCalculations(),n=e||i.onOnScreen,t="onScreen";if(e&&(r.debug("Adding callback for onScreen",e),i.onOnScreen=e),o.onScreen?r.execute(n,t):i.once||r.remove.occurred(t),e!==w)return o.onOnScreen},offScreen:function(e){var o=r.get.elementCalculations(),n=e||i.onOffScreen,t="offScreen";if(e&&(r.debug("Adding callback for offScreen",e),i.onOffScreen=e),o.offScreen?r.execute(n,t):i.once||r.remove.occurred(t),e!==w)return o.onOffScreen},passing:function(e){var o=r.get.elementCalculations(),n=e||i.onPassing,t="passing";if(e&&(r.debug("Adding callback for passing",e),i.onPassing=e),o.passing?r.execute(n,t):i.once||r.remove.occurred(t),e!==w)return o.passing},topVisible:function(e){var o=r.get.elementCalculations(),n=e||i.onTopVisible,t="topVisible";if(e&&(r.debug("Adding callback for top visible",e),i.onTopVisible=e),o.topVisible?r.execute(n,t):i.once||r.remove.occurred(t),e===w)return o.topVisible},bottomVisible:function(e){var o=r.get.elementCalculations(),n=e||i.onBottomVisible,t="bottomVisible";if(e&&(r.debug("Adding callback for bottom visible",e),i.onBottomVisible=e),o.bottomVisible?r.execute(n,t):i.once||r.remove.occurred(t),e===w)return o.bottomVisible},topPassed:function(e){var o=r.get.elementCalculations(),n=e||i.onTopPassed,t="topPassed";if(e&&(r.debug("Adding callback for top passed",e),i.onTopPassed=e),o.topPassed?r.execute(n,t):i.once||r.remove.occurred(t),e===w)return o.topPassed},bottomPassed:function(e){var o=r.get.elementCalculations(),n=e||i.onBottomPassed,t="bottomPassed";if(e&&(r.debug("Adding callback for bottom passed",e),i.onBottomPassed=e),o.bottomPassed?r.execute(n,t):i.once||r.remove.occurred(t),e===w)return o.bottomPassed},passingReverse:function(e){var o=r.get.elementCalculations(),n=e||i.onPassingReverse,t="passingReverse";if(e&&(r.debug("Adding callback for passing reverse",e),i.onPassingReverse=e),o.passing?i.once||r.remove.occurred(t):r.get.occurred("passing")&&r.execute(n,t),e!==w)return!o.passing},topVisibleReverse:function(e){var o=r.get.elementCalculations(),n=e||i.onTopVisibleReverse,t="topVisibleReverse";if(e&&(r.debug("Adding callback for top visible reverse",e),i.onTopVisibleReverse=e),o.topVisible?i.once||r.remove.occurred(t):r.get.occurred("topVisible")&&r.execute(n,t),e===w)return!o.topVisible},bottomVisibleReverse:function(e){var o=r.get.elementCalculations(),n=e||i.onBottomVisibleReverse,t="bottomVisibleReverse";if(e&&(r.debug("Adding callback for bottom visible reverse",e),i.onBottomVisibleReverse=e),o.bottomVisible?i.once||r.remove.occurred(t):r.get.occurred("bottomVisible")&&r.execute(n,t),e===w)return!o.bottomVisible},topPassedReverse:function(e){var o=r.get.elementCalculations(),n=e||i.onTopPassedReverse,t="topPassedReverse";if(e&&(r.debug("Adding callback for top passed reverse",e),i.onTopPassedReverse=e),o.topPassed?i.once||r.remove.occurred(t):r.get.occurred("topPassed")&&r.execute(n,t),e===w)return!o.onTopPassed},bottomPassedReverse:function(e){var o=r.get.elementCalculations(),n=e||i.onBottomPassedReverse,t="bottomPassedReverse";if(e&&(r.debug("Adding callback for bottom passed reverse",e),i.onBottomPassedReverse=e),o.bottomPassed?i.once||r.remove.occurred(t):r.get.occurred("bottomPassed")&&r.execute(n,t),e===w)return!o.bottomPassed},execute:function(e,o){var n=r.get.elementCalculations(),t=r.get.screenCalculations();(e=e||!1)&&(i.continuous?(r.debug("Callback being called continuously",o,n),e.call(p,n,t)):r.get.occurred(o)||(r.debug("Conditions met",o,n),e.call(p,n,t))),r.save.occurred(o)},remove:{fixed:function(){r.debug("Removing fixed position"),f.removeClass(t.fixed).css({position:"",top:"",left:"",zIndex:""}),i.onUnfixed.call(p)},placeholder:function(){r.debug("Removing placeholder content"),e&&e.remove()},occurred:function(e){if(e){var o=r.cache.occurred;o[e]!==w&&!0===o[e]&&(r.debug("Callback can now be called again",e),r.cache.occurred[e]=!1)}else r.cache.occurred={}}},save:{calculations:function(){r.verbose("Saving all calculations necessary to determine positioning"),r.save.direction(),r.save.screenCalculations(),r.save.elementCalculations()},occurred:function(e){e&&(r.cache.occurred[e]!==w&&!0===r.cache.occurred[e]||(r.verbose("Saving callback occurred",e),r.cache.occurred[e]=!0))},scroll:function(e){e=e+i.offset||b.scrollTop()+i.offset,r.cache.scroll=e},direction:function(){var e,o=r.get.scroll(),n=r.get.lastScroll();return e=n=o.top,o.bottomPassed=e.top>=o.bottom,o.topVisible=e.bottom>=o.top&&!o.topPassed,o.bottomVisible=e.bottom>=o.bottom&&!o.bottomPassed,o.pixelsPassed=0,o.percentagePassed=0,o.onScreen=(o.topVisible||o.passing)&&!o.bottomPassed,o.passing=o.topPassed&&!o.bottomPassed,o.offScreen=!o.onScreen,o.passing&&(o.pixelsPassed=e.top-o.top,o.percentagePassed=(e.top-o.top)/o.height),r.cache.element=o,r.verbose("Updated element calculations",o),o},screenCalculations:function(){var e=r.get.scroll();return r.save.direction(),r.cache.screen.top=e,r.cache.screen.bottom=e+r.cache.screen.height,r.cache.screen},screenSize:function(){r.verbose("Saving window position"),r.cache.screen={height:b.height()}},position:function(){r.save.screenSize(),r.save.elementPosition()}},get:{pixelsPassed:function(e){var o=r.get.elementCalculations();return-1 .item, .ui.mini.buttons .button, .ui.mini.buttons .or, .ui.ui.ui.ui.mini.button {
+ font-size: 0.78571429rem;
+ max-height: 1em;
+ text-align: center;
+ line-height: 0.25em;
+}
+
+.ui.tiny.buttons .dropdown, .ui.tiny.buttons .dropdown .menu > .item, .ui.tiny.buttons .button, .ui.tiny.buttons .or, .ui.ui.ui.ui.tiny.button {
+ font-size: 0.85714286rem;
+}
+
+.ui.small.buttons .dropdown, .ui.small.buttons .dropdown .menu > .item, .ui.small.buttons .button, .ui.small.buttons .or, .ui.ui.ui.ui.small.button {
+ font-size: 0.92857143rem;
+}
+
+.ui.large.buttons .dropdown, .ui.large.buttons .dropdown .menu > .item, .ui.large.buttons .button, .ui.large.buttons .or, .ui.ui.ui.ui.large.button {
+ font-size: 1.14285714rem;
+}
+
+.ui.big.buttons .dropdown, .ui.big.buttons .dropdown .menu > .item, .ui.big.buttons .button, .ui.big.buttons .or, .ui.ui.ui.ui.big.button {
+ font-size: 1.28571429rem;
+}
+
+.ui.huge.buttons .dropdown, .ui.huge.buttons .dropdown .menu > .item, .ui.huge.buttons .button, .ui.huge.buttons .or, .ui.ui.ui.ui.huge.button {
+ font-size: 1.42857143rem;
+}
+
+.ui.massive.buttons .dropdown, .ui.massive.buttons .dropdown .menu > .item, .ui.massive.buttons .button, .ui.massive.buttons .or, .ui.ui.ui.ui.massive.button {
+ font-size: 1.71428571rem;
+}
+
+/* Right Labeled */
+.ui[class*="right labeled"].icon.button {
+ padding-right: 4.07142857em !important;
+ padding-left: 1.5em !important;
+}
+
+.ui[class*="right labeled"].icon.button > .icon {
+ left: auto;
+ right: 0;
+ border-radius: 0;
+ border-top-right-radius: inherit;
+ border-bottom-right-radius: inherit;
+ -webkit-box-shadow: 1px 0 0 0 transparent inset;
+ box-shadow: 1px 0 0 0 transparent inset;
+}
+
+.ui.labeled.icon.buttons > .button > .icon:before, .ui.labeled.icon.button > .icon:before, .ui.labeled.icon.buttons > .button > .icon:after, .ui.labeled.icon.button > .icon:after {
+ display: block;
+ position: relative;
+ width: 100%;
+ top: 0;
+ text-align: center;
+}
+
+.ui.labeled.icon.buttons .button > .icon {
+ border-radius: 0;
+}
+
+.ui.labeled.icon.buttons .button:first-child > .icon {
+ border-top-left-radius: 0.28571429rem;
+ border-bottom-left-radius: 0.28571429rem;
+}
+
+.ui.labeled.icon.buttons .button:last-child > .icon {
+ border-top-right-radius: 0.28571429rem;
+ border-bottom-right-radius: 0.28571429rem;
+}
+
+.ui.vertical.labeled.icon.buttons .button:first-child > .icon {
+ border-radius: 0;
+ border-top-left-radius: 0.28571429rem;
+}
+
+.ui.vertical.labeled.icon.buttons .button:last-child > .icon {
+ border-radius: 0;
+ border-bottom-left-radius: 0.28571429rem;
+}
+
+.ui[class*="left attached"].buttons .button:last-child {
+ margin-left: -1px;
+ border-radius: 0 0 0.28571429rem 0;
+}
+
+.ui[class*="right attached"].buttons {
+ display: -webkit-inline-box;
+ display: -ms-inline-flexbox;
+ display: inline-flex;
+ margin-left: 0;
+ margin-right: -1px;
+ border-radius: 0.28571429rem 0 0 0.28571429rem;
+}
+
+.ui[class*="right attached"].buttons .button:first-child {
+ margin-left: -1px;
+ border-radius: 0.28571429rem 0 0 0;
+}
+
+.ui[class*="right attached"].buttons .button:last-child {
+ margin-left: -1px;
+ border-radius: 0 0 0 0.28571429rem;
+}
+
+
+
+i.flag.py:before, i.flag.paraguay:before {
+ background-position: -72px -754px;
+}
+
+i.flag.qa:before, i.flag.qatar:before {
+ background-position: -72px -780px;
+}
+
+i.flag.re:before, i.flag.reunion:before {
+ background-position: -72px -806px;
+}
+
+i.flag.ro:before, i.flag.romania:before {
+ background-position: -72px -832px;
+}
+
+i.flag.rs:before, i.flag.serbia:before {
+ background-position: -72px -858px;
+}
+
+i.flag.ru:before, i.flag.russia:before {
+ background-position: -72px -884px;
+}
+
+i.flag.rw:before, i.flag.rwanda:before {
+ background-position: -72px -910px;
+}
+
+i.flag.sa:before, i.flag.saudi.arabia:before {
+ background-position: -72px -936px;
+}
+
+i.flag.sb:before, i.flag.solomon.islands:before {
+ background-position: -72px -962px;
+}
+
+i.flag.sc:before, i.flag.seychelles:before {
+ background-position: -72px -988px;
+}
+
+i.flag.gb.sct:before, i.flag.scotland:before {
+ background-position: -72px -1014px;
+}
+
+i.flag.sd:before, i.flag.sudan:before {
+ background-position: -72px -1040px;
+}
+
+i.flag.se:before, i.flag.sweden:before {
+ background-position: -72px -1066px;
+}
+
+i.flag.sg:before, i.flag.singapore:before {
+ background-position: -72px -1092px;
+}
+
+i.flag.sh:before, i.flag.saint.helena:before {
+ background-position: -72px -1118px;
+}
+
+i.flag.si:before, i.flag.slovenia:before {
+ background-position: -72px -1144px;
+}
+
+i.flag.sj:before, i.flag.svalbard:before, i.flag.jan.mayen:before {
+ background-position: -72px -1170px;
+}
+
+i.flag.sk:before, i.flag.slovakia:before {
+ background-position: -72px -1196px;
+}
+
+i.flag.sl:before, i.flag.sierra.leone:before {
+ background-position: -72px -1222px;
+}
+
+i.flag.sm:before, i.flag.san.marino:before {
+ background-position: -72px -1248px;
+}
+
+i.flag.sn:before, i.flag.senegal:before {
+ background-position: -72px -1274px;
+}
+
+i.flag.so:before, i.flag.somalia:before {
+ background-position: -72px -1300px;
+}
+
+i.flag.sr:before, i.flag.suriname:before {
+ background-position: -72px -1326px;
+}
+
+i.flag.st:before, i.flag.sao.tome:before {
+ background-position: -72px -1352px;
+}
+
+i.flag.sv:before, i.flag.el.salvador:before {
+ background-position: -72px -1378px;
+}
+
+i.flag.sy:before, i.flag.syria:before {
+ background-position: -72px -1404px;
+}
+
+i.flag.sz:before, i.flag.swaziland:before {
+ background-position: -72px -1430px;
+}
+
+i.flag.tc:before, i.flag.caicos.islands:before {
+ background-position: -72px -1456px;
+}
+
+i.flag.td:before, i.flag.chad:before {
+ background-position: -72px -1482px;
+}
+
+i.flag.tf:before, i.flag.french.territories:before {
+ background-position: -72px -1508px;
+}
+
+i.flag.tg:before, i.flag.togo:before {
+ background-position: -72px -1534px;
+}
+
+i.flag.th:before, i.flag.thailand:before {
+ background-position: -72px -1560px;
+}
+
+i.flag.tj:before, i.flag.tajikistan:before {
+ background-position: -72px -1586px;
+}
+
+i.flag.tk:before, i.flag.tokelau:before {
+ background-position: -72px -1612px;
+}
+
+i.flag.tl:before, i.flag.timorleste:before {
+ background-position: -72px -1638px;
+}
+
+i.flag.tm:before, i.flag.turkmenistan:before {
+ background-position: -72px -1664px;
+}
+
+i.flag.tn:before, i.flag.tunisia:before {
+ background-position: -72px -1690px;
+}
+
+i.flag.to:before, i.flag.tonga:before {
+ background-position: -72px -1716px;
+}
+
+i.flag.tr:before, i.flag.turkey:before {
+ background-position: -72px -1742px;
+}
+
+i.flag.tt:before, i.flag.trinidad:before {
+ background-position: -72px -1768px;
+}
+
+i.flag.tv:before, i.flag.tuvalu:before {
+ background-position: -72px -1794px;
+}
+
+i.flag.tw:before, i.flag.taiwan:before {
+ background-position: -72px -1820px;
+}
+
+i.flag.tz:before, i.flag.tanzania:before {
+ background-position: -72px -1846px;
+}
+
+i.flag.ua:before, i.flag.ukraine:before {
+ background-position: -72px -1872px;
+}
+
+i.flag.ug:before, i.flag.uganda:before {
+ background-position: -72px -1898px;
+}
+
+i.flag.um:before, i.flag.us.minor.islands:before {
+ background-position: -72px -1924px;
+}
+
+i.flag.us:before, i.flag.america:before, i.flag.united.states:before {
+ background-position: -72px -1950px;
+}
+
+i.flag.uy:before, i.flag.uruguay:before {
+ background-position: -72px -1976px;
+}
+
+i.flag.uz:before, i.flag.uzbekistan:before {
+ background-position: -108px 0;
+}
+
+i.flag.va:before, i.flag.vatican.city:before {
+ background-position: -108px -26px;
+}
+
+i.flag.vc:before, i.flag.saint.vincent:before {
+ background-position: -108px -52px;
+}
+
+i.flag.ve:before, i.flag.venezuela:before {
+ background-position: -108px -78px;
+}
+
+i.flag.vg:before, i.flag.british.virgin.islands:before {
+ background-position: -108px -104px;
+}
+
+i.flag.vi:before, i.flag.us.virgin.islands:before {
+ background-position: -108px -130px;
+}
+
+i.flag.vn:before, i.flag.vietnam:before {
+ background-position: -108px -156px;
+}
+
+i.flag.vu:before, i.flag.vanuatu:before {
+ background-position: -108px -182px;
+}
+
+i.flag.gb.wls:before, i.flag.wales:before {
+ background-position: -108px -208px;
+}
+
+i.flag.wf:before, i.flag.wallis.and.futuna:before {
+ background-position: -108px -234px;
+}
+
+i.flag.ws:before, i.flag.samoa:before {
+ background-position: -108px -260px;
+}
+
+i.flag.ye:before, i.flag.yemen:before {
+ background-position: -108px -286px;
+}
+
+i.flag.yt:before, i.flag.mayotte:before {
+ background-position: -108px -312px;
+}
+
+i.flag.za:before, i.flag.south.africa:before {
+ background-position: -108px -338px;
+}
+
+i.flag.zm:before, i.flag.zambia:before {
+ background-position: -108px -364px;
+}
+
+i.flag.zw:before, i.flag.zimbabwe:before {
+ background-position: -108px -390px;
+}
+
+/*rtl:end:ignore*/
+/*******************************
+ Site Overrides
+*******************************/
+/*!
+ * # Fomantic-UI 2.8.8 - Header
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+/*******************************
+ Header
+*******************************/
+/* Standard */
+.ui.header {
+ border: none;
+ margin: calc(2rem - 0.1428571428571429em) 0 1rem;
+ padding: 0 0;
+ font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
+ font-weight: bold;
+ line-height: 1.28571429em;
+ text-transform: none;
+ color: rgba(0, 0, 0, 0.87);
+}
+
+.ui.header:first-child {
+ margin-top: -0.14285714em;
+}
+
+.ui.header:last-child {
+ margin-bottom: 0;
+}
+
+/*--------------
+ Sub Header
+ ---------------*/
+.ui.header .sub.header {
+ display: block;
+ font-weight: normal;
+ padding: 0;
+ margin: 0;
+ font-size: 1rem;
+ line-height: 1.2em;
+ color: rgba(0, 0, 0, 0.6);
+}
+
+/*--------------
+ Icon
+---------------*/
+.ui.header > .icons, .ui.header > i.icon {
+ display: table-cell;
+ opacity: 1;
+ font-size: 1.5em;
+ padding-top: 0;
+ vertical-align: middle;
+}
+
+/* With Text Node */
+.ui.header:not(.icon) > .icons:only-child, .ui.header:not(.icon) > i.icon:only-child {
+ display: inline-block;
+ padding: 0;
+ margin-right: 0.75rem;
+}
+
+/*-------------------
+ Image
+--------------------*/
+.ui.header > .image:not(.icon), .ui.header > img {
+ display: inline-block;
+ margin-top: 0.14285714em;
+ width: 2.5em;
+ height: auto;
+ vertical-align: middle;
+}
+
+.ui.header > .image:not(.icon):only-child, .ui.header > img:only-child {
+ margin-right: 0.75rem;
+}
+
+/*--------------
+ Content
+---------------*/
+.ui.header .content {
+ display: inline-block;
+ vertical-align: top;
+}
+
+/* After Image */
+.ui.header > img + .content, .ui.header > .image + .content {
+ padding-left: 0.75rem;
+ vertical-align: middle;
+}
+
+/* After Icon */
+.ui.header:not(.icon):not(.centered):not(.aligned) > .icons + .content, .ui.header:not(.icon):not(.centered):not(.aligned) > i.icon + .content {
+ padding-left: 0.75rem;
+ display: table-cell;
+ vertical-align: middle;
+}
+
+/*--------------
+ Loose Coupling
+---------------*/
+.ui.header .ui.label {
+ font-size: '';
+ margin-left: 0.5rem;
+ vertical-align: middle;
+}
+
+/* Positioning */
+.ui.header + p {
+ margin-top: 0;
+}
+
+/*******************************
+ Types
+*******************************/
+/*--------------
+ Page
+---------------*/
+h1.ui.header {
+ font-size: 2rem;
+}
+
+h1.ui.header .sub.header {
+ font-size: 1.14285714rem;
+}
+
+h2.ui.header {
+ font-size: 1.71428571rem;
+}
+
+h2.ui.header .sub.header {
+ font-size: 1.14285714rem;
+}
+
+h3.ui.header {
+ font-size: 1.28571429rem;
+}
+
+h3.ui.header .sub.header {
+ font-size: 1rem;
+}
+
+h4.ui.header {
+ font-size: 1.07142857rem;
+}
+
+h4.ui.header .sub.header {
+ font-size: 1rem;
+}
+
+h5.ui.header {
+ font-size: 1rem;
+}
+
+h5.ui.header .sub.header {
+ font-size: 0.92857143rem;
+}
+
+h6.ui.header {
+ font-size: 0.85714286rem;
+}
+
+h6.ui.header .sub.header {
+ font-size: 0.92857143rem;
+}
+
+/*--------------
+ Content Heading
+---------------*/
+.ui.mini.header {
+ font-size: 0.85714286em;
+}
+
+.ui.mini.header .sub.header {
+ font-size: 0.92857143rem;
+}
+
+.ui.mini.sub.header {
+ font-size: 0.78571429em;
+}
+
+.ui.tiny.header {
+ font-size: 1em;
+}
+
+.ui.tiny.header .sub.header {
+ font-size: 0.92857143rem;
+}
+
+.ui.tiny.sub.header {
+ font-size: 0.78571429em;
+}
+
+.ui.small.header {
+ font-size: 1.07142857em;
+}
+
+.ui.small.header .sub.header {
+ font-size: 1rem;
+}
+
+.ui.small.sub.header {
+ font-size: 0.78571429em;
+}
+
+.ui.large.header {
+ font-size: 1.71428571em;
+}
+
+.ui.large.header .sub.header {
+ font-size: 1.14285714rem;
+}
+
+.ui.large.sub.header {
+ font-size: 0.92857143em;
+}
+
+.ui.big.header {
+ font-size: 1.85714286em;
+}
+
+.ui.big.header .sub.header {
+ font-size: 1.14285714rem;
+}
+
+.ui.big.sub.header {
+ font-size: 1em;
+}
+
+.ui.huge.header {
+ font-size: 2em;
+ min-height: 1em;
+}
+
+.ui.huge.header .sub.header {
+ font-size: 1.14285714rem;
+}
+
+.ui.huge.sub.header {
+ font-size: 1em;
+}
+
+.ui.massive.header {
+ font-size: 2.28571429em;
+ min-height: 1em;
+}
+
+.ui.massive.header .sub.header {
+ font-size: 1.42857143rem;
+}
+
+.ui.massive.sub.header {
+ font-size: 1.14285714em;
+}
+
+/*--------------
+ Sub Heading
+ ---------------*/
+.ui.sub.header {
+ padding: 0;
+ margin-bottom: 0.14285714rem;
+ font-weight: bold;
+ font-size: 0.85714286em;
+ text-transform: uppercase;
+ color: '';
+}
+
+/*-------------------
+ Icon
+ --------------------*/
+.ui.icon.header {
+ display: inline-block;
+ text-align: center;
+ margin: 2rem 0 1rem;
+}
+
+.ui.icon.header:after {
+ content: '';
+ display: block;
+ height: 0;
+ clear: both;
+ visibility: hidden;
+}
+
+.ui.icon.header:first-child {
+ margin-top: 0;
+}
+
+.ui.icon.header > .icons, .ui.icon.header > i.icon {
+ float: none;
+ display: block;
+ width: auto;
+ height: auto;
+ line-height: 1;
+ padding: 0;
+ font-size: 3em;
+ margin: 0 auto 0.5rem;
+ opacity: 1;
+}
+
+.ui.icon.header .corner.icon {
+ font-size: calc(3em * 0.45);
+}
+
+.ui.icon.header .content {
+ display: block;
+ padding: 0;
+}
+
+.ui.icon.header > i.circular {
+ font-size: 2em;
+}
+
+.ui.icon.header > i.square {
+ font-size: 2em;
+}
+
+.ui.block.icon.header > .icons, .ui.block.icon.header > i.icon {
+ margin-bottom: 0;
+}
+
+.ui.icon.header.aligned {
+ margin-left: auto;
+ margin-right: auto;
+ display: block;
+}
+
+/*******************************
+ States
+*******************************/
+.ui.disabled.header {
+ opacity: 0.45;
+}
+
+/*******************************
+ Variations
+*******************************/
+/*-------------------
+ Inverted
+ --------------------*/
+.ui.inverted.header {
+ color: #FFFFFF;
+}
+
+.ui.inverted.header .sub.header {
+ color: rgba(255, 255, 255, 0.8);
+}
+
+.ui.inverted.attached.header {
+ background: #1B1C1D;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ border-color: transparent;
+}
+
+.ui.inverted.block.header {
+ background: #545454 -webkit-gradient(linear, left top, left bottom, from(transparent), to(rgba(0, 0, 0, 0.05)));
+ background: #545454 -webkit-linear-gradient(transparent, rgba(0, 0, 0, 0.05));
+ background: #545454 linear-gradient(transparent, rgba(0, 0, 0, 0.05));
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ border-bottom: none;
+}
+
+/*-------------------
+ Colors
+--------------------*/
+.ui.primary.header {
+ color: #2185D0;
+}
+
+a.ui.primary.header:hover {
+ color: #1678c2;
+}
+
+.ui.primary.dividing.header {
+ border-bottom: 2px solid #2185D0;
+}
+
+.ui.inverted.primary.header.header.header {
+ color: #54C8FF;
+}
+
+a.ui.inverted.primary.header.header.header:hover {
+ color: #21b8ff;
+}
+
+.ui.inverted.primary.dividing.header {
+ border-bottom: 2px solid #54C8FF;
+}
+
+.ui.secondary.header {
+ color: #1B1C1D;
+}
+
+a.ui.secondary.header:hover {
+ color: #27292a;
+}
+
+.ui.secondary.dividing.header {
+ border-bottom: 2px solid #1B1C1D;
+}
+
+.ui.inverted.secondary.header.header.header {
+ color: #545454;
+}
+
+a.ui.inverted.secondary.header.header.header:hover {
+ color: #6e6e6e;
+}
+
+.ui.inverted.secondary.dividing.header {
+ border-bottom: 2px solid #545454;
+}
+
+.ui.red.header {
+ color: #DB2828;
+}
+
+a.ui.red.header:hover {
+ color: #d01919;
+}
+
+.ui.red.dividing.header {
+ border-bottom: 2px solid #DB2828;
+}
+
+.ui.inverted.red.header.header.header {
+ color: #FF695E;
+}
+
+a.ui.inverted.red.header.header.header:hover {
+ color: #ff392b;
+}
+
+.ui.inverted.red.dividing.header {
+ border-bottom: 2px solid #FF695E;
+}
+
+.ui.orange.header {
+ color: #F2711C;
+}
+
+a.ui.orange.header:hover {
+ color: #f26202;
+}
+
+.ui.orange.dividing.header {
+ border-bottom: 2px solid #F2711C;
+}
+
+.ui.inverted.orange.header.header.header {
+ color: #FF851B;
+}
+
+a.ui.inverted.orange.header.header.header:hover {
+ color: #e76b00;
+}
+
+.ui.inverted.orange.dividing.header {
+ border-bottom: 2px solid #FF851B;
+}
+
+.ui.yellow.header {
+ color: #FBBD08;
+}
+
+a.ui.yellow.header:hover {
+ color: #eaae00;
+}
+
+.ui.yellow.dividing.header {
+ border-bottom: 2px solid #FBBD08;
+}
+
+.ui.inverted.yellow.header.header.header {
+ color: #FFE21F;
+}
+
+a.ui.inverted.yellow.header.header.header:hover {
+ color: #ebcd00;
+}
+
+.ui.inverted.yellow.dividing.header {
+ border-bottom: 2px solid #FFE21F;
+}
+
+.ui.olive.header {
+ color: #B5CC18;
+}
+
+a.ui.olive.header:hover {
+ color: #a7bd0d;
+}
+
+.ui.olive.dividing.header {
+ border-bottom: 2px solid #B5CC18;
+}
+
+.ui.inverted.olive.header.header.header {
+ color: #D9E778;
+}
+
+a.ui.inverted.olive.header.header.header:hover {
+ color: #d2e745;
+}
+
+.ui.inverted.olive.dividing.header {
+ border-bottom: 2px solid #D9E778;
+}
+
+.ui.green.header {
+ color: #21BA45;
+}
+
+a.ui.green.header:hover {
+ color: #16ab39;
+}
+
+.ui.green.dividing.header {
+ border-bottom: 2px solid #21BA45;
+}
+
+.ui.inverted.green.header.header.header {
+ color: #2ECC40;
+}
+
+a.ui.inverted.green.header.header.header:hover {
+ color: #1ea92e;
+}
+
+.ui.inverted.green.dividing.header {
+ border-bottom: 2px solid #2ECC40;
+}
+
+.ui.teal.header {
+ color: #00B5AD;
+}
+
+a.ui.teal.header:hover {
+ color: #009c95;
+}
+
+.ui.teal.dividing.header {
+ border-bottom: 2px solid #00B5AD;
+}
+
+.ui.inverted.teal.header.header.header {
+ color: #6DFFFF;
+}
+
+a.ui.inverted.teal.header.header.header:hover {
+ color: #3affff;
+}
+
+.ui.inverted.teal.dividing.header {
+ border-bottom: 2px solid #6DFFFF;
+}
+
+.ui.blue.header {
+ color: #2185D0;
+}
+
+a.ui.blue.header:hover {
+ color: #1678c2;
+}
+
+.ui.blue.dividing.header {
+ border-bottom: 2px solid #2185D0;
+}
+
+.ui.inverted.blue.header.header.header {
+ color: #54C8FF;
+}
+
+a.ui.inverted.blue.header.header.header:hover {
+ color: #21b8ff;
+}
+
+.ui.inverted.blue.dividing.header {
+ border-bottom: 2px solid #54C8FF;
+}
+
+.ui.violet.header {
+ color: #6435C9;
+}
+
+a.ui.violet.header:hover {
+ color: #5829bb;
+}
+
+.ui.violet.dividing.header {
+ border-bottom: 2px solid #6435C9;
+}
+
+.ui.inverted.violet.header.header.header {
+ color: #A291FB;
+}
+
+a.ui.inverted.violet.header.header.header:hover {
+ color: #745aff;
+}
+
+.ui.inverted.violet.dividing.header {
+ border-bottom: 2px solid #A291FB;
+}
+
+.ui.purple.header {
+ color: #A333C8;
+}
+
+a.ui.purple.header:hover {
+ color: #9627ba;
+}
+
+.ui.purple.dividing.header {
+ border-bottom: 2px solid #A333C8;
+}
+
+.ui.inverted.purple.header.header.header {
+ color: #DC73FF;
+}
+
+a.ui.inverted.purple.header.header.header:hover {
+ color: #cf40ff;
+}
+
+.ui.inverted.purple.dividing.header {
+ border-bottom: 2px solid #DC73FF;
+}
+
+.ui.pink.header {
+ color: #E03997;
+}
+
+a.ui.pink.header:hover {
+ color: #e61a8d;
+}
+
+.ui.pink.dividing.header {
+ border-bottom: 2px solid #E03997;
+}
+
+.ui.inverted.pink.header.header.header {
+ color: #FF8EDF;
+}
+
+a.ui.inverted.pink.header.header.header:hover {
+ color: #ff5bd1;
+}
+
+.ui.inverted.pink.dividing.header {
+ border-bottom: 2px solid #FF8EDF;
+}
+
+.ui.brown.header {
+ color: #A5673F;
+}
+
+a.ui.brown.header:hover {
+ color: #975b33;
+}
+
+.ui.brown.dividing.header {
+ border-bottom: 2px solid #A5673F;
+}
+
+.ui.inverted.brown.header.header.header {
+ color: #D67C1C;
+}
+
+a.ui.inverted.brown.header.header.header:hover {
+ color: #b0620f;
+}
+
+.ui.inverted.brown.dividing.header {
+ border-bottom: 2px solid #D67C1C;
+}
+
+.ui.grey.header {
+ color: #767676;
+}
+
+a.ui.grey.header:hover {
+ color: #838383;
+}
+
+.ui.grey.dividing.header {
+ border-bottom: 2px solid #767676;
+}
+
+.ui.inverted.grey.header.header.header {
+ color: #DCDDDE;
+}
+
+a.ui.inverted.grey.header.header.header:hover {
+ color: #c2c4c5;
+}
+
+.ui.inverted.grey.dividing.header {
+ border-bottom: 2px solid #DCDDDE;
+}
+
+.ui.black.header {
+ color: #1B1C1D;
+}
+
+a.ui.black.header:hover {
+ color: #27292a;
+}
+
+.ui.black.dividing.header {
+ border-bottom: 2px solid #1B1C1D;
+}
+
+.ui.inverted.black.header.header.header {
+ color: #545454;
+}
+
+a.ui.inverted.black.header.header.header:hover {
+ color: #000000;
+}
+
+.ui.inverted.black.dividing.header {
+ border-bottom: 2px solid #545454;
+}
+
+/*-------------------
+ Aligned
+ --------------------*/
+.ui.left.aligned.header {
+ text-align: left;
+}
+
+.ui.right.aligned.header {
+ text-align: right;
+}
+
+.ui.centered.header, .ui.center.aligned.header {
+ text-align: center;
+}
+
+.ui.justified.header {
+ text-align: justify;
+}
+
+.ui.justified.header:after {
+ display: inline-block;
+ content: '';
+ width: 100%;
+}
+
+/*-------------------
+ Floated
+ --------------------*/
+.ui.floated.header, .ui[class*="left floated"].header {
+ float: left;
+ margin-top: 0;
+ margin-right: 0.5em;
+}
+
+.ui[class*="right floated"].header {
+ float: right;
+ margin-top: 0;
+ margin-left: 0.5em;
+}
+
+/*-------------------
+ Fitted
+ --------------------*/
+.ui.fitted.header {
+ padding: 0;
+}
+
+/*-------------------
+ Dividing
+ --------------------*/
+.ui.dividing.header {
+ padding-bottom: 0.21428571rem;
+ border-bottom: 1px solid rgba(34, 36, 38, 0.15);
+}
+
+.ui.dividing.header .sub.header {
+ padding-bottom: 0.21428571rem;
+}
+
+.ui.dividing.header i.icon {
+ margin-bottom: 0;
+}
+
+.ui.inverted.dividing.header {
+ border-bottom-color: rgba(255, 255, 255, 0.1);
+}
+
+/*-------------------
+ Block
+ --------------------*/
+.ui.block.header {
+ background: #F3F4F5;
+ padding: 0.78571429rem 1rem;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ border: 1px solid #D4D4D5;
+ border-radius: 0.28571429rem;
+}
+
+.ui.block.header:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6) {
+ font-size: 1rem;
+}
+
+.ui.mini.block.header {
+ font-size: 0.78571429rem;
+}
+
+.ui.tiny.block.header {
+ font-size: 0.85714286rem;
+}
+
+.ui.small.block.header {
+ font-size: 0.92857143rem;
+}
+
+.ui.large.block.header {
+ font-size: 1.14285714rem;
+}
+
+.ui.big.block.header {
+ font-size: 1.28571429rem;
+}
+
+.ui.huge.block.header {
+ font-size: 1.42857143rem;
+}
+
+.ui.massive.block.header {
+ font-size: 1.71428571rem;
+}
+
+/*-------------------
+ Attached
+ --------------------*/
+.ui.attached.header {
+ background: #FFFFFF;
+ padding: 0.78571429rem 1rem;
+ margin: 0 -1px 0 -1px;
+ -webkit-box-shadow: none;
+ box-shadow: none;
+ border: 1px solid #D4D4D5;
+ border-radius: 0;
+}
+
+.ui.attached.block.header {
+ background: #F3F4F5;
+}
+
+.ui.attached:not(.top).header {
+ border-top: none;
+}
+
+.ui.top.attached.header {
+ border-radius: 0.28571429rem 0.28571429rem 0 0;
+}
+
+.ui.bottom.attached.header {
+ border-radius: 0 0 0.28571429rem 0.28571429rem;
+}
+
+/* Attached Sizes */
+.ui.attached.header:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6) {
+ font-size: 1em;
+}
+
+.ui.mini.attached.header {
+ font-size: 0.78571429em;
+}
+
+.ui.tiny.attached.header {
+ font-size: 0.85714286em;
+}
+
+.ui.small.attached.header {
+ font-size: 0.92857143em;
+}
+
+.ui.large.attached.header {
+ font-size: 1.14285714em;
+}
+
+.ui.big.attached.header {
+ font-size: 1.28571429em;
+}
+
+.ui.huge.attached.header {
+ font-size: 1.42857143em;
+}
+
+.ui.massive.attached.header {
+ font-size: 1.71428571em;
+}
+
+/*-------------------
+ Sizing
+--------------------*/
+.ui.header:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6) {
+ font-size: 1.28571429em;
+}
+
+/*******************************
+ Theme Overrides
+*******************************/
+/*******************************
+ Site Overrides
+*******************************/
+/*!
+ * # Fomantic-UI 2.8.8 - Form
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+/*******************************
+ Elements
+*******************************/
+/*--------------------
+ Form
+---------------------*/
+.ui.form {
+ position: relative;
+ max-width: 100%;
+}
+
+/*--------------------
+ Content
+---------------------*/
+.ui.form > p {
+ margin: 1em 0;
+}
+
+/*--------------------
+ Field
+---------------------*/
+.ui.form .field {
+ clear: both;
+ margin: 0 0 1em;
+}
+
+.ui.form .fields .fields, .ui.form .field:last-child, .ui.form .fields:last-child .field {
+ margin-bottom: 0;
+}
+
+.ui.form .fields .field {
+ clear: both;
+ margin: 0;
+}
+
+/*--------------------
+ Labels
+---------------------*/
+.ui.form .field > label {
+ display: block;
+ margin: 0 0 0.28571429rem 0;
+ color: rgba(0, 0, 0, 0.87);
+ font-size: 0.92857143em;
+ font-weight: bold;
+ text-transform: none;
+}
+
+/*--------------------
+ Standard Inputs
+---------------------*/
+.ui.form textarea, .ui.form input:not([type]), .ui.form input[type="date"], .ui.form input[type="datetime-local"], .ui.form input[type="email"], .ui.form input[type="number"], .ui.form input[type="password"], .ui.form input[type="search"], .ui.form input[type="tel"], .ui.form input[type="time"], .ui.form input[type="text"], .ui.form input[type="file"], .ui.form input[type="url"] {
+ width: 100%;
+ vertical-align: top;
+}
+
+/* Set max height on unusual input */
+.ui.form ::-webkit-datetime-edit, .ui.form ::-webkit-inner-spin-button {
+ height: 1.21428571em;
+}
+
+.ui.form input:not([type]), .ui.form input[type="date"], .ui.form input[type="datetime-local"], .ui.form input[type="email"], .ui.form input[type="number"], .ui.form input[type="password"], .ui.form input[type="search"], .ui.form input[type="tel"], .ui.form input[type="time"], .ui.form input[type="text"], .ui.form input[type="file"], .ui.form input[type="url"] {
+ font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;
+ margin: 0;
+ outline: none;
+ -webkit-appearance: none;
+ -webkit-tap-highlight-color: rgba(255, 255, 255, 0);
+ line-height: 1.21428571em;
+ padding: 0.67857143em 1em;
+ font-size: 1em;
+ background: #FFFFFF;
+ border: 1px solid rgba(34, 36, 38, 0.15);
+ color: rgba(0, 0, 0, 0.87);
+ border-radius: 0.28571429rem;
+ -webkit-box-shadow: 0 0 0 0 transparent inset;
+ box-shadow: 0 0 0 0 transparent inset;
+ -webkit-transition: color 0.1s ease, border-color 0.1s ease;
+ transition: color 0.1s ease, border-color 0.1s ease;
+}
\ No newline at end of file
diff --git a/public/dist/semantic.js b/public/dist/semantic.js
new file mode 100644
index 000000000..67a2f9988
--- /dev/null
+++ b/public/dist/semantic.js
@@ -0,0 +1,28739 @@
+/*
+ * # Fomantic UI - 2.8.8
+ * https://github.com/fomantic/Fomantic-UI
+ * http://fomantic-ui.com/
+ *
+ * Copyright 2021 Contributors
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+/*!
+ * # Fomantic-UI 2.8.8 - Site
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+$.site = $.fn.site = function(parameters) {
+ var
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.site.settings, parameters)
+ : $.extend({}, $.site.settings),
+
+ namespace = settings.namespace,
+ error = settings.error,
+
+ moduleNamespace = 'module-' + namespace,
+
+ $document = $(document),
+ $module = $document,
+ element = this,
+ instance = $module.data(moduleNamespace),
+
+ module,
+ returnedValue
+ ;
+ module = {
+
+ initialize: function() {
+ module.instantiate();
+ },
+
+ instantiate: function() {
+ module.verbose('Storing instance of site', module);
+ instance = module;
+ $module
+ .data(moduleNamespace, module)
+ ;
+ },
+
+ normalize: function() {
+ module.fix.console();
+ module.fix.requestAnimationFrame();
+ },
+
+ fix: {
+ console: function() {
+ module.debug('Normalizing window.console');
+ if (console === undefined || console.log === undefined) {
+ module.verbose('Console not available, normalizing events');
+ module.disable.console();
+ }
+ if (typeof console.group == 'undefined' || typeof console.groupEnd == 'undefined' || typeof console.groupCollapsed == 'undefined') {
+ module.verbose('Console group not available, normalizing events');
+ window.console.group = function() {};
+ window.console.groupEnd = function() {};
+ window.console.groupCollapsed = function() {};
+ }
+ if (typeof console.markTimeline == 'undefined') {
+ module.verbose('Mark timeline not available, normalizing events');
+ window.console.markTimeline = function() {};
+ }
+ },
+ consoleClear: function() {
+ module.debug('Disabling programmatic console clearing');
+ window.console.clear = function() {};
+ },
+ requestAnimationFrame: function() {
+ module.debug('Normalizing requestAnimationFrame');
+ if(window.requestAnimationFrame === undefined) {
+ module.debug('RequestAnimationFrame not available, normalizing event');
+ window.requestAnimationFrame = window.requestAnimationFrame
+ || window.mozRequestAnimationFrame
+ || window.webkitRequestAnimationFrame
+ || window.msRequestAnimationFrame
+ || function(callback) { setTimeout(callback, 0); }
+ ;
+ }
+ }
+ },
+
+ moduleExists: function(name) {
+ return ($.fn[name] !== undefined && $.fn[name].settings !== undefined);
+ },
+
+ enabled: {
+ modules: function(modules) {
+ var
+ enabledModules = []
+ ;
+ modules = modules || settings.modules;
+ $.each(modules, function(index, name) {
+ if(module.moduleExists(name)) {
+ enabledModules.push(name);
+ }
+ });
+ return enabledModules;
+ }
+ },
+
+ disabled: {
+ modules: function(modules) {
+ var
+ disabledModules = []
+ ;
+ modules = modules || settings.modules;
+ $.each(modules, function(index, name) {
+ if(!module.moduleExists(name)) {
+ disabledModules.push(name);
+ }
+ });
+ return disabledModules;
+ }
+ },
+
+ change: {
+ setting: function(setting, value, modules, modifyExisting) {
+ modules = (typeof modules === 'string')
+ ? (modules === 'all')
+ ? settings.modules
+ : [modules]
+ : modules || settings.modules
+ ;
+ modifyExisting = (modifyExisting !== undefined)
+ ? modifyExisting
+ : true
+ ;
+ $.each(modules, function(index, name) {
+ var
+ namespace = (module.moduleExists(name))
+ ? $.fn[name].settings.namespace || false
+ : true,
+ $existingModules
+ ;
+ if(module.moduleExists(name)) {
+ module.verbose('Changing default setting', setting, value, name);
+ $.fn[name].settings[setting] = value;
+ if(modifyExisting && namespace) {
+ $existingModules = $(':data(module-' + namespace + ')');
+ if($existingModules.length > 0) {
+ module.verbose('Modifying existing settings', $existingModules);
+ $existingModules[name]('setting', setting, value);
+ }
+ }
+ }
+ });
+ },
+ settings: function(newSettings, modules, modifyExisting) {
+ modules = (typeof modules === 'string')
+ ? [modules]
+ : modules || settings.modules
+ ;
+ modifyExisting = (modifyExisting !== undefined)
+ ? modifyExisting
+ : true
+ ;
+ $.each(modules, function(index, name) {
+ var
+ $existingModules
+ ;
+ if(module.moduleExists(name)) {
+ module.verbose('Changing default setting', newSettings, name);
+ $.extend(true, $.fn[name].settings, newSettings);
+ if(modifyExisting && namespace) {
+ $existingModules = $(':data(module-' + namespace + ')');
+ if($existingModules.length > 0) {
+ module.verbose('Modifying existing settings', $existingModules);
+ $existingModules[name]('setting', newSettings);
+ }
+ }
+ }
+ });
+ }
+ },
+
+ enable: {
+ console: function() {
+ module.console(true);
+ },
+ debug: function(modules, modifyExisting) {
+ modules = modules || settings.modules;
+ module.debug('Enabling debug for modules', modules);
+ module.change.setting('debug', true, modules, modifyExisting);
+ },
+ verbose: function(modules, modifyExisting) {
+ modules = modules || settings.modules;
+ module.debug('Enabling verbose debug for modules', modules);
+ module.change.setting('verbose', true, modules, modifyExisting);
+ }
+ },
+ disable: {
+ console: function() {
+ module.console(false);
+ },
+ debug: function(modules, modifyExisting) {
+ modules = modules || settings.modules;
+ module.debug('Disabling debug for modules', modules);
+ module.change.setting('debug', false, modules, modifyExisting);
+ },
+ verbose: function(modules, modifyExisting) {
+ modules = modules || settings.modules;
+ module.debug('Disabling verbose debug for modules', modules);
+ module.change.setting('verbose', false, modules, modifyExisting);
+ }
+ },
+
+ console: function(enable) {
+ if(enable) {
+ if(instance.cache.console === undefined) {
+ module.error(error.console);
+ return;
+ }
+ module.debug('Restoring console function');
+ window.console = instance.cache.console;
+ }
+ else {
+ module.debug('Disabling console function');
+ instance.cache.console = window.console;
+ window.console = {
+ clear : function(){},
+ error : function(){},
+ group : function(){},
+ groupCollapsed : function(){},
+ groupEnd : function(){},
+ info : function(){},
+ log : function(){},
+ markTimeline : function(){},
+ warn : function(){}
+ };
+ }
+ },
+
+ destroy: function() {
+ module.verbose('Destroying previous site for', $module);
+ $module
+ .removeData(moduleNamespace)
+ ;
+ },
+
+ cache: {},
+
+ setting: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ settings[name] = value;
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Element' : element,
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ module.error(error.method, query);
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ module.destroy();
+ }
+ module.initialize();
+ }
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.site.settings = {
+
+ name : 'Site',
+ namespace : 'site',
+
+ error : {
+ console : 'Console cannot be restored, most likely it was overwritten outside of module',
+ method : 'The method you called is not defined.'
+ },
+
+ debug : false,
+ verbose : false,
+ performance : true,
+
+ modules: [
+ 'accordion',
+ 'api',
+ 'calendar',
+ 'checkbox',
+ 'dimmer',
+ 'dropdown',
+ 'embed',
+ 'form',
+ 'modal',
+ 'nag',
+ 'popup',
+ 'slider',
+ 'rating',
+ 'shape',
+ 'sidebar',
+ 'state',
+ 'sticky',
+ 'tab',
+ 'toast',
+ 'transition',
+ 'visibility',
+ 'visit'
+ ],
+
+ siteNamespace : 'site',
+ namespaceStub : {
+ cache : {},
+ config : {},
+ sections : {},
+ section : {},
+ utilities : {}
+ }
+
+};
+
+// allows for selection of elements with data attributes
+$.extend($.expr[ ":" ], {
+ data: ($.expr.createPseudo)
+ ? $.expr.createPseudo(function(dataName) {
+ return function(elem) {
+ return !!$.data(elem, dataName);
+ };
+ })
+ : function(elem, i, match) {
+ // support: jQuery < 1.8
+ return !!$.data(elem, match[ 3 ]);
+ }
+});
+
+
+})( jQuery, window, document );
+
+/*!
+ * # Fomantic-UI 2.8.8 - Form Validation
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+'use strict';
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.form = function(parameters) {
+ var
+ $allModules = $(this),
+ moduleSelector = $allModules.selector || '',
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ legacyParameters = arguments[1],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+ returnedValue
+ ;
+ $allModules
+ .each(function() {
+ var
+ $module = $(this),
+ element = this,
+
+ formErrors = [],
+ keyHeldDown = false,
+
+ // set at run-time
+ $field,
+ $group,
+ $message,
+ $prompt,
+ $submit,
+ $clear,
+ $reset,
+
+ settings,
+ validation,
+
+ metadata,
+ selector,
+ className,
+ regExp,
+ error,
+
+ namespace,
+ moduleNamespace,
+ eventNamespace,
+
+ submitting = false,
+ dirty = false,
+ history = ['clean', 'clean'],
+
+ instance,
+ module
+ ;
+
+ module = {
+
+ initialize: function() {
+
+ // settings grabbed at run time
+ module.get.settings();
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.instantiate();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ module.refresh();
+ }
+ module.verbose('Initializing form validation', $module, settings);
+ module.bindEvents();
+ module.set.defaults();
+ if (settings.autoCheckRequired) {
+ module.set.autoCheck();
+ }
+ module.instantiate();
+ }
+ },
+
+ instantiate: function() {
+ module.verbose('Storing instance of module', module);
+ instance = module;
+ $module
+ .data(moduleNamespace, module)
+ ;
+ },
+
+ destroy: function() {
+ module.verbose('Destroying previous module', instance);
+ module.removeEvents();
+ $module
+ .removeData(moduleNamespace)
+ ;
+ },
+
+ refresh: function() {
+ module.verbose('Refreshing selector cache');
+ $field = $module.find(selector.field);
+ $group = $module.find(selector.group);
+ $message = $module.find(selector.message);
+ $prompt = $module.find(selector.prompt);
+
+ $submit = $module.find(selector.submit);
+ $clear = $module.find(selector.clear);
+ $reset = $module.find(selector.reset);
+ },
+
+ submit: function() {
+ module.verbose('Submitting form', $module);
+ submitting = true;
+ $module.submit();
+ },
+
+ attachEvents: function(selector, action) {
+ action = action || 'submit';
+ $(selector).on('click' + eventNamespace, function(event) {
+ module[action]();
+ event.preventDefault();
+ });
+ },
+
+ bindEvents: function() {
+ module.verbose('Attaching form events');
+ $module
+ .on('submit' + eventNamespace, module.validate.form)
+ .on('blur' + eventNamespace, selector.field, module.event.field.blur)
+ .on('click' + eventNamespace, selector.submit, module.submit)
+ .on('click' + eventNamespace, selector.reset, module.reset)
+ .on('click' + eventNamespace, selector.clear, module.clear)
+ ;
+ if(settings.keyboardShortcuts) {
+ $module.on('keydown' + eventNamespace, selector.field, module.event.field.keydown);
+ }
+ $field.each(function(index, el) {
+ var
+ $input = $(el),
+ type = $input.prop('type'),
+ inputEvent = module.get.changeEvent(type, $input)
+ ;
+ $input.on(inputEvent + eventNamespace, module.event.field.change);
+ });
+
+ // Dirty events
+ if (settings.preventLeaving) {
+ $(window).on('beforeunload' + eventNamespace, module.event.beforeUnload);
+ }
+
+ $field.on('change click keyup keydown blur', function(e) {
+ module.determine.isDirty();
+ });
+
+ $module.on('dirty' + eventNamespace, function(e) {
+ settings.onDirty.call();
+ });
+
+ $module.on('clean' + eventNamespace, function(e) {
+ settings.onClean.call();
+ })
+ },
+
+ clear: function() {
+ $field.each(function (index, el) {
+ var
+ $field = $(el),
+ $element = $field.parent(),
+ $fieldGroup = $field.closest($group),
+ $prompt = $fieldGroup.find(selector.prompt),
+ $calendar = $field.closest(selector.uiCalendar),
+ defaultValue = $field.data(metadata.defaultValue) || '',
+ isCheckbox = $element.is(selector.uiCheckbox),
+ isDropdown = $element.is(selector.uiDropdown) && module.can.useElement('dropdown'),
+ isCalendar = ($calendar.length > 0 && module.can.useElement('calendar')),
+ isErrored = $fieldGroup.hasClass(className.error)
+ ;
+ if(isErrored) {
+ module.verbose('Resetting error on field', $fieldGroup);
+ $fieldGroup.removeClass(className.error);
+ $prompt.remove();
+ }
+ if(isDropdown) {
+ module.verbose('Resetting dropdown value', $element, defaultValue);
+ $element.dropdown('clear', true);
+ }
+ else if(isCheckbox) {
+ $field.prop('checked', false);
+ }
+ else if (isCalendar) {
+ $calendar.calendar('clear');
+ }
+ else {
+ module.verbose('Resetting field value', $field, defaultValue);
+ $field.val('');
+ }
+ });
+ module.remove.states();
+ },
+
+ reset: function() {
+ $field.each(function (index, el) {
+ var
+ $field = $(el),
+ $element = $field.parent(),
+ $fieldGroup = $field.closest($group),
+ $calendar = $field.closest(selector.uiCalendar),
+ $prompt = $fieldGroup.find(selector.prompt),
+ defaultValue = $field.data(metadata.defaultValue),
+ isCheckbox = $element.is(selector.uiCheckbox),
+ isDropdown = $element.is(selector.uiDropdown) && module.can.useElement('dropdown'),
+ isCalendar = ($calendar.length > 0 && module.can.useElement('calendar')),
+ isErrored = $fieldGroup.hasClass(className.error)
+ ;
+ if(defaultValue === undefined) {
+ return;
+ }
+ if(isErrored) {
+ module.verbose('Resetting error on field', $fieldGroup);
+ $fieldGroup.removeClass(className.error);
+ $prompt.remove();
+ }
+ if(isDropdown) {
+ module.verbose('Resetting dropdown value', $element, defaultValue);
+ $element.dropdown('restore defaults', true);
+ }
+ else if(isCheckbox) {
+ module.verbose('Resetting checkbox value', $element, defaultValue);
+ $field.prop('checked', defaultValue);
+ }
+ else if (isCalendar) {
+ $calendar.calendar('set date', defaultValue);
+ }
+ else {
+ module.verbose('Resetting field value', $field, defaultValue);
+ $field.val(defaultValue);
+ }
+ });
+ module.remove.states();
+ },
+
+ determine: {
+ isValid: function() {
+ var
+ allValid = true
+ ;
+ $.each(validation, function(fieldName, field) {
+ if( !( module.validate.field(field, fieldName, true) ) ) {
+ allValid = false;
+ }
+ });
+ return allValid;
+ },
+ isDirty: function(e) {
+ var formIsDirty = false;
+
+ $field.each(function(index, el) {
+ var
+ $el = $(el),
+ isCheckbox = ($el.filter(selector.checkbox).length > 0),
+ isDirty
+ ;
+
+ if (isCheckbox) {
+ isDirty = module.is.checkboxDirty($el);
+ } else {
+ isDirty = module.is.fieldDirty($el);
+ }
+
+ $el.data(settings.metadata.isDirty, isDirty);
+
+ formIsDirty |= isDirty;
+ });
+
+ if (formIsDirty) {
+ module.set.dirty();
+ } else {
+ module.set.clean();
+ }
+
+ }
+ },
+
+ is: {
+ bracketedRule: function(rule) {
+ return (rule.type && rule.type.match(settings.regExp.bracket));
+ },
+ // duck type rule test
+ shorthandRules: function(rules) {
+ return (typeof rules == 'string' || Array.isArray(rules));
+ },
+ empty: function($field) {
+ if(!$field || $field.length === 0) {
+ return true;
+ }
+ else if($field.is(selector.checkbox)) {
+ return !$field.is(':checked');
+ }
+ else {
+ return module.is.blank($field);
+ }
+ },
+ blank: function($field) {
+ return String($field.val()).trim() === '';
+ },
+ valid: function(field, showErrors) {
+ var
+ allValid = true
+ ;
+ if(field) {
+ module.verbose('Checking if field is valid', field);
+ return module.validate.field(validation[field], field, !!showErrors);
+ }
+ else {
+ module.verbose('Checking if form is valid');
+ $.each(validation, function(fieldName, field) {
+ if( !module.is.valid(fieldName, showErrors) ) {
+ allValid = false;
+ }
+ });
+ return allValid;
+ }
+ },
+ dirty: function() {
+ return dirty;
+ },
+ clean: function() {
+ return !dirty;
+ },
+ fieldDirty: function($el) {
+ var initialValue = $el.data(metadata.defaultValue);
+ // Explicitly check for null/undefined here as value may be `false`, so ($el.data(dataInitialValue) || '') would not work
+ if (initialValue == null) { initialValue = ''; }
+ else if(Array.isArray(initialValue)) {
+ initialValue = initialValue.toString();
+ }
+ var currentValue = $el.val();
+ if (currentValue == null) { currentValue = ''; }
+ // multiple select values are returned as arrays which are never equal, so do string conversion first
+ else if(Array.isArray(currentValue)) {
+ currentValue = currentValue.toString();
+ }
+ // Boolean values can be encoded as "true/false" or "True/False" depending on underlying frameworks so we need a case insensitive comparison
+ var boolRegex = /^(true|false)$/i;
+ var isBoolValue = boolRegex.test(initialValue) && boolRegex.test(currentValue);
+ if (isBoolValue) {
+ var regex = new RegExp("^" + initialValue + "$", "i");
+ return !regex.test(currentValue);
+ }
+
+ return currentValue !== initialValue;
+ },
+ checkboxDirty: function($el) {
+ var initialValue = $el.data(metadata.defaultValue);
+ var currentValue = $el.is(":checked");
+
+ return initialValue !== currentValue;
+ },
+ justDirty: function() {
+ return (history[0] === 'dirty');
+ },
+ justClean: function() {
+ return (history[0] === 'clean');
+ }
+ },
+
+ removeEvents: function() {
+ $module.off(eventNamespace);
+ $field.off(eventNamespace);
+ $submit.off(eventNamespace);
+ $field.off(eventNamespace);
+ },
+
+ event: {
+ field: {
+ keydown: function(event) {
+ var
+ $field = $(this),
+ key = event.which,
+ isInput = $field.is(selector.input),
+ isCheckbox = $field.is(selector.checkbox),
+ isInDropdown = ($field.closest(selector.uiDropdown).length > 0),
+ keyCode = {
+ enter : 13,
+ escape : 27
+ }
+ ;
+ if( key == keyCode.escape) {
+ module.verbose('Escape key pressed blurring field');
+ $field[0]
+ .blur()
+ ;
+ }
+ if(!event.ctrlKey && key == keyCode.enter && isInput && !isInDropdown && !isCheckbox) {
+ if(!keyHeldDown) {
+ $field.one('keyup' + eventNamespace, module.event.field.keyup);
+ module.submit();
+ module.debug('Enter pressed on input submitting form');
+ }
+ keyHeldDown = true;
+ }
+ },
+ keyup: function() {
+ keyHeldDown = false;
+ },
+ blur: function(event) {
+ var
+ $field = $(this),
+ $fieldGroup = $field.closest($group),
+ validationRules = module.get.validation($field)
+ ;
+ if(validationRules && (settings.on == 'blur' || ( $fieldGroup.hasClass(className.error) && settings.revalidate) )) {
+ module.debug('Revalidating field', $field, validationRules);
+ module.validate.field( validationRules );
+ if(!settings.inline) {
+ module.validate.form(false,true);
+ }
+ }
+ },
+ change: function(event) {
+ var
+ $field = $(this),
+ $fieldGroup = $field.closest($group),
+ validationRules = module.get.validation($field)
+ ;
+ if(validationRules && (settings.on == 'change' || ( $fieldGroup.hasClass(className.error) && settings.revalidate) )) {
+ clearTimeout(module.timer);
+ module.timer = setTimeout(function() {
+ module.debug('Revalidating field', $field, validationRules);
+ module.validate.field( validationRules );
+ if(!settings.inline) {
+ module.validate.form(false,true);
+ }
+ }, settings.delay);
+ }
+ }
+ },
+ beforeUnload: function(event) {
+ if (module.is.dirty() && !submitting) {
+ var event = event || window.event;
+
+ // For modern browsers
+ if (event) {
+ event.returnValue = settings.text.leavingMessage;
+ }
+
+ // For olders...
+ return settings.text.leavingMessage;
+ }
+ }
+
+ },
+
+ get: {
+ ancillaryValue: function(rule) {
+ if(!rule.type || (!rule.value && !module.is.bracketedRule(rule))) {
+ return false;
+ }
+ return (rule.value !== undefined)
+ ? rule.value
+ : rule.type.match(settings.regExp.bracket)[1] + ''
+ ;
+ },
+ ruleName: function(rule) {
+ if( module.is.bracketedRule(rule) ) {
+ return rule.type.replace(rule.type.match(settings.regExp.bracket)[0], '');
+ }
+ return rule.type;
+ },
+ changeEvent: function(type, $input) {
+ if(type == 'checkbox' || type == 'radio' || type == 'hidden' || $input.is('select')) {
+ return 'change';
+ }
+ else {
+ return module.get.inputEvent();
+ }
+ },
+ inputEvent: function() {
+ return (document.createElement('input').oninput !== undefined)
+ ? 'input'
+ : (document.createElement('input').onpropertychange !== undefined)
+ ? 'propertychange'
+ : 'keyup'
+ ;
+ },
+ fieldsFromShorthand: function(fields) {
+ var
+ fullFields = {}
+ ;
+ $.each(fields, function(name, rules) {
+ if (!Array.isArray(rules) && typeof rules === 'object') {
+ fullFields[name] = rules;
+ } else {
+ if (typeof rules == 'string') {
+ rules = [rules];
+ }
+ fullFields[name] = {
+ rules: []
+ };
+ $.each(rules, function (index, rule) {
+ fullFields[name].rules.push({type: rule});
+ });
+ }
+ });
+ return fullFields;
+ },
+ prompt: function(rule, field) {
+ var
+ ruleName = module.get.ruleName(rule),
+ ancillary = module.get.ancillaryValue(rule),
+ $field = module.get.field(field.identifier),
+ value = $field.val(),
+ prompt = $.isFunction(rule.prompt)
+ ? rule.prompt(value)
+ : rule.prompt || settings.prompt[ruleName] || settings.text.unspecifiedRule,
+ requiresValue = (prompt.search('{value}') !== -1),
+ requiresName = (prompt.search('{name}') !== -1),
+ $label,
+ name,
+ parts,
+ suffixPrompt
+ ;
+ if(ancillary && ancillary.indexOf('..') >= 0) {
+ parts = ancillary.split('..', 2);
+ if(!rule.prompt) {
+ suffixPrompt = (
+ parts[0] === '' ? settings.prompt.maxValue.replace(/\{ruleValue\}/g,'{max}') :
+ parts[1] === '' ? settings.prompt.minValue.replace(/\{ruleValue\}/g,'{min}') :
+ settings.prompt.range
+ );
+ prompt += suffixPrompt.replace(/\{name\}/g, ' ' + settings.text.and);
+ }
+ prompt = prompt.replace(/\{min\}/g, parts[0]);
+ prompt = prompt.replace(/\{max\}/g, parts[1]);
+ }
+ if(requiresValue) {
+ prompt = prompt.replace(/\{value\}/g, $field.val());
+ }
+ if(requiresName) {
+ $label = $field.closest(selector.group).find('label').eq(0);
+ name = ($label.length == 1)
+ ? $label.text()
+ : $field.prop('placeholder') || settings.text.unspecifiedField
+ ;
+ prompt = prompt.replace(/\{name\}/g, name);
+ }
+ prompt = prompt.replace(/\{identifier\}/g, field.identifier);
+ prompt = prompt.replace(/\{ruleValue\}/g, ancillary);
+ if(!rule.prompt) {
+ module.verbose('Using default validation prompt for type', prompt, ruleName);
+ }
+ return prompt;
+ },
+ settings: function() {
+ if($.isPlainObject(parameters)) {
+ var
+ keys = Object.keys(parameters),
+ isLegacySettings = (keys.length > 0)
+ ? (parameters[keys[0]].identifier !== undefined && parameters[keys[0]].rules !== undefined)
+ : false
+ ;
+ if(isLegacySettings) {
+ // 1.x (ducktyped)
+ settings = $.extend(true, {}, $.fn.form.settings, legacyParameters);
+ validation = $.extend({}, $.fn.form.settings.defaults, parameters);
+ module.error(settings.error.oldSyntax, element);
+ module.verbose('Extending settings from legacy parameters', validation, settings);
+ }
+ else {
+ // 2.x
+ if(parameters.fields) {
+ parameters.fields = module.get.fieldsFromShorthand(parameters.fields);
+ }
+ settings = $.extend(true, {}, $.fn.form.settings, parameters);
+ validation = $.extend({}, $.fn.form.settings.defaults, settings.fields);
+ module.verbose('Extending settings', validation, settings);
+ }
+ }
+ else {
+ settings = $.fn.form.settings;
+ validation = $.fn.form.settings.defaults;
+ module.verbose('Using default form validation', validation, settings);
+ }
+
+ // shorthand
+ namespace = settings.namespace;
+ metadata = settings.metadata;
+ selector = settings.selector;
+ className = settings.className;
+ regExp = settings.regExp;
+ error = settings.error;
+ moduleNamespace = 'module-' + namespace;
+ eventNamespace = '.' + namespace;
+
+ // grab instance
+ instance = $module.data(moduleNamespace);
+
+ // refresh selector cache
+ (instance || module).refresh();
+ },
+ field: function(identifier) {
+ module.verbose('Finding field with identifier', identifier);
+ identifier = module.escape.string(identifier);
+ var t;
+ if((t=$field.filter('#' + identifier)).length > 0 ) {
+ return t;
+ }
+ if((t=$field.filter('[name="' + identifier +'"]')).length > 0 ) {
+ return t;
+ }
+ if((t=$field.filter('[name="' + identifier +'[]"]')).length > 0 ) {
+ return t;
+ }
+ if((t=$field.filter('[data-' + metadata.validate + '="'+ identifier +'"]')).length > 0 ) {
+ return t;
+ }
+ return $(' ');
+ },
+ fields: function(fields) {
+ var
+ $fields = $()
+ ;
+ $.each(fields, function(index, name) {
+ $fields = $fields.add( module.get.field(name) );
+ });
+ return $fields;
+ },
+ validation: function($field) {
+ var
+ fieldValidation,
+ identifier
+ ;
+ if(!validation) {
+ return false;
+ }
+ $.each(validation, function(fieldName, field) {
+ identifier = field.identifier || fieldName;
+ $.each(module.get.field(identifier), function(index, groupField) {
+ if(groupField == $field[0]) {
+ field.identifier = identifier;
+ fieldValidation = field;
+ return false;
+ }
+ });
+ });
+ return fieldValidation || false;
+ },
+ value: function (field) {
+ var
+ fields = [],
+ results
+ ;
+ fields.push(field);
+ results = module.get.values.call(element, fields);
+ return results[field];
+ },
+ values: function (fields) {
+ var
+ $fields = Array.isArray(fields)
+ ? module.get.fields(fields)
+ : $field,
+ values = {}
+ ;
+ $fields.each(function(index, field) {
+ var
+ $field = $(field),
+ $calendar = $field.closest(selector.uiCalendar),
+ name = $field.prop('name'),
+ value = $field.val(),
+ isCheckbox = $field.is(selector.checkbox),
+ isRadio = $field.is(selector.radio),
+ isMultiple = (name.indexOf('[]') !== -1),
+ isCalendar = ($calendar.length > 0 && module.can.useElement('calendar')),
+ isChecked = (isCheckbox)
+ ? $field.is(':checked')
+ : false
+ ;
+ if(name) {
+ if(isMultiple) {
+ name = name.replace('[]', '');
+ if(!values[name]) {
+ values[name] = [];
+ }
+ if(isCheckbox) {
+ if(isChecked) {
+ values[name].push(value || true);
+ }
+ else {
+ values[name].push(false);
+ }
+ }
+ else {
+ values[name].push(value);
+ }
+ }
+ else {
+ if(isRadio) {
+ if(values[name] === undefined || values[name] === false) {
+ values[name] = (isChecked)
+ ? value || true
+ : false
+ ;
+ }
+ }
+ else if(isCheckbox) {
+ if(isChecked) {
+ values[name] = value || true;
+ }
+ else {
+ values[name] = false;
+ }
+ }
+ else if(isCalendar) {
+ var date = $calendar.calendar('get date');
+
+ if (date !== null) {
+ if (settings.dateHandling == 'date') {
+ values[name] = date;
+ } else if(settings.dateHandling == 'input') {
+ values[name] = $calendar.calendar('get input date')
+ } else if (settings.dateHandling == 'formatter') {
+ var type = $calendar.calendar('setting', 'type');
+
+ switch(type) {
+ case 'date':
+ values[name] = settings.formatter.date(date);
+ break;
+
+ case 'datetime':
+ values[name] = settings.formatter.datetime(date);
+ break;
+
+ case 'time':
+ values[name] = settings.formatter.time(date);
+ break;
+
+ case 'month':
+ values[name] = settings.formatter.month(date);
+ break;
+
+ case 'year':
+ values[name] = settings.formatter.year(date);
+ break;
+
+ default:
+ module.debug('Wrong calendar mode', $calendar, type);
+ values[name] = '';
+ }
+ }
+ } else {
+ values[name] = '';
+ }
+ } else {
+ values[name] = value;
+ }
+ }
+ }
+ });
+ return values;
+ },
+ dirtyFields: function() {
+ return $field.filter(function(index, e) {
+ return $(e).data(metadata.isDirty);
+ });
+ }
+ },
+
+ has: {
+
+ field: function(identifier) {
+ module.verbose('Checking for existence of a field with identifier', identifier);
+ identifier = module.escape.string(identifier);
+ if(typeof identifier !== 'string') {
+ module.error(error.identifier, identifier);
+ }
+ if($field.filter('#' + identifier).length > 0 ) {
+ return true;
+ }
+ else if( $field.filter('[name="' + identifier +'"]').length > 0 ) {
+ return true;
+ }
+ else if( $field.filter('[data-' + metadata.validate + '="'+ identifier +'"]').length > 0 ) {
+ return true;
+ }
+ return false;
+ }
+
+ },
+
+ can: {
+ useElement: function(element){
+ if ($.fn[element] !== undefined) {
+ return true;
+ }
+ module.error(error.noElement.replace('{element}',element));
+ return false;
+ }
+ },
+
+ escape: {
+ string: function(text) {
+ text = String(text);
+ return text.replace(regExp.escape, '\\$&');
+ }
+ },
+
+ add: {
+ // alias
+ rule: function(name, rules) {
+ module.add.field(name, rules);
+ },
+ field: function(name, rules) {
+ // Validation should have at least a standard format
+ if(validation[name] === undefined || validation[name].rules === undefined) {
+ validation[name] = {
+ rules: []
+ };
+ }
+ var
+ newValidation = {
+ rules: []
+ }
+ ;
+ if(module.is.shorthandRules(rules)) {
+ rules = Array.isArray(rules)
+ ? rules
+ : [rules]
+ ;
+ $.each(rules, function(_index, rule) {
+ newValidation.rules.push({ type: rule });
+ });
+ }
+ else {
+ newValidation.rules = rules.rules;
+ }
+ // For each new rule, check if there's not already one with the same type
+ $.each(newValidation.rules, function (_index, rule) {
+ if ($.grep(validation[name].rules, function(item){ return item.type == rule.type; }).length == 0) {
+ validation[name].rules.push(rule);
+ }
+ });
+ module.debug('Adding rules', newValidation.rules, validation);
+ },
+ fields: function(fields) {
+ validation = $.extend({}, validation, module.get.fieldsFromShorthand(fields));
+ },
+ prompt: function(identifier, errors, internal) {
+ var
+ $field = module.get.field(identifier),
+ $fieldGroup = $field.closest($group),
+ $prompt = $fieldGroup.children(selector.prompt),
+ promptExists = ($prompt.length !== 0)
+ ;
+ errors = (typeof errors == 'string')
+ ? [errors]
+ : errors
+ ;
+ module.verbose('Adding field error state', identifier);
+ if(!internal) {
+ $fieldGroup
+ .addClass(className.error)
+ ;
+ }
+ if(settings.inline) {
+ if(!promptExists) {
+ $prompt = settings.templates.prompt(errors, className.label);
+ $prompt
+ .appendTo($fieldGroup)
+ ;
+ }
+ $prompt
+ .html(errors[0])
+ ;
+ if(!promptExists) {
+ if(settings.transition && module.can.useElement('transition') && $module.transition('is supported')) {
+ module.verbose('Displaying error with css transition', settings.transition);
+ $prompt.transition(settings.transition + ' in', settings.duration);
+ }
+ else {
+ module.verbose('Displaying error with fallback javascript animation');
+ $prompt
+ .fadeIn(settings.duration)
+ ;
+ }
+ }
+ else {
+ module.verbose('Inline errors are disabled, no inline error added', identifier);
+ }
+ }
+ },
+ errors: function(errors) {
+ module.debug('Adding form error messages', errors);
+ module.set.error();
+ $message
+ .html( settings.templates.error(errors) )
+ ;
+ }
+ },
+
+ remove: {
+ errors: function() {
+ module.debug('Removing form error messages');
+ $message.empty();
+ },
+ states: function() {
+ $module.removeClass(className.error).removeClass(className.success);
+ if(!settings.inline) {
+ module.remove.errors();
+ }
+ module.determine.isDirty();
+ },
+ rule: function(field, rule) {
+ var
+ rules = Array.isArray(rule)
+ ? rule
+ : [rule]
+ ;
+ if(validation[field] === undefined || !Array.isArray(validation[field].rules)) {
+ return;
+ }
+ if(rule === undefined) {
+ module.debug('Removed all rules');
+ validation[field].rules = [];
+ return;
+ }
+ $.each(validation[field].rules, function(index, rule) {
+ if(rule && rules.indexOf(rule.type) !== -1) {
+ module.debug('Removed rule', rule.type);
+ validation[field].rules.splice(index, 1);
+ }
+ });
+ },
+ field: function(field) {
+ var
+ fields = Array.isArray(field)
+ ? field
+ : [field]
+ ;
+ $.each(fields, function(index, field) {
+ module.remove.rule(field);
+ });
+ },
+ // alias
+ rules: function(field, rules) {
+ if(Array.isArray(field)) {
+ $.each(field, function(index, field) {
+ module.remove.rule(field, rules);
+ });
+ }
+ else {
+ module.remove.rule(field, rules);
+ }
+ },
+ fields: function(fields) {
+ module.remove.field(fields);
+ },
+ prompt: function(identifier) {
+ var
+ $field = module.get.field(identifier),
+ $fieldGroup = $field.closest($group),
+ $prompt = $fieldGroup.children(selector.prompt)
+ ;
+ $fieldGroup
+ .removeClass(className.error)
+ ;
+ if(settings.inline && $prompt.is(':visible')) {
+ module.verbose('Removing prompt for field', identifier);
+ if(settings.transition && module.can.useElement('transition') && $module.transition('is supported')) {
+ $prompt.transition(settings.transition + ' out', settings.duration, function() {
+ $prompt.remove();
+ });
+ }
+ else {
+ $prompt
+ .fadeOut(settings.duration, function(){
+ $prompt.remove();
+ })
+ ;
+ }
+ }
+ }
+ },
+
+ set: {
+ success: function() {
+ $module
+ .removeClass(className.error)
+ .addClass(className.success)
+ ;
+ },
+ defaults: function () {
+ $field.each(function (index, el) {
+ var
+ $el = $(el),
+ $parent = $el.parent(),
+ isCheckbox = ($el.filter(selector.checkbox).length > 0),
+ isDropdown = $parent.is(selector.uiDropdown) && module.can.useElement('dropdown'),
+ $calendar = $el.closest(selector.uiCalendar),
+ isCalendar = ($calendar.length > 0 && module.can.useElement('calendar')),
+ value = (isCheckbox)
+ ? $el.is(':checked')
+ : $el.val()
+ ;
+ if (isDropdown) {
+ $parent.dropdown('save defaults');
+ }
+ else if (isCalendar) {
+ $calendar.calendar('refresh');
+ }
+ $el.data(metadata.defaultValue, value);
+ $el.data(metadata.isDirty, false);
+ });
+ },
+ error: function() {
+ $module
+ .removeClass(className.success)
+ .addClass(className.error)
+ ;
+ },
+ value: function (field, value) {
+ var
+ fields = {}
+ ;
+ fields[field] = value;
+ return module.set.values.call(element, fields);
+ },
+ values: function (fields) {
+ if($.isEmptyObject(fields)) {
+ return;
+ }
+ $.each(fields, function(key, value) {
+ var
+ $field = module.get.field(key),
+ $element = $field.parent(),
+ $calendar = $field.closest(selector.uiCalendar),
+ isMultiple = Array.isArray(value),
+ isCheckbox = $element.is(selector.uiCheckbox) && module.can.useElement('checkbox'),
+ isDropdown = $element.is(selector.uiDropdown) && module.can.useElement('dropdown'),
+ isRadio = ($field.is(selector.radio) && isCheckbox),
+ isCalendar = ($calendar.length > 0 && module.can.useElement('calendar')),
+ fieldExists = ($field.length > 0),
+ $multipleField
+ ;
+ if(fieldExists) {
+ if(isMultiple && isCheckbox) {
+ module.verbose('Selecting multiple', value, $field);
+ $element.checkbox('uncheck');
+ $.each(value, function(index, value) {
+ $multipleField = $field.filter('[value="' + value + '"]');
+ $element = $multipleField.parent();
+ if($multipleField.length > 0) {
+ $element.checkbox('check');
+ }
+ });
+ }
+ else if(isRadio) {
+ module.verbose('Selecting radio value', value, $field);
+ $field.filter('[value="' + value + '"]')
+ .parent(selector.uiCheckbox)
+ .checkbox('check')
+ ;
+ }
+ else if(isCheckbox) {
+ module.verbose('Setting checkbox value', value, $element);
+ if(value === true || value === 1) {
+ $element.checkbox('check');
+ }
+ else {
+ $element.checkbox('uncheck');
+ }
+ }
+ else if(isDropdown) {
+ module.verbose('Setting dropdown value', value, $element);
+ $element.dropdown('set selected', value);
+ }
+ else if (isCalendar) {
+ $calendar.calendar('set date',value);
+ }
+ else {
+ module.verbose('Setting field value', value, $field);
+ $field.val(value);
+ }
+ }
+ });
+ },
+ dirty: function() {
+ module.verbose('Setting state dirty');
+ dirty = true;
+ history[0] = history[1];
+ history[1] = 'dirty';
+
+ if (module.is.justClean()) {
+ $module.trigger('dirty');
+ }
+ },
+ clean: function() {
+ module.verbose('Setting state clean');
+ dirty = false;
+ history[0] = history[1];
+ history[1] = 'clean';
+
+ if (module.is.justDirty()) {
+ $module.trigger('clean');
+ }
+ },
+ asClean: function() {
+ module.set.defaults();
+ module.set.clean();
+ },
+ asDirty: function() {
+ module.set.defaults();
+ module.set.dirty();
+ },
+ autoCheck: function() {
+ module.debug('Enabling auto check on required fields');
+ $field.each(function (_index, el) {
+ var
+ $el = $(el),
+ $elGroup = $(el).closest($group),
+ isCheckbox = ($el.filter(selector.checkbox).length > 0),
+ isRequired = $el.prop('required') || $elGroup.hasClass(className.required) || $elGroup.parent().hasClass(className.required),
+ isDisabled = $el.is(':disabled') || $elGroup.hasClass(className.disabled) || $elGroup.parent().hasClass(className.disabled),
+ validation = module.get.validation($el),
+ hasEmptyRule = validation
+ ? $.grep(validation.rules, function(rule) { return rule.type == "empty" }) !== 0
+ : false,
+ identifier = validation.identifier || $el.attr('id') || $el.attr('name') || $el.data(metadata.validate)
+ ;
+ if (isRequired && !isDisabled && !hasEmptyRule && identifier !== undefined) {
+ if (isCheckbox) {
+ module.verbose("Adding 'checked' rule on field", identifier);
+ module.add.rule(identifier, "checked");
+ } else {
+ module.verbose("Adding 'empty' rule on field", identifier);
+ module.add.rule(identifier, "empty");
+ }
+ }
+ });
+ },
+ optional: function(identifier, bool) {
+ bool = (bool !== false);
+ $.each(validation, function(fieldName, field) {
+ if (identifier == fieldName || identifier == field.identifier) {
+ field.optional = bool;
+ }
+ });
+ }
+ },
+
+ validate: {
+
+ form: function(event, ignoreCallbacks) {
+ var values = module.get.values();
+
+ // input keydown event will fire submit repeatedly by browser default
+ if(keyHeldDown) {
+ return false;
+ }
+
+ // reset errors
+ formErrors = [];
+ if( module.determine.isValid() ) {
+ module.debug('Form has no validation errors, submitting');
+ module.set.success();
+ if(!settings.inline) {
+ module.remove.errors();
+ }
+ if(ignoreCallbacks !== true) {
+ return settings.onSuccess.call(element, event, values);
+ }
+ }
+ else {
+ module.debug('Form has errors');
+ submitting = false;
+ module.set.error();
+ if(!settings.inline) {
+ module.add.errors(formErrors);
+ }
+ // prevent ajax submit
+ if(event && $module.data('moduleApi') !== undefined) {
+ event.stopImmediatePropagation();
+ }
+ if(settings.errorFocus) {
+ var focusElement, hasTabIndex = true;
+ if (typeof settings.errorFocus === 'string') {
+ focusElement = $(settings.errorFocus);
+ hasTabIndex = focusElement.is('[tabindex]');
+ // to be able to focus/scroll into non input elements we need a tabindex
+ if (!hasTabIndex) {
+ focusElement.attr('tabindex',-1);
+ }
+ } else {
+ focusElement = $group.filter('.' + className.error).first().find(selector.field);
+ }
+ focusElement.focus();
+ // only remove tabindex if it was dynamically created above
+ if (!hasTabIndex){
+ focusElement.removeAttr('tabindex');
+ }
+ }
+ if(ignoreCallbacks !== true) {
+ return settings.onFailure.call(element, formErrors, values);
+ }
+ }
+ },
+
+ // takes a validation object and returns whether field passes validation
+ field: function(field, fieldName, showErrors) {
+ showErrors = (showErrors !== undefined)
+ ? showErrors
+ : true
+ ;
+ if(typeof field == 'string') {
+ module.verbose('Validating field', field);
+ fieldName = field;
+ field = validation[field];
+ }
+ var
+ identifier = field.identifier || fieldName,
+ $field = module.get.field(identifier),
+ $dependsField = (field.depends)
+ ? module.get.field(field.depends)
+ : false,
+ fieldValid = true,
+ fieldErrors = []
+ ;
+ if(!field.identifier) {
+ module.debug('Using field name as identifier', identifier);
+ field.identifier = identifier;
+ }
+ var isDisabled = !$field.filter(':not(:disabled)').length;
+ if(isDisabled) {
+ module.debug('Field is disabled. Skipping', identifier);
+ }
+ else if(field.optional && module.is.blank($field)){
+ module.debug('Field is optional and blank. Skipping', identifier);
+ }
+ else if(field.depends && module.is.empty($dependsField)) {
+ module.debug('Field depends on another value that is not present or empty. Skipping', $dependsField);
+ }
+ else if(field.rules !== undefined) {
+ if(showErrors) {
+ $field.closest($group).removeClass(className.error);
+ }
+ $.each(field.rules, function(index, rule) {
+ if( module.has.field(identifier)) {
+ var invalidFields = module.validate.rule(field, rule,true) || [];
+ if (invalidFields.length>0){
+ module.debug('Field is invalid', identifier, rule.type);
+ fieldErrors.push(module.get.prompt(rule, field));
+ fieldValid = false;
+ if(showErrors){
+ $(invalidFields).closest($group).addClass(className.error);
+ }
+ }
+ }
+ });
+ }
+ if(fieldValid) {
+ if(showErrors) {
+ module.remove.prompt(identifier, fieldErrors);
+ settings.onValid.call($field);
+ }
+ }
+ else {
+ if(showErrors) {
+ formErrors = formErrors.concat(fieldErrors);
+ module.add.prompt(identifier, fieldErrors, true);
+ settings.onInvalid.call($field, fieldErrors);
+ }
+ return false;
+ }
+ return true;
+ },
+
+ // takes validation rule and returns whether field passes rule
+ rule: function(field, rule, internal) {
+ var
+ $field = module.get.field(field.identifier),
+ ancillary = module.get.ancillaryValue(rule),
+ ruleName = module.get.ruleName(rule),
+ ruleFunction = settings.rules[ruleName],
+ invalidFields = [],
+ isCheckbox = $field.is(selector.checkbox),
+ isValid = function(field){
+ var value = (isCheckbox ? $(field).filter(':checked').val() : $(field).val());
+ // cast to string avoiding encoding special values
+ value = (value === undefined || value === '' || value === null)
+ ? ''
+ : (settings.shouldTrim && rule.shouldTrim !== false) || rule.shouldTrim ? String(value + '').trim() : String(value + '')
+ ;
+ return ruleFunction.call(field, value, ancillary, $module);
+ }
+ ;
+ if( !$.isFunction(ruleFunction) ) {
+ module.error(error.noRule, ruleName);
+ return;
+ }
+ if(isCheckbox) {
+ if (!isValid($field)) {
+ invalidFields = $field;
+ }
+ } else {
+ $.each($field, function (index, field) {
+ if (!isValid(field)) {
+ invalidFields.push(field);
+ }
+ });
+ }
+ return internal ? invalidFields : !(invalidFields.length>0);
+ }
+ },
+
+ setting: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ settings[name] = value;
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if($allModules.length > 1) {
+ title += ' ' + '(' + $allModules.length + ')';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ return false;
+ }
+ });
+ }
+ if( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+ module.initialize();
+ })
+ ;
+
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.fn.form.settings = {
+
+ name : 'Form',
+ namespace : 'form',
+
+ debug : false,
+ verbose : false,
+ performance : true,
+
+ fields : false,
+
+ keyboardShortcuts : true,
+ on : 'submit',
+ inline : false,
+
+ delay : 200,
+ revalidate : true,
+ shouldTrim : true,
+
+ transition : 'scale',
+ duration : 200,
+
+ autoCheckRequired : false,
+ preventLeaving : false,
+ errorFocus : false,
+ dateHandling : 'date', // 'date', 'input', 'formatter'
+
+ onValid : function() {},
+ onInvalid : function() {},
+ onSuccess : function() { return true; },
+ onFailure : function() { return false; },
+ onDirty : function() {},
+ onClean : function() {},
+
+ metadata : {
+ defaultValue : 'default',
+ validate : 'validate',
+ isDirty : 'isDirty'
+ },
+
+ regExp: {
+ htmlID : /^[a-zA-Z][\w:.-]*$/g,
+ bracket : /\[(.*)\]/i,
+ decimal : /^\d+\.?\d*$/,
+ email : /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i,
+ escape : /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|:,=@]/g,
+ flags : /^\/(.*)\/(.*)?/,
+ integer : /^\-?\d+$/,
+ number : /^\-?\d*(\.\d+)?$/,
+ url : /(https?:\/\/(?:www\.|(?!www))[^\s\.]+\.[^\s]{2,}|www\.[^\s]+\.[^\s]{2,})/i
+ },
+
+ text: {
+ and : 'and',
+ unspecifiedRule : 'Please enter a valid value',
+ unspecifiedField : 'This field',
+ leavingMessage : 'There are unsaved changes on this page which will be discarded if you continue.'
+ },
+
+ prompt: {
+ range : '{name} must be in a range from {min} to {max}',
+ maxValue : '{name} must have a maximum value of {ruleValue}',
+ minValue : '{name} must have a minimum value of {ruleValue}',
+ empty : '{name} must have a value',
+ checked : '{name} must be checked',
+ email : '{name} must be a valid e-mail',
+ url : '{name} must be a valid url',
+ regExp : '{name} is not formatted correctly',
+ integer : '{name} must be an integer',
+ decimal : '{name} must be a decimal number',
+ number : '{name} must be set to a number',
+ is : '{name} must be "{ruleValue}"',
+ isExactly : '{name} must be exactly "{ruleValue}"',
+ not : '{name} cannot be set to "{ruleValue}"',
+ notExactly : '{name} cannot be set to exactly "{ruleValue}"',
+ contain : '{name} must contain "{ruleValue}"',
+ containExactly : '{name} must contain exactly "{ruleValue}"',
+ doesntContain : '{name} cannot contain "{ruleValue}"',
+ doesntContainExactly : '{name} cannot contain exactly "{ruleValue}"',
+ minLength : '{name} must be at least {ruleValue} characters',
+ length : '{name} must be at least {ruleValue} characters',
+ exactLength : '{name} must be exactly {ruleValue} characters',
+ maxLength : '{name} cannot be longer than {ruleValue} characters',
+ match : '{name} must match {ruleValue} field',
+ different : '{name} must have a different value than {ruleValue} field',
+ creditCard : '{name} must be a valid credit card number',
+ minCount : '{name} must have at least {ruleValue} choices',
+ exactCount : '{name} must have exactly {ruleValue} choices',
+ maxCount : '{name} must have {ruleValue} or less choices'
+ },
+
+ selector : {
+ checkbox : 'input[type="checkbox"], input[type="radio"]',
+ clear : '.clear',
+ field : 'input:not(.search):not([type="file"]), textarea, select',
+ group : '.field',
+ input : 'input:not([type="file"])',
+ message : '.error.message',
+ prompt : '.prompt.label',
+ radio : 'input[type="radio"]',
+ reset : '.reset:not([type="reset"])',
+ submit : '.submit:not([type="submit"])',
+ uiCheckbox : '.ui.checkbox',
+ uiDropdown : '.ui.dropdown',
+ uiCalendar : '.ui.calendar'
+ },
+
+ className : {
+ error : 'error',
+ label : 'ui basic red pointing prompt label',
+ pressed : 'down',
+ success : 'success',
+ required : 'required',
+ disabled : 'disabled'
+ },
+
+ error: {
+ identifier : 'You must specify a string identifier for each field',
+ method : 'The method you called is not defined.',
+ noRule : 'There is no rule matching the one you specified',
+ oldSyntax : 'Starting in 2.0 forms now only take a single settings object. Validation settings converted to new syntax automatically.',
+ noElement : 'This module requires ui {element}'
+ },
+
+ templates: {
+
+ // template that produces error message
+ error: function(errors) {
+ var
+ html = ''
+ ;
+ $.each(errors, function(index, value) {
+ html += '' + value + ' ';
+ });
+ html += ' ';
+ return $(html);
+ },
+
+ // template that produces label
+ prompt: function(errors, labelClasses) {
+ return $('
')
+ .addClass(labelClasses)
+ .html(errors[0])
+ ;
+ }
+ },
+
+ formatter: {
+ date: function(date) {
+ return Intl.DateTimeFormat('en-GB').format(date);
+ },
+ datetime: function(date) {
+ return Intl.DateTimeFormat('en-GB', {
+ year: "numeric",
+ month: "2-digit",
+ day: "2-digit",
+ hour: '2-digit',
+ minute: '2-digit',
+ second: '2-digit'
+ }).format(date);
+ },
+ time: function(date) {
+ return Intl.DateTimeFormat('en-GB', {
+ hour: '2-digit',
+ minute: '2-digit',
+ second: '2-digit'
+ }).format(date);
+ },
+ month: function(date) {
+ return Intl.DateTimeFormat('en-GB', {
+ month: '2-digit',
+ year: 'numeric'
+ }).format(date);
+ },
+ year: function(date) {
+ return Intl.DateTimeFormat('en-GB', {
+ year: 'numeric'
+ }).format(date);
+ }
+ },
+
+ rules: {
+
+ // is not empty or blank string
+ empty: function(value) {
+ return !(value === undefined || '' === value || Array.isArray(value) && value.length === 0);
+ },
+
+ // checkbox checked
+ checked: function() {
+ return ($(this).filter(':checked').length > 0);
+ },
+
+ // is most likely an email
+ email: function(value){
+ return $.fn.form.settings.regExp.email.test(value);
+ },
+
+ // value is most likely url
+ url: function(value) {
+ return $.fn.form.settings.regExp.url.test(value);
+ },
+
+ // matches specified regExp
+ regExp: function(value, regExp) {
+ if(regExp instanceof RegExp) {
+ return value.match(regExp);
+ }
+ var
+ regExpParts = regExp.match($.fn.form.settings.regExp.flags),
+ flags
+ ;
+ // regular expression specified as /baz/gi (flags)
+ if(regExpParts) {
+ regExp = (regExpParts.length >= 2)
+ ? regExpParts[1]
+ : regExp
+ ;
+ flags = (regExpParts.length >= 3)
+ ? regExpParts[2]
+ : ''
+ ;
+ }
+ return value.match( new RegExp(regExp, flags) );
+ },
+ minValue: function(value, range) {
+ return $.fn.form.settings.rules.range(value, range+'..', 'number');
+ },
+ maxValue: function(value, range) {
+ return $.fn.form.settings.rules.range(value, '..'+range, 'number');
+ },
+ // is valid integer or matches range
+ integer: function(value, range) {
+ return $.fn.form.settings.rules.range(value, range, 'integer');
+ },
+ range: function(value, range, regExp) {
+ if(typeof regExp == "string") {
+ regExp = $.fn.form.settings.regExp[regExp];
+ }
+ if(!(regExp instanceof RegExp)) {
+ regExp = $.fn.form.settings.regExp.integer;
+ }
+ var
+ min,
+ max,
+ parts
+ ;
+ if( !range || ['', '..'].indexOf(range) !== -1) {
+ // do nothing
+ }
+ else if(range.indexOf('..') == -1) {
+ if(regExp.test(range)) {
+ min = max = range - 0;
+ }
+ }
+ else {
+ parts = range.split('..', 2);
+ if(regExp.test(parts[0])) {
+ min = parts[0] - 0;
+ }
+ if(regExp.test(parts[1])) {
+ max = parts[1] - 0;
+ }
+ }
+ return (
+ regExp.test(value) &&
+ (min === undefined || value >= min) &&
+ (max === undefined || value <= max)
+ );
+ },
+
+ // is valid number (with decimal)
+ decimal: function(value, range) {
+ return $.fn.form.settings.rules.range(value, range, 'decimal');
+ },
+
+ // is valid number
+ number: function(value, range) {
+ return $.fn.form.settings.rules.range(value, range, 'number');
+ },
+
+ // is value (case insensitive)
+ is: function(value, text) {
+ text = (typeof text == 'string')
+ ? text.toLowerCase()
+ : text
+ ;
+ value = (typeof value == 'string')
+ ? value.toLowerCase()
+ : value
+ ;
+ return (value == text);
+ },
+
+ // is value
+ isExactly: function(value, text) {
+ return (value == text);
+ },
+
+ // value is not another value (case insensitive)
+ not: function(value, notValue) {
+ value = (typeof value == 'string')
+ ? value.toLowerCase()
+ : value
+ ;
+ notValue = (typeof notValue == 'string')
+ ? notValue.toLowerCase()
+ : notValue
+ ;
+ return (value != notValue);
+ },
+
+ // value is not another value (case sensitive)
+ notExactly: function(value, notValue) {
+ return (value != notValue);
+ },
+
+ // value contains text (insensitive)
+ contains: function(value, text) {
+ // escape regex characters
+ text = text.replace($.fn.form.settings.regExp.escape, "\\$&");
+ return (value.search( new RegExp(text, 'i') ) !== -1);
+ },
+
+ // value contains text (case sensitive)
+ containsExactly: function(value, text) {
+ // escape regex characters
+ text = text.replace($.fn.form.settings.regExp.escape, "\\$&");
+ return (value.search( new RegExp(text) ) !== -1);
+ },
+
+ // value contains text (insensitive)
+ doesntContain: function(value, text) {
+ // escape regex characters
+ text = text.replace($.fn.form.settings.regExp.escape, "\\$&");
+ return (value.search( new RegExp(text, 'i') ) === -1);
+ },
+
+ // value contains text (case sensitive)
+ doesntContainExactly: function(value, text) {
+ // escape regex characters
+ text = text.replace($.fn.form.settings.regExp.escape, "\\$&");
+ return (value.search( new RegExp(text) ) === -1);
+ },
+
+ // is at least string length
+ minLength: function(value, requiredLength) {
+ return (value !== undefined)
+ ? (value.length >= requiredLength)
+ : false
+ ;
+ },
+
+ // see rls notes for 2.0.6 (this is a duplicate of minLength)
+ length: function(value, requiredLength) {
+ return (value !== undefined)
+ ? (value.length >= requiredLength)
+ : false
+ ;
+ },
+
+ // is exactly length
+ exactLength: function(value, requiredLength) {
+ return (value !== undefined)
+ ? (value.length == requiredLength)
+ : false
+ ;
+ },
+
+ // is less than length
+ maxLength: function(value, maxLength) {
+ return (value !== undefined)
+ ? (value.length <= maxLength)
+ : false
+ ;
+ },
+
+ // matches another field
+ match: function(value, identifier, $module) {
+ var
+ matchingValue,
+ matchingElement
+ ;
+ if((matchingElement = $module.find('[data-validate="'+ identifier +'"]')).length > 0 ) {
+ matchingValue = matchingElement.val();
+ }
+ else if((matchingElement = $module.find('#' + identifier)).length > 0) {
+ matchingValue = matchingElement.val();
+ }
+ else if((matchingElement = $module.find('[name="' + identifier +'"]')).length > 0) {
+ matchingValue = matchingElement.val();
+ }
+ else if((matchingElement = $module.find('[name="' + identifier +'[]"]')).length > 0 ) {
+ matchingValue = matchingElement;
+ }
+ return (matchingValue !== undefined)
+ ? ( value.toString() == matchingValue.toString() )
+ : false
+ ;
+ },
+
+ // different than another field
+ different: function(value, identifier, $module) {
+ // use either id or name of field
+ var
+ matchingValue,
+ matchingElement
+ ;
+ if((matchingElement = $module.find('[data-validate="'+ identifier +'"]')).length > 0 ) {
+ matchingValue = matchingElement.val();
+ }
+ else if((matchingElement = $module.find('#' + identifier)).length > 0) {
+ matchingValue = matchingElement.val();
+ }
+ else if((matchingElement = $module.find('[name="' + identifier +'"]')).length > 0) {
+ matchingValue = matchingElement.val();
+ }
+ else if((matchingElement = $module.find('[name="' + identifier +'[]"]')).length > 0 ) {
+ matchingValue = matchingElement;
+ }
+ return (matchingValue !== undefined)
+ ? ( value.toString() !== matchingValue.toString() )
+ : false
+ ;
+ },
+
+ creditCard: function(cardNumber, cardTypes) {
+ var
+ cards = {
+ visa: {
+ pattern : /^4/,
+ length : [16]
+ },
+ amex: {
+ pattern : /^3[47]/,
+ length : [15]
+ },
+ mastercard: {
+ pattern : /^5[1-5]/,
+ length : [16]
+ },
+ discover: {
+ pattern : /^(6011|622(12[6-9]|1[3-9][0-9]|[2-8][0-9]{2}|9[0-1][0-9]|92[0-5]|64[4-9])|65)/,
+ length : [16]
+ },
+ unionPay: {
+ pattern : /^(62|88)/,
+ length : [16, 17, 18, 19]
+ },
+ jcb: {
+ pattern : /^35(2[89]|[3-8][0-9])/,
+ length : [16]
+ },
+ maestro: {
+ pattern : /^(5018|5020|5038|6304|6759|676[1-3])/,
+ length : [12, 13, 14, 15, 16, 17, 18, 19]
+ },
+ dinersClub: {
+ pattern : /^(30[0-5]|^36)/,
+ length : [14]
+ },
+ laser: {
+ pattern : /^(6304|670[69]|6771)/,
+ length : [16, 17, 18, 19]
+ },
+ visaElectron: {
+ pattern : /^(4026|417500|4508|4844|491(3|7))/,
+ length : [16]
+ }
+ },
+ valid = {},
+ validCard = false,
+ requiredTypes = (typeof cardTypes == 'string')
+ ? cardTypes.split(',')
+ : false,
+ unionPay,
+ validation
+ ;
+
+ if(typeof cardNumber !== 'string' || cardNumber.length === 0) {
+ return;
+ }
+
+ // allow dashes and spaces in card
+ cardNumber = cardNumber.replace(/[\s\-]/g, '');
+
+ // verify card types
+ if(requiredTypes) {
+ $.each(requiredTypes, function(index, type){
+ // verify each card type
+ validation = cards[type];
+ if(validation) {
+ valid = {
+ length : ($.inArray(cardNumber.length, validation.length) !== -1),
+ pattern : (cardNumber.search(validation.pattern) !== -1)
+ };
+ if(valid.length && valid.pattern) {
+ validCard = true;
+ }
+ }
+ });
+
+ if(!validCard) {
+ return false;
+ }
+ }
+
+ // skip luhn for UnionPay
+ unionPay = {
+ number : ($.inArray(cardNumber.length, cards.unionPay.length) !== -1),
+ pattern : (cardNumber.search(cards.unionPay.pattern) !== -1)
+ };
+ if(unionPay.number && unionPay.pattern) {
+ return true;
+ }
+
+ // verify luhn, adapted from
+ var
+ length = cardNumber.length,
+ multiple = 0,
+ producedValue = [
+ [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
+ [0, 2, 4, 6, 8, 1, 3, 5, 7, 9]
+ ],
+ sum = 0
+ ;
+ while (length--) {
+ sum += producedValue[multiple][parseInt(cardNumber.charAt(length), 10)];
+ multiple ^= 1;
+ }
+ return (sum % 10 === 0 && sum > 0);
+ },
+
+ minCount: function(value, minCount) {
+ if(minCount == 0) {
+ return true;
+ }
+ if(minCount == 1) {
+ return (value !== '');
+ }
+ return (value.split(',').length >= minCount);
+ },
+
+ exactCount: function(value, exactCount) {
+ if(exactCount == 0) {
+ return (value === '');
+ }
+ if(exactCount == 1) {
+ return (value !== '' && value.search(',') === -1);
+ }
+ return (value.split(',').length == exactCount);
+ },
+
+ maxCount: function(value, maxCount) {
+ if(maxCount == 0) {
+ return false;
+ }
+ if(maxCount == 1) {
+ return (value.search(',') === -1);
+ }
+ return (value.split(',').length <= maxCount);
+ }
+ }
+
+};
+
+})( jQuery, window, document );
+
+/*!
+ * # Fomantic-UI 2.8.8 - Accordion
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+'use strict';
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.accordion = function(parameters) {
+ var
+ $allModules = $(this),
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+
+ returnedValue
+ ;
+ $allModules
+ .each(function() {
+ var
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.fn.accordion.settings, parameters)
+ : $.extend({}, $.fn.accordion.settings),
+
+ className = settings.className,
+ namespace = settings.namespace,
+ selector = settings.selector,
+ error = settings.error,
+
+ eventNamespace = '.' + namespace,
+ moduleNamespace = 'module-' + namespace,
+ moduleSelector = $allModules.selector || '',
+
+ $module = $(this),
+ $title = $module.find(selector.title),
+ $content = $module.find(selector.content),
+
+ element = this,
+ instance = $module.data(moduleNamespace),
+ observer,
+ module
+ ;
+
+ module = {
+
+ initialize: function() {
+ module.debug('Initializing', $module);
+ module.bind.events();
+ if(settings.observeChanges) {
+ module.observeChanges();
+ }
+ module.instantiate();
+ },
+
+ instantiate: function() {
+ instance = module;
+ $module
+ .data(moduleNamespace, module)
+ ;
+ },
+
+ destroy: function() {
+ module.debug('Destroying previous instance', $module);
+ $module
+ .off(eventNamespace)
+ .removeData(moduleNamespace)
+ ;
+ },
+
+ refresh: function() {
+ $title = $module.find(selector.title);
+ $content = $module.find(selector.content);
+ },
+
+ observeChanges: function() {
+ if('MutationObserver' in window) {
+ observer = new MutationObserver(function(mutations) {
+ module.debug('DOM tree modified, updating selector cache');
+ module.refresh();
+ });
+ observer.observe(element, {
+ childList : true,
+ subtree : true
+ });
+ module.debug('Setting up mutation observer', observer);
+ }
+ },
+
+ bind: {
+ events: function() {
+ module.debug('Binding delegated events');
+ $module
+ .on(settings.on + eventNamespace, selector.trigger, module.event.click)
+ ;
+ }
+ },
+
+ event: {
+ click: function() {
+ module.toggle.call(this);
+ }
+ },
+
+ toggle: function(query) {
+ var
+ $activeTitle = (query !== undefined)
+ ? (typeof query === 'number')
+ ? $title.eq(query)
+ : $(query).closest(selector.title)
+ : $(this).closest(selector.title),
+ $activeContent = $activeTitle.next($content),
+ isAnimating = $activeContent.hasClass(className.animating),
+ isActive = $activeContent.hasClass(className.active),
+ isOpen = (isActive && !isAnimating),
+ isOpening = (!isActive && isAnimating)
+ ;
+ module.debug('Toggling visibility of content', $activeTitle);
+ if(isOpen || isOpening) {
+ if(settings.collapsible) {
+ module.close.call($activeTitle);
+ }
+ else {
+ module.debug('Cannot close accordion content collapsing is disabled');
+ }
+ }
+ else {
+ module.open.call($activeTitle);
+ }
+ },
+
+ open: function(query) {
+ var
+ $activeTitle = (query !== undefined)
+ ? (typeof query === 'number')
+ ? $title.eq(query)
+ : $(query).closest(selector.title)
+ : $(this).closest(selector.title),
+ $activeContent = $activeTitle.next($content),
+ isAnimating = $activeContent.hasClass(className.animating),
+ isActive = $activeContent.hasClass(className.active),
+ isOpen = (isActive || isAnimating)
+ ;
+ if(isOpen) {
+ module.debug('Accordion already open, skipping', $activeContent);
+ return;
+ }
+ module.debug('Opening accordion content', $activeTitle);
+ settings.onOpening.call($activeContent);
+ settings.onChanging.call($activeContent);
+ if(settings.exclusive) {
+ module.closeOthers.call($activeTitle);
+ }
+ $activeTitle
+ .addClass(className.active)
+ ;
+ $activeContent
+ .stop(true, true)
+ .addClass(className.animating)
+ ;
+ if(settings.animateChildren) {
+ if($.fn.transition !== undefined && $module.transition('is supported')) {
+ $activeContent
+ .children()
+ .transition({
+ animation : 'fade in',
+ queue : false,
+ useFailSafe : true,
+ debug : settings.debug,
+ verbose : settings.verbose,
+ duration : settings.duration,
+ skipInlineHidden : true,
+ onComplete: function() {
+ $activeContent.children().removeClass(className.transition);
+ }
+ })
+ ;
+ }
+ else {
+ $activeContent
+ .children()
+ .stop(true, true)
+ .animate({
+ opacity: 1
+ }, settings.duration, module.resetOpacity)
+ ;
+ }
+ }
+ $activeContent
+ .slideDown(settings.duration, settings.easing, function() {
+ $activeContent
+ .removeClass(className.animating)
+ .addClass(className.active)
+ ;
+ module.reset.display.call(this);
+ settings.onOpen.call(this);
+ settings.onChange.call(this);
+ })
+ ;
+ },
+
+ close: function(query) {
+ var
+ $activeTitle = (query !== undefined)
+ ? (typeof query === 'number')
+ ? $title.eq(query)
+ : $(query).closest(selector.title)
+ : $(this).closest(selector.title),
+ $activeContent = $activeTitle.next($content),
+ isAnimating = $activeContent.hasClass(className.animating),
+ isActive = $activeContent.hasClass(className.active),
+ isOpening = (!isActive && isAnimating),
+ isClosing = (isActive && isAnimating)
+ ;
+ if((isActive || isOpening) && !isClosing) {
+ module.debug('Closing accordion content', $activeContent);
+ settings.onClosing.call($activeContent);
+ settings.onChanging.call($activeContent);
+ $activeTitle
+ .removeClass(className.active)
+ ;
+ $activeContent
+ .stop(true, true)
+ .addClass(className.animating)
+ ;
+ if(settings.animateChildren) {
+ if($.fn.transition !== undefined && $module.transition('is supported')) {
+ $activeContent
+ .children()
+ .transition({
+ animation : 'fade out',
+ queue : false,
+ useFailSafe : true,
+ debug : settings.debug,
+ verbose : settings.verbose,
+ duration : settings.duration,
+ skipInlineHidden : true
+ })
+ ;
+ }
+ else {
+ $activeContent
+ .children()
+ .stop(true, true)
+ .animate({
+ opacity: 0
+ }, settings.duration, module.resetOpacity)
+ ;
+ }
+ }
+ $activeContent
+ .slideUp(settings.duration, settings.easing, function() {
+ $activeContent
+ .removeClass(className.animating)
+ .removeClass(className.active)
+ ;
+ module.reset.display.call(this);
+ settings.onClose.call(this);
+ settings.onChange.call(this);
+ })
+ ;
+ }
+ },
+
+ closeOthers: function(index) {
+ var
+ $activeTitle = (index !== undefined)
+ ? $title.eq(index)
+ : $(this).closest(selector.title),
+ $parentTitles = $activeTitle.parents(selector.content).prev(selector.title),
+ $activeAccordion = $activeTitle.closest(selector.accordion),
+ activeSelector = selector.title + '.' + className.active + ':visible',
+ activeContent = selector.content + '.' + className.active + ':visible',
+ $openTitles,
+ $nestedTitles,
+ $openContents
+ ;
+ if(settings.closeNested) {
+ $openTitles = $activeAccordion.find(activeSelector).not($parentTitles);
+ $openContents = $openTitles.next($content);
+ }
+ else {
+ $openTitles = $activeAccordion.find(activeSelector).not($parentTitles);
+ $nestedTitles = $activeAccordion.find(activeContent).find(activeSelector).not($parentTitles);
+ $openTitles = $openTitles.not($nestedTitles);
+ $openContents = $openTitles.next($content);
+ }
+ if( ($openTitles.length > 0) ) {
+ module.debug('Exclusive enabled, closing other content', $openTitles);
+ $openTitles
+ .removeClass(className.active)
+ ;
+ $openContents
+ .removeClass(className.animating)
+ .stop(true, true)
+ ;
+ if(settings.animateChildren) {
+ if($.fn.transition !== undefined && $module.transition('is supported')) {
+ $openContents
+ .children()
+ .transition({
+ animation : 'fade out',
+ useFailSafe : true,
+ debug : settings.debug,
+ verbose : settings.verbose,
+ duration : settings.duration,
+ skipInlineHidden : true
+ })
+ ;
+ }
+ else {
+ $openContents
+ .children()
+ .stop(true, true)
+ .animate({
+ opacity: 0
+ }, settings.duration, module.resetOpacity)
+ ;
+ }
+ }
+ $openContents
+ .slideUp(settings.duration , settings.easing, function() {
+ $(this).removeClass(className.active);
+ module.reset.display.call(this);
+ })
+ ;
+ }
+ },
+
+ reset: {
+
+ display: function() {
+ module.verbose('Removing inline display from element', this);
+ $(this).css('display', '');
+ if( $(this).attr('style') === '') {
+ $(this)
+ .attr('style', '')
+ .removeAttr('style')
+ ;
+ }
+ },
+
+ opacity: function() {
+ module.verbose('Removing inline opacity from element', this);
+ $(this).css('opacity', '');
+ if( $(this).attr('style') === '') {
+ $(this)
+ .attr('style', '')
+ .removeAttr('style')
+ ;
+ }
+ },
+
+ },
+
+ setting: function(name, value) {
+ module.debug('Changing setting', name, value);
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ if($.isPlainObject(settings[name])) {
+ $.extend(true, settings[name], value);
+ }
+ else {
+ settings[name] = value;
+ }
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ module.debug('Changing internal', name, value);
+ if(value !== undefined) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else {
+ module[name] = value;
+ }
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ module.error(error.method, query);
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ }
+ })
+ ;
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.fn.accordion.settings = {
+
+ name : 'Accordion',
+ namespace : 'accordion',
+
+ silent : false,
+ debug : false,
+ verbose : false,
+ performance : true,
+
+ on : 'click', // event on title that opens accordion
+
+ observeChanges : true, // whether accordion should automatically refresh on DOM insertion
+
+ exclusive : true, // whether a single accordion content panel should be open at once
+ collapsible : true, // whether accordion content can be closed
+ closeNested : false, // whether nested content should be closed when a panel is closed
+ animateChildren : true, // whether children opacity should be animated
+
+ duration : 350, // duration of animation
+ easing : 'easeOutQuad', // easing equation for animation
+
+ onOpening : function(){}, // callback before open animation
+ onClosing : function(){}, // callback before closing animation
+ onChanging : function(){}, // callback before closing or opening animation
+
+ onOpen : function(){}, // callback after open animation
+ onClose : function(){}, // callback after closing animation
+ onChange : function(){}, // callback after closing or opening animation
+
+ error: {
+ method : 'The method you called is not defined'
+ },
+
+ className : {
+ active : 'active',
+ animating : 'animating',
+ transition: 'transition'
+ },
+
+ selector : {
+ accordion : '.accordion',
+ title : '.title',
+ trigger : '.title',
+ content : '.content'
+ }
+
+};
+
+// Adds easing
+$.extend( $.easing, {
+ easeOutQuad: function (x, t, b, c, d) {
+ return -c *(t/=d)*(t-2) + b;
+ }
+});
+
+})( jQuery, window, document );
+
+
+/*!
+ * # Fomantic-UI 2.8.8 - Calendar
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+'use strict';
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.calendar = function(parameters) {
+ var
+ $allModules = $(this),
+
+ moduleSelector = $allModules.selector || '',
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+ returnedValue,
+ timeGapTable = {
+ '5': {'row': 4, 'column': 3 },
+ '10': {'row': 3, 'column': 2 },
+ '15': {'row': 2, 'column': 2 },
+ '20': {'row': 3, 'column': 1 },
+ '30': {'row': 2, 'column': 1 }
+ },
+ numberText = ['','one','two','three','four','five','six','seven','eight']
+ ;
+
+ $allModules
+ .each(function () {
+ var
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.fn.calendar.settings, parameters)
+ : $.extend({}, $.fn.calendar.settings),
+
+ className = settings.className,
+ namespace = settings.namespace,
+ selector = settings.selector,
+ formatter = settings.formatter,
+ parser = settings.parser,
+ metadata = settings.metadata,
+ timeGap = timeGapTable[settings.minTimeGap],
+ error = settings.error,
+
+ eventNamespace = '.' + namespace,
+ moduleNamespace = 'module-' + namespace,
+
+ $module = $(this),
+ $input = $module.find(selector.input),
+ $container = $module.find(selector.popup),
+ $activator = $module.find(selector.activator),
+
+ element = this,
+ instance = $module.data(moduleNamespace),
+
+ isTouch,
+ isTouchDown = false,
+ isInverted = $module.hasClass(className.inverted),
+ focusDateUsedForRange = false,
+ selectionComplete = false,
+ classObserver,
+ module
+ ;
+
+ module = {
+
+ initialize: function () {
+ module.debug('Initializing calendar for', element, $module);
+
+ isTouch = module.get.isTouch();
+ module.setup.config();
+ module.setup.popup();
+ module.setup.inline();
+ module.setup.input();
+ module.setup.date();
+ module.create.calendar();
+
+ module.bind.events();
+ module.observeChanges();
+ module.instantiate();
+ },
+
+ instantiate: function () {
+ module.verbose('Storing instance of calendar');
+ instance = module;
+ $module.data(moduleNamespace, instance);
+ },
+
+ destroy: function () {
+ module.verbose('Destroying previous calendar for', element);
+ $module.removeData(moduleNamespace);
+ module.unbind.events();
+ module.disconnect.classObserver();
+ },
+
+ setup: {
+ config: function () {
+ if (module.get.minDate() !== null) {
+ module.set.minDate($module.data(metadata.minDate));
+ }
+ if (module.get.maxDate() !== null) {
+ module.set.maxDate($module.data(metadata.maxDate));
+ }
+ module.setting('type', module.get.type());
+ module.setting('on', settings.on || ($input.length ? 'focus' : 'click'));
+ },
+ popup: function () {
+ if (settings.inline) {
+ return;
+ }
+ if (!$activator.length) {
+ $activator = $module.children().first();
+ if (!$activator.length) {
+ return;
+ }
+ }
+ if ($.fn.popup === undefined) {
+ module.error(error.popup);
+ return;
+ }
+ if (!$container.length) {
+ //prepend the popup element to the activator's parent so that it has less chance of messing with
+ //the styling (eg input action button needs to be the last child to have correct border radius)
+ var $activatorParent = $activator.parent(),
+ domPositionFunction = $activatorParent.closest(selector.append).length !== 0 ? 'appendTo' : 'prependTo';
+ $container = $('
').addClass(className.popup)[domPositionFunction]($activatorParent);
+ }
+ $container.addClass(className.calendar);
+ if(isInverted){
+ $container.addClass(className.inverted);
+ }
+ var onVisible = function () {
+ module.refreshTooltips();
+ return settings.onVisible.apply($container, arguments);
+ };
+ var onHidden = settings.onHidden;
+ if (!$input.length) {
+ //no input, $container has to handle focus/blur
+ $container.attr('tabindex', '0');
+ onVisible = function () {
+ module.refreshTooltips();
+ module.focus();
+ return settings.onVisible.apply($container, arguments);
+ };
+ onHidden = function () {
+ module.blur();
+ return settings.onHidden.apply($container, arguments);
+ };
+ }
+ var onShow = function () {
+ //reset the focus date onShow
+ module.set.focusDate(module.get.date());
+ module.set.mode(module.get.validatedMode(settings.startMode));
+ return settings.onShow.apply($container, arguments);
+ };
+ var on = module.setting('on');
+ var options = $.extend({}, settings.popupOptions, {
+ popup: $container,
+ on: on,
+ hoverable: on === 'hover',
+ closable: on === 'click',
+ onShow: onShow,
+ onVisible: onVisible,
+ onHide: settings.onHide,
+ onHidden: onHidden
+ });
+ module.popup(options);
+ },
+ inline: function () {
+ if ($activator.length && !settings.inline) {
+ return;
+ }
+ settings.inline = true;
+ $container = $('
').addClass(className.calendar).appendTo($module);
+ if (!$input.length) {
+ $container.attr('tabindex', '0');
+ }
+ },
+ input: function () {
+ if (settings.touchReadonly && $input.length && isTouch) {
+ $input.prop('readonly', true);
+ }
+ module.check.disabled();
+ },
+ date: function () {
+ var date;
+ if (settings.initialDate) {
+ date = parser.date(settings.initialDate, settings);
+ } else if ($module.data(metadata.date) !== undefined) {
+ date = parser.date($module.data(metadata.date), settings);
+ } else if ($input.length) {
+ date = parser.date($input.val(), settings);
+ }
+ module.set.date(date, settings.formatInput, false);
+ module.set.mode(module.get.mode(), false);
+ }
+ },
+
+ trigger: {
+ change: function() {
+ var
+ inputElement = $input[0]
+ ;
+ if(inputElement) {
+ var events = document.createEvent('HTMLEvents');
+ module.verbose('Triggering native change event');
+ events.initEvent('change', true, false);
+ inputElement.dispatchEvent(events);
+ }
+ }
+ },
+
+ create: {
+ calendar: function () {
+ var i, r, c, p, row, cell, pageGrid;
+
+ var
+ mode = module.get.mode(),
+ today = new Date(),
+ date = module.get.date(),
+ focusDate = module.get.focusDate(),
+ display = module.helper.dateInRange(focusDate || date || settings.initialDate || today)
+ ;
+
+ if (!focusDate) {
+ focusDate = display;
+ module.set.focusDate(focusDate, false, false);
+ }
+
+ var
+ isYear = mode === 'year',
+ isMonth = mode === 'month',
+ isDay = mode === 'day',
+ isHour = mode === 'hour',
+ isMinute = mode === 'minute',
+ isTimeOnly = settings.type === 'time'
+ ;
+
+ var multiMonth = Math.max(settings.multiMonth, 1);
+ var monthOffset = !isDay ? 0 : module.get.monthOffset();
+
+ var
+ minute = display.getMinutes(),
+ hour = display.getHours(),
+ day = display.getDate(),
+ startMonth = display.getMonth() + monthOffset,
+ year = display.getFullYear()
+ ;
+
+ var columns = isDay ? settings.showWeekNumbers ? 8 : 7 : isHour ? 4 : timeGap['column'];
+ var rows = isDay || isHour ? 6 : timeGap['row'];
+ var pages = isDay ? multiMonth : 1;
+
+ var container = $container;
+ var tooltipPosition = container.hasClass("left") ? "right center" : "left center";
+ container.empty();
+ if (pages > 1) {
+ pageGrid = $('
').addClass(className.grid).appendTo(container);
+ }
+
+ for (p = 0; p < pages; p++) {
+ if (pages > 1) {
+ var pageColumn = $('
').addClass(className.column).appendTo(pageGrid);
+ container = pageColumn;
+ }
+
+ var month = startMonth + p;
+ var firstMonthDayColumn = (new Date(year, month, 1).getDay() - settings.firstDayOfWeek % 7 + 7) % 7;
+ if (!settings.constantHeight && isDay) {
+ var requiredCells = new Date(year, month + 1, 0).getDate() + firstMonthDayColumn;
+ rows = Math.ceil(requiredCells / 7);
+ }
+
+ var
+ yearChange = isYear ? 10 : isMonth ? 1 : 0,
+ monthChange = isDay ? 1 : 0,
+ dayChange = isHour || isMinute ? 1 : 0,
+ prevNextDay = isHour || isMinute ? day : 1,
+ prevDate = new Date(year - yearChange, month - monthChange, prevNextDay - dayChange, hour),
+ nextDate = new Date(year + yearChange, month + monthChange, prevNextDay + dayChange, hour),
+ prevLast = isYear ? new Date(Math.ceil(year / 10) * 10 - 9, 0, 0) :
+ isMonth ? new Date(year, 0, 0) : isDay ? new Date(year, month, 0) : new Date(year, month, day, -1),
+ nextFirst = isYear ? new Date(Math.ceil(year / 10) * 10 + 1, 0, 1) :
+ isMonth ? new Date(year + 1, 0, 1) : isDay ? new Date(year, month + 1, 1) : new Date(year, month, day + 1)
+ ;
+
+ var tempMode = mode;
+ if (isDay && settings.showWeekNumbers){
+ tempMode += ' andweek';
+ }
+ var table = $('').addClass(className.table).addClass(tempMode).addClass(numberText[columns] + ' column').appendTo(container);
+ if(isInverted){
+ table.addClass(className.inverted);
+ }
+ var textColumns = columns;
+ //no header for time-only mode
+ if (!isTimeOnly) {
+ var thead = $(' ').appendTo(table);
+
+ row = $(' ').appendTo(thead);
+ cell = $(' ').attr('colspan', '' + columns).appendTo(row);
+
+ var headerDate = isYear || isMonth ? new Date(year, 0, 1) :
+ isDay ? new Date(year, month, 1) : new Date(year, month, day, hour, minute);
+ var headerText = $(' ').addClass(className.link).appendTo(cell);
+ headerText.text(formatter.header(headerDate, mode, settings));
+ var newMode = isMonth ? (settings.disableYear ? 'day' : 'year') :
+ isDay ? (settings.disableMonth ? 'year' : 'month') : 'day';
+ headerText.data(metadata.mode, newMode);
+
+ if (p === 0) {
+ var prev = $(' ').addClass(className.prev).appendTo(cell);
+ prev.data(metadata.focusDate, prevDate);
+ prev.toggleClass(className.disabledCell, !module.helper.isDateInRange(prevLast, mode));
+ $(' ').addClass(className.prevIcon).appendTo(prev);
+ }
+
+ if (p === pages - 1) {
+ var next = $(' ').addClass(className.next).appendTo(cell);
+ next.data(metadata.focusDate, nextDate);
+ next.toggleClass(className.disabledCell, !module.helper.isDateInRange(nextFirst, mode));
+ $(' ').addClass(className.nextIcon).appendTo(next);
+ }
+ if (isDay) {
+ row = $(' ').appendTo(thead);
+ if(settings.showWeekNumbers) {
+ cell = $(' ').appendTo(row);
+ cell.text(settings.text.weekNo);
+ cell.addClass(className.weekCell);
+ textColumns--;
+ }
+ for (i = 0; i < textColumns; i++) {
+ cell = $(' ').appendTo(row);
+ cell.text(formatter.dayColumnHeader((i + settings.firstDayOfWeek) % 7, settings));
+ }
+ }
+ }
+
+ var tbody = $(' ').appendTo(table);
+ i = isYear ? Math.ceil(year / 10) * 10 - 9 : isDay ? 1 - firstMonthDayColumn : 0;
+ for (r = 0; r < rows; r++) {
+ row = $(' ').appendTo(tbody);
+ if(isDay && settings.showWeekNumbers){
+ cell = $(' ').appendTo(row);
+ cell.text(module.get.weekOfYear(year,month,i+1-settings.firstDayOfWeek));
+ cell.addClass(className.weekCell);
+ }
+ for (c = 0; c < textColumns; c++, i++) {
+ var cellDate = isYear ? new Date(i, month, 1, hour, minute) :
+ isMonth ? new Date(year, i, 1, hour, minute) : isDay ? new Date(year, month, i, hour, minute) :
+ isHour ? new Date(year, month, day, i) : new Date(year, month, day, hour, i * settings.minTimeGap);
+ var cellText = isYear ? i :
+ isMonth ? settings.text.monthsShort[i] : isDay ? cellDate.getDate() :
+ formatter.time(cellDate, settings, true);
+ cell = $(' ').addClass(className.cell).appendTo(row);
+ cell.text(cellText);
+ cell.data(metadata.date, cellDate);
+ var adjacent = isDay && cellDate.getMonth() !== ((month + 12) % 12);
+ var disabled = (!settings.selectAdjacentDays && adjacent) || !module.helper.isDateInRange(cellDate, mode) || settings.isDisabled(cellDate, mode) || module.helper.isDisabled(cellDate, mode) || !module.helper.isEnabled(cellDate, mode);
+ var eventDate;
+ if (disabled) {
+ var disabledDate = module.helper.findDayAsObject(cellDate, mode, settings.disabledDates);
+ if (disabledDate !== null && disabledDate[metadata.message]) {
+ cell.attr("data-tooltip", disabledDate[metadata.message]);
+ cell.attr("data-position", disabledDate[metadata.position] || tooltipPosition);
+ if(disabledDate[metadata.inverted] || (isInverted && disabledDate[metadata.inverted] === undefined)) {
+ cell.attr("data-inverted", '');
+ }
+ if(disabledDate[metadata.variation]) {
+ cell.attr("data-variation", disabledDate[metadata.variation]);
+ }
+ }
+ } else {
+ eventDate = module.helper.findDayAsObject(cellDate, mode, settings.eventDates);
+ if (eventDate !== null) {
+ cell.addClass(eventDate[metadata.class] || settings.eventClass);
+ if (eventDate[metadata.message]) {
+ cell.attr("data-tooltip", eventDate[metadata.message]);
+ cell.attr("data-position", eventDate[metadata.position] || tooltipPosition);
+ if(eventDate[metadata.inverted] || (isInverted && eventDate[metadata.inverted] === undefined)) {
+ cell.attr("data-inverted", '');
+ }
+ if(eventDate[metadata.variation]) {
+ cell.attr("data-variation", eventDate[metadata.variation]);
+ }
+ }
+ }
+ }
+ var active = module.helper.dateEqual(cellDate, date, mode);
+ var isToday = module.helper.dateEqual(cellDate, today, mode);
+ cell.toggleClass(className.adjacentCell, adjacent && !eventDate);
+ cell.toggleClass(className.disabledCell, disabled);
+ cell.toggleClass(className.activeCell, active && !(adjacent && disabled));
+ if (!isHour && !isMinute) {
+ cell.toggleClass(className.todayCell, !adjacent && isToday);
+ }
+
+ // Allow for external modifications of each cell
+ var cellOptions = {
+ mode: mode,
+ adjacent: adjacent,
+ disabled: disabled,
+ active: active,
+ today: isToday
+ };
+ formatter.cell(cell, cellDate, cellOptions);
+
+ if (module.helper.dateEqual(cellDate, focusDate, mode)) {
+ //ensure that the focus date is exactly equal to the cell date
+ //so that, if selected, the correct value is set
+ module.set.focusDate(cellDate, false, false);
+ }
+ }
+ }
+
+ if (settings.today) {
+ var todayRow = $(' ').appendTo(tbody);
+ var todayButton = $(' ').attr('colspan', '' + columns).addClass(className.today).appendTo(todayRow);
+ todayButton.text(formatter.today(settings));
+ todayButton.data(metadata.date, today);
+ }
+
+ module.update.focus(false, table);
+
+ if(settings.inline){
+ module.refreshTooltips();
+ }
+ }
+ }
+ },
+
+ update: {
+ focus: function (updateRange, container) {
+ container = container || $container;
+ var mode = module.get.mode();
+ var date = module.get.date();
+ var focusDate = module.get.focusDate();
+ var startDate = module.get.startDate();
+ var endDate = module.get.endDate();
+ var rangeDate = (updateRange ? focusDate : null) || date || (!isTouch ? focusDate : null);
+
+ container.find('td').each(function () {
+ var cell = $(this);
+ var cellDate = cell.data(metadata.date);
+ if (!cellDate) {
+ return;
+ }
+ var disabled = cell.hasClass(className.disabledCell);
+ var active = cell.hasClass(className.activeCell);
+ var adjacent = cell.hasClass(className.adjacentCell);
+ var focused = module.helper.dateEqual(cellDate, focusDate, mode);
+ var inRange = !rangeDate ? false :
+ ((!!startDate && module.helper.isDateInRange(cellDate, mode, startDate, rangeDate)) ||
+ (!!endDate && module.helper.isDateInRange(cellDate, mode, rangeDate, endDate)));
+ cell.toggleClass(className.focusCell, focused && (!isTouch || isTouchDown) && (!adjacent || (settings.selectAdjacentDays && adjacent)) && !disabled);
+
+ if (module.helper.isTodayButton(cell)) {
+ return;
+ }
+ cell.toggleClass(className.rangeCell, inRange && !active && !disabled);
+ });
+ }
+ },
+
+ refresh: function () {
+ module.create.calendar();
+ },
+
+ refreshTooltips: function() {
+ var winWidth = $(window).width();
+ $container.find('td[data-position]').each(function () {
+ var cell = $(this);
+ var tooltipWidth = window.getComputedStyle(cell[0], ':after').width.replace(/[^0-9\.]/g,'');
+ var tooltipPosition = cell.attr('data-position');
+ // use a fallback width of 250 (calendar width) for IE/Edge (which return "auto")
+ var calcPosition = (winWidth - cell.width() - (parseInt(tooltipWidth,10) || 250)) > cell.offset().left ? 'right' : 'left';
+ if(tooltipPosition.indexOf(calcPosition) === -1) {
+ cell.attr('data-position',tooltipPosition.replace(/(left|right)/,calcPosition));
+ }
+ });
+ },
+
+ bind: {
+ events: function () {
+ module.debug('Binding events');
+ $container.on('mousedown' + eventNamespace, module.event.mousedown);
+ $container.on('touchstart' + eventNamespace, module.event.mousedown);
+ $container.on('mouseup' + eventNamespace, module.event.mouseup);
+ $container.on('touchend' + eventNamespace, module.event.mouseup);
+ $container.on('mouseover' + eventNamespace, module.event.mouseover);
+ if ($input.length) {
+ $input.on('input' + eventNamespace, module.event.inputChange);
+ $input.on('focus' + eventNamespace, module.event.inputFocus);
+ $input.on('blur' + eventNamespace, module.event.inputBlur);
+ $input.on('keydown' + eventNamespace, module.event.keydown);
+ } else {
+ $container.on('keydown' + eventNamespace, module.event.keydown);
+ }
+ }
+ },
+
+ unbind: {
+ events: function () {
+ module.debug('Unbinding events');
+ $container.off(eventNamespace);
+ if ($input.length) {
+ $input.off(eventNamespace);
+ }
+ }
+ },
+
+ event: {
+ mouseover: function (event) {
+ var target = $(event.target);
+ var date = target.data(metadata.date);
+ var mousedown = event.buttons === 1;
+ if (date) {
+ module.set.focusDate(date, false, true, mousedown);
+ }
+ },
+ mousedown: function (event) {
+ if ($input.length) {
+ //prevent the mousedown on the calendar causing the input to lose focus
+ event.preventDefault();
+ }
+ isTouchDown = event.type.indexOf('touch') >= 0;
+ var target = $(event.target);
+ var date = target.data(metadata.date);
+ if (date) {
+ module.set.focusDate(date, false, true, true);
+ }
+ },
+ mouseup: function (event) {
+ //ensure input has focus so that it receives keydown events for calendar navigation
+ module.focus();
+ event.preventDefault();
+ event.stopPropagation();
+ isTouchDown = false;
+ var target = $(event.target);
+ if (target.hasClass("disabled")) {
+ return;
+ }
+ var parent = target.parent();
+ if (parent.data(metadata.date) || parent.data(metadata.focusDate) || parent.data(metadata.mode)) {
+ //clicked on a child element, switch to parent (used when clicking directly on prev/next icon element)
+ target = parent;
+ }
+ var date = target.data(metadata.date);
+ var focusDate = target.data(metadata.focusDate);
+ var mode = target.data(metadata.mode);
+ if (date && settings.onSelect.call(element, date, module.get.mode()) !== false) {
+ var forceSet = target.hasClass(className.today);
+ module.selectDate(date, forceSet);
+ }
+ else if (focusDate) {
+ module.set.focusDate(focusDate);
+ }
+ else if (mode) {
+ module.set.mode(mode);
+ }
+ },
+ keydown: function (event) {
+ var keyCode = event.which;
+ if (keyCode === 27 || keyCode === 9) {
+ //esc || tab
+ module.popup('hide');
+ }
+
+ if (module.popup('is visible')) {
+ if (keyCode === 37 || keyCode === 38 || keyCode === 39 || keyCode === 40) {
+ //arrow keys
+ var mode = module.get.mode();
+ var bigIncrement = mode === 'day' ? 7 : mode === 'hour' ? 4 : mode === 'minute' ? timeGap['column'] : 3;
+ var increment = keyCode === 37 ? -1 : keyCode === 38 ? -bigIncrement : keyCode == 39 ? 1 : bigIncrement;
+ increment *= mode === 'minute' ? settings.minTimeGap : 1;
+ var focusDate = module.get.focusDate() || module.get.date() || new Date();
+ var year = focusDate.getFullYear() + (mode === 'year' ? increment : 0);
+ var month = focusDate.getMonth() + (mode === 'month' ? increment : 0);
+ var day = focusDate.getDate() + (mode === 'day' ? increment : 0);
+ var hour = focusDate.getHours() + (mode === 'hour' ? increment : 0);
+ var minute = focusDate.getMinutes() + (mode === 'minute' ? increment : 0);
+ var newFocusDate = new Date(year, month, day, hour, minute);
+ if (settings.type === 'time') {
+ newFocusDate = module.helper.mergeDateTime(focusDate, newFocusDate);
+ }
+ if (module.helper.isDateInRange(newFocusDate, mode)) {
+ module.set.focusDate(newFocusDate);
+ }
+ } else if (keyCode === 13) {
+ //enter
+ var mode = module.get.mode();
+ var date = module.get.focusDate();
+ if (date && !settings.isDisabled(date, mode) && !module.helper.isDisabled(date, mode) && module.helper.isEnabled(date, mode)) {
+ module.selectDate(date);
+ }
+ //disable form submission:
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+
+ if (keyCode === 38 || keyCode === 40) {
+ //arrow-up || arrow-down
+ event.preventDefault(); //don't scroll
+ module.popup('show');
+ }
+ },
+ inputChange: function () {
+ var val = $input.val();
+ var date = parser.date(val, settings);
+ module.set.date(date, false);
+ },
+ inputFocus: function () {
+ $container.addClass(className.active);
+ },
+ inputBlur: function () {
+ $container.removeClass(className.active);
+ if (settings.formatInput) {
+ var date = module.get.date();
+ var text = formatter.datetime(date, settings);
+ $input.val(text);
+ }
+ if(selectionComplete){
+ module.trigger.change();
+ selectionComplete = false;
+ }
+ },
+ class: {
+ mutation: function(mutations) {
+ mutations.forEach(function(mutation) {
+ if(mutation.attributeName === "class") {
+ module.check.disabled();
+ }
+ });
+ }
+ }
+ },
+
+ observeChanges: function() {
+ if('MutationObserver' in window) {
+ classObserver = new MutationObserver(module.event.class.mutation);
+ module.debug('Setting up mutation observer', classObserver);
+ module.observe.class();
+ }
+ },
+
+ disconnect: {
+ classObserver: function() {
+ if($input.length && classObserver) {
+ classObserver.disconnect();
+ }
+ }
+ },
+
+ observe: {
+ class: function() {
+ if($input.length && classObserver) {
+ classObserver.observe($module[0], {
+ attributes : true
+ });
+ }
+ }
+ },
+
+ is: {
+ disabled: function() {
+ return $module.hasClass(className.disabled);
+ }
+ },
+
+ check: {
+ disabled: function(){
+ $input.attr('tabindex',module.is.disabled() ? -1 : 0);
+ }
+ },
+
+ get: {
+ weekOfYear: function(weekYear,weekMonth,weekDay) {
+ // adapted from http://www.merlyn.demon.co.uk/weekcalc.htm
+ var ms1d = 864e5, // milliseconds in a day
+ ms7d = 7 * ms1d; // milliseconds in a week
+
+ return function() { // return a closure so constants get calculated only once
+ var DC3 = Date.UTC(weekYear, weekMonth, weekDay + 3) / ms1d, // an Absolute Day Number
+ AWN = Math.floor(DC3 / 7), // an Absolute Week Number
+ Wyr = new Date(AWN * ms7d).getUTCFullYear();
+
+ return AWN - Math.floor(Date.UTC(Wyr, 0, 7) / ms7d) + 1;
+ }();
+ },
+ date: function () {
+ return module.helper.sanitiseDate($module.data(metadata.date)) || null;
+ },
+ inputDate: function() {
+ return $input.val();
+ },
+ focusDate: function () {
+ return $module.data(metadata.focusDate) || null;
+ },
+ startDate: function () {
+ var startModule = module.get.calendarModule(settings.startCalendar);
+ return (startModule ? startModule.get.date() : $module.data(metadata.startDate)) || null;
+ },
+ endDate: function () {
+ var endModule = module.get.calendarModule(settings.endCalendar);
+ return (endModule ? endModule.get.date() : $module.data(metadata.endDate)) || null;
+ },
+ minDate: function() {
+ return $module.data(metadata.minDate) || null;
+ },
+ maxDate: function() {
+ return $module.data(metadata.maxDate) || null;
+ },
+ monthOffset: function () {
+ return $module.data(metadata.monthOffset) || 0;
+ },
+ mode: function () {
+ //only returns valid modes for the current settings
+ var mode = $module.data(metadata.mode) || settings.startMode;
+ return module.get.validatedMode(mode);
+ },
+ validatedMode: function(mode){
+ var validModes = module.get.validModes();
+ if ($.inArray(mode, validModes) >= 0) {
+ return mode;
+ }
+ return settings.type === 'time' ? 'hour' :
+ settings.type === 'month' ? 'month' :
+ settings.type === 'year' ? 'year' : 'day';
+ },
+ type: function() {
+ return $module.data(metadata.type) || settings.type;
+ },
+ validModes: function () {
+ var validModes = [];
+ if (settings.type !== 'time') {
+ if (!settings.disableYear || settings.type === 'year') {
+ validModes.push('year');
+ }
+ if (!(settings.disableMonth || settings.type === 'year') || settings.type === 'month') {
+ validModes.push('month');
+ }
+ if (settings.type.indexOf('date') >= 0) {
+ validModes.push('day');
+ }
+ }
+ if (settings.type.indexOf('time') >= 0) {
+ validModes.push('hour');
+ if (!settings.disableMinute) {
+ validModes.push('minute');
+ }
+ }
+ return validModes;
+ },
+ isTouch: function () {
+ try {
+ document.createEvent('TouchEvent');
+ return true;
+ }
+ catch (e) {
+ return false;
+ }
+ },
+ calendarModule: function (selector) {
+ if (!selector) {
+ return null;
+ }
+ if (!(selector instanceof $)) {
+ selector = $(selector).first();
+ }
+ //assume range related calendars are using the same namespace
+ return selector.data(moduleNamespace);
+ }
+ },
+
+ set: {
+ date: function (date, updateInput, fireChange) {
+ updateInput = updateInput !== false;
+ fireChange = fireChange !== false;
+ date = module.helper.sanitiseDate(date);
+ date = module.helper.dateInRange(date);
+
+ var mode = module.get.mode();
+ var text = formatter.datetime(date, settings);
+
+ if (fireChange && settings.onBeforeChange.call(element, date, text, mode) === false) {
+ return false;
+ }
+
+ module.set.focusDate(date);
+
+ if (settings.isDisabled(date, mode)) {
+ return false;
+ }
+
+ var endDate = module.get.endDate();
+ if (!!endDate && !!date && date > endDate) {
+ //selected date is greater than end date in range, so clear end date
+ module.set.endDate(undefined);
+ }
+ module.set.dataKeyValue(metadata.date, date);
+
+ if (updateInput && $input.length) {
+ $input.val(text);
+ }
+
+ if (fireChange) {
+ settings.onChange.call(element, date, text, mode);
+ }
+ },
+ startDate: function (date, refreshCalendar) {
+ date = module.helper.sanitiseDate(date);
+ var startModule = module.get.calendarModule(settings.startCalendar);
+ if (startModule) {
+ startModule.set.date(date);
+ }
+ module.set.dataKeyValue(metadata.startDate, date, refreshCalendar);
+ },
+ endDate: function (date, refreshCalendar) {
+ date = module.helper.sanitiseDate(date);
+ var endModule = module.get.calendarModule(settings.endCalendar);
+ if (endModule) {
+ endModule.set.date(date);
+ }
+ module.set.dataKeyValue(metadata.endDate, date, refreshCalendar);
+ },
+ focusDate: function (date, refreshCalendar, updateFocus, updateRange) {
+ date = module.helper.sanitiseDate(date);
+ date = module.helper.dateInRange(date);
+ var isDay = module.get.mode() === 'day';
+ var oldFocusDate = module.get.focusDate();
+ if (isDay && date && oldFocusDate) {
+ var yearDelta = date.getFullYear() - oldFocusDate.getFullYear();
+ var monthDelta = yearDelta * 12 + date.getMonth() - oldFocusDate.getMonth();
+ if (monthDelta) {
+ var monthOffset = module.get.monthOffset() - monthDelta;
+ module.set.monthOffset(monthOffset, false);
+ }
+ }
+ var changed = module.set.dataKeyValue(metadata.focusDate, date, !!date && refreshCalendar);
+ updateFocus = (updateFocus !== false && changed && refreshCalendar === false) || focusDateUsedForRange != updateRange;
+ focusDateUsedForRange = updateRange;
+ if (updateFocus) {
+ module.update.focus(updateRange);
+ }
+ },
+ minDate: function (date) {
+ date = module.helper.sanitiseDate(date);
+ if (settings.maxDate !== null && settings.maxDate <= date) {
+ module.verbose('Unable to set minDate variable bigger that maxDate variable', date, settings.maxDate);
+ } else {
+ module.setting('minDate', date);
+ module.set.dataKeyValue(metadata.minDate, date);
+ }
+ },
+ maxDate: function (date) {
+ date = module.helper.sanitiseDate(date);
+ if (settings.minDate !== null && settings.minDate >= date) {
+ module.verbose('Unable to set maxDate variable lower that minDate variable', date, settings.minDate);
+ } else {
+ module.setting('maxDate', date);
+ module.set.dataKeyValue(metadata.maxDate, date);
+ }
+ },
+ monthOffset: function (monthOffset, refreshCalendar) {
+ var multiMonth = Math.max(settings.multiMonth, 1);
+ monthOffset = Math.max(1 - multiMonth, Math.min(0, monthOffset));
+ module.set.dataKeyValue(metadata.monthOffset, monthOffset, refreshCalendar);
+ },
+ mode: function (mode, refreshCalendar) {
+ module.set.dataKeyValue(metadata.mode, mode, refreshCalendar);
+ },
+ dataKeyValue: function (key, value, refreshCalendar) {
+ var oldValue = $module.data(key);
+ var equal = oldValue === value || (oldValue <= value && oldValue >= value); //equality test for dates and string objects
+ if (value) {
+ $module.data(key, value);
+ } else {
+ $module.removeData(key);
+ }
+ refreshCalendar = refreshCalendar !== false && !equal;
+ if (refreshCalendar) {
+ module.refresh();
+ }
+ return !equal;
+ }
+ },
+
+ selectDate: function (date, forceSet) {
+ module.verbose('New date selection', date);
+ var mode = module.get.mode();
+ var complete = forceSet || mode === 'minute' ||
+ (settings.disableMinute && mode === 'hour') ||
+ (settings.type === 'date' && mode === 'day') ||
+ (settings.type === 'month' && mode === 'month') ||
+ (settings.type === 'year' && mode === 'year');
+ if (complete) {
+ var canceled = module.set.date(date) === false;
+ if (!canceled) {
+ selectionComplete = true;
+ if(settings.closable) {
+ module.popup('hide');
+ //if this is a range calendar, focus the container or input. This will open the popup from its event listeners.
+ var endModule = module.get.calendarModule(settings.endCalendar);
+ if (endModule) {
+ if (endModule.setting('on') !== 'focus') {
+ endModule.popup('show');
+ }
+ endModule.focus();
+ }
+ }
+ }
+ } else {
+ var newMode = mode === 'year' ? (!settings.disableMonth ? 'month' : 'day') :
+ mode === 'month' ? 'day' : mode === 'day' ? 'hour' : 'minute';
+ module.set.mode(newMode);
+ if (mode === 'hour' || (mode === 'day' && module.get.date())) {
+ //the user has chosen enough to consider a valid date/time has been chosen
+ module.set.date(date, true, false);
+ } else {
+ module.set.focusDate(date);
+ }
+ }
+ },
+
+ changeDate: function (date) {
+ module.set.date(date);
+ },
+
+ clear: function () {
+ module.set.date(undefined);
+ },
+
+ popup: function () {
+ return $activator.popup.apply($activator, arguments);
+ },
+
+ focus: function () {
+ if ($input.length) {
+ $input.focus();
+ } else {
+ $container.focus();
+ }
+ },
+ blur: function () {
+ if ($input.length) {
+ $input.blur();
+ } else {
+ $container.blur();
+ }
+ },
+
+ helper: {
+ isDisabled: function(date, mode) {
+ return (mode === 'day' || mode === 'month' || mode === 'year') && ((mode === 'day' && settings.disabledDaysOfWeek.indexOf(date.getDay()) !== -1) || settings.disabledDates.some(function(d){
+ if(typeof d === 'string') {
+ d = module.helper.sanitiseDate(d);
+ }
+ if (d instanceof Date) {
+ return module.helper.dateEqual(date, d, mode);
+ }
+ if (d !== null && typeof d === 'object') {
+ if (d[metadata.year]) {
+ if (typeof d[metadata.year] === 'number') {
+ return date.getFullYear() == d[metadata.year];
+ } else if (Array.isArray(d[metadata.year])) {
+ return d[metadata.year].indexOf(date.getFullYear()) > -1;
+ }
+ } else if (d[metadata.month]) {
+ if (typeof d[metadata.month] === 'number') {
+ return date.getMonth() == d[metadata.month];
+ } else if (Array.isArray(d[metadata.month])) {
+ return d[metadata.month].indexOf(date.getMonth()) > -1;
+ } else if (d[metadata.month] instanceof Date) {
+ var sdate = module.helper.sanitiseDate(d[metadata.month]);
+ return (date.getMonth() == sdate.getMonth()) && (date.getFullYear() == sdate.getFullYear())
+ }
+ } else if (d[metadata.date] && mode === 'day') {
+ if (d[metadata.date] instanceof Date) {
+ return module.helper.dateEqual(date, module.helper.sanitiseDate(d[metadata.date]), mode);
+ } else if (Array.isArray(d[metadata.date])) {
+ return d[metadata.date].some(function(idate) {
+ return module.helper.dateEqual(date, idate, mode);
+ });
+ }
+ }
+ }
+ }));
+ },
+ isEnabled: function(date, mode) {
+ if (mode === 'day') {
+ return settings.enabledDates.length === 0 || settings.enabledDates.some(function(d){
+ if(typeof d === 'string') {
+ d = module.helper.sanitiseDate(d);
+ }
+ if (d instanceof Date) {
+ return module.helper.dateEqual(date, d, mode);
+ }
+ if (d !== null && typeof d === 'object' && d[metadata.date]) {
+ return module.helper.dateEqual(date, module.helper.sanitiseDate(d[metadata.date]), mode);
+ }
+ });
+ } else {
+ return true;
+ }
+ },
+ findDayAsObject: function(date, mode, dates) {
+ if (mode === 'day' || mode === 'month' || mode === 'year') {
+ var d;
+ for (var i = 0; i < dates.length; i++) {
+ d = dates[i];
+ if(typeof d === 'string') {
+ d = module.helper.sanitiseDate(d);
+ }
+ if (d instanceof Date && module.helper.dateEqual(date, d, mode)) {
+ var dateObject = {};
+ dateObject[metadata.date] = d;
+ return dateObject;
+ }
+ else if (d !== null && typeof d === 'object') {
+ if (d[metadata.year]) {
+ if (typeof d[metadata.year] === 'number' && date.getFullYear() == d[metadata.year]) {
+ return d;
+ } else if (Array.isArray(d[metadata.year])) {
+ if (d[metadata.year].indexOf(date.getFullYear()) > -1) {
+ return d;
+ }
+ }
+ } else if (d[metadata.month]) {
+ if (typeof d[metadata.month] === 'number' && date.getMonth() == d[metadata.month]) {
+ return d;
+ } else if (Array.isArray(d[metadata.month])) {
+ if (d[metadata.month].indexOf(date.getMonth()) > -1) {
+ return d;
+ }
+ } else if (d[metadata.month] instanceof Date) {
+ var sdate = module.helper.sanitiseDate(d[metadata.month]);
+ if ((date.getMonth() == sdate.getMonth()) && (date.getFullYear() == sdate.getFullYear())) {
+ return d;
+ }
+ }
+ } else if (d[metadata.date] && mode === 'day') {
+ if (d[metadata.date] instanceof Date && module.helper.dateEqual(date, module.helper.sanitiseDate(d[metadata.date]), mode)) {
+ return d;
+ } else if (Array.isArray(d[metadata.date])) {
+ if(d[metadata.date].some(function(idate) { return module.helper.dateEqual(date, idate, mode); })) {
+ return d;
+ }
+ }
+ }
+ }
+ }
+ }
+ return null;
+ },
+ sanitiseDate: function (date) {
+ if (!(date instanceof Date)) {
+ date = parser.date('' + date, settings);
+ }
+ if (!date || isNaN(date.getTime())) {
+ return null;
+ }
+ return date;
+ },
+ dateDiff: function (date1, date2, mode) {
+ mode = mode || 'day';
+ var isTimeOnly = settings.type === 'time';
+ var isYear = mode === 'year';
+ var isYearOrMonth = isYear || mode === 'month';
+ var isMinute = mode === 'minute';
+ var isHourOrMinute = isMinute || mode === 'hour';
+ //only care about a minute accuracy of settings.minTimeGap
+ date1 = new Date(
+ isTimeOnly ? 2000 : date1.getFullYear(),
+ isTimeOnly ? 0 : isYear ? 0 : date1.getMonth(),
+ isTimeOnly ? 1 : isYearOrMonth ? 1 : date1.getDate(),
+ !isHourOrMinute ? 0 : date1.getHours(),
+ !isMinute ? 0 : settings.minTimeGap * Math.floor(date1.getMinutes() / settings.minTimeGap));
+ date2 = new Date(
+ isTimeOnly ? 2000 : date2.getFullYear(),
+ isTimeOnly ? 0 : isYear ? 0 : date2.getMonth(),
+ isTimeOnly ? 1 : isYearOrMonth ? 1 : date2.getDate(),
+ !isHourOrMinute ? 0 : date2.getHours(),
+ !isMinute ? 0 : settings.minTimeGap * Math.floor(date2.getMinutes() / settings.minTimeGap));
+ return date2.getTime() - date1.getTime();
+ },
+ dateEqual: function (date1, date2, mode) {
+ return !!date1 && !!date2 && module.helper.dateDiff(date1, date2, mode) === 0;
+ },
+ isDateInRange: function (date, mode, minDate, maxDate) {
+ if (!minDate && !maxDate) {
+ var startDate = module.get.startDate();
+ minDate = startDate && settings.minDate ? new Date(Math.max(startDate, settings.minDate)) : startDate || settings.minDate;
+ maxDate = settings.maxDate;
+ }
+ minDate = minDate && new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate(), minDate.getHours(), settings.minTimeGap * Math.ceil(minDate.getMinutes() / settings.minTimeGap));
+ return !(!date ||
+ (minDate && module.helper.dateDiff(date, minDate, mode) > 0) ||
+ (maxDate && module.helper.dateDiff(maxDate, date, mode) > 0));
+ },
+ dateInRange: function (date, minDate, maxDate) {
+ if (!minDate && !maxDate) {
+ var startDate = module.get.startDate();
+ minDate = startDate && settings.minDate ? new Date(Math.max(startDate, settings.minDate)) : startDate || settings.minDate;
+ maxDate = settings.maxDate;
+ }
+ minDate = minDate && new Date(minDate.getFullYear(), minDate.getMonth(), minDate.getDate(), minDate.getHours(), settings.minTimeGap * Math.ceil(minDate.getMinutes() / settings.minTimeGap));
+ var isTimeOnly = settings.type === 'time';
+ return !date ? date :
+ (minDate && module.helper.dateDiff(date, minDate, 'minute') > 0) ?
+ (isTimeOnly ? module.helper.mergeDateTime(date, minDate) : minDate) :
+ (maxDate && module.helper.dateDiff(maxDate, date, 'minute') > 0) ?
+ (isTimeOnly ? module.helper.mergeDateTime(date, maxDate) : maxDate) :
+ date;
+ },
+ mergeDateTime: function (date, time) {
+ return (!date || !time) ? time :
+ new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes());
+ },
+ isTodayButton: function(element) {
+ return element.text() === settings.text.today;
+ }
+ },
+
+ setting: function (name, value) {
+ module.debug('Changing setting', name, value);
+ if ($.isPlainObject(name)) {
+ $.extend(true, settings, name);
+ }
+ else if (value !== undefined) {
+ if ($.isPlainObject(settings[name])) {
+ $.extend(true, settings[name], value);
+ }
+ else {
+ settings[name] = value;
+ }
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function (name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function () {
+ if (!settings.silent && settings.debug) {
+ if (settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function () {
+ if (!settings.silent && settings.verbose && settings.debug) {
+ if (settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function () {
+ if (!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function (message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if (settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name': message[0],
+ 'Arguments': [].slice.call(message, 1) || '',
+ 'Element': element,
+ 'Execution Time': executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function () {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function (index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if (moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if ((console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if (console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function (index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time'] + 'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function (query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if (typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function (depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if ($.isPlainObject(object[camelCaseValue]) && (depth != maxDepth)) {
+ object = object[camelCaseValue];
+ }
+ else if (object[camelCaseValue] !== undefined) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if ($.isPlainObject(object[value]) && (depth != maxDepth)) {
+ object = object[value];
+ }
+ else if (object[value] !== undefined) {
+ found = object[value];
+ return false;
+ }
+ else {
+ module.error(error.method, query);
+ return false;
+ }
+ });
+ }
+ if ($.isFunction(found)) {
+ response = found.apply(context, passedArguments);
+ }
+ else if (found !== undefined) {
+ response = found;
+ }
+ if (Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if (returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if (response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+
+ if (methodInvoked) {
+ if (instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if (instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ }
+ })
+ ;
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.fn.calendar.settings = {
+
+ name : 'Calendar',
+ namespace : 'calendar',
+
+ silent: false,
+ debug: false,
+ verbose: false,
+ performance: false,
+
+ type : 'datetime', // picker type, can be 'datetime', 'date', 'time', 'month', or 'year'
+ firstDayOfWeek : 0, // day for first day column (0 = Sunday)
+ constantHeight : true, // add rows to shorter months to keep day calendar height consistent (6 rows)
+ today : false, // show a 'today/now' button at the bottom of the calendar
+ closable : true, // close the popup after selecting a date/time
+ monthFirst : true, // month before day when parsing/converting date from/to text
+ touchReadonly : true, // set input to readonly on touch devices
+ inline : false, // create the calendar inline instead of inside a popup
+ on : null, // when to show the popup (defaults to 'focus' for input, 'click' for others)
+ initialDate : null, // date to display initially when no date is selected (null = now)
+ startMode : false, // display mode to start in, can be 'year', 'month', 'day', 'hour', 'minute' (false = 'day')
+ minDate : null, // minimum date/time that can be selected, dates/times before are disabled
+ maxDate : null, // maximum date/time that can be selected, dates/times after are disabled
+ ampm : true, // show am/pm in time mode
+ disableYear : false, // disable year selection mode
+ disableMonth : false, // disable month selection mode
+ disableMinute : false, // disable minute selection mode
+ formatInput : true, // format the input text upon input blur and module creation
+ startCalendar : null, // jquery object or selector for another calendar that represents the start date of a date range
+ endCalendar : null, // jquery object or selector for another calendar that represents the end date of a date range
+ multiMonth : 1, // show multiple months when in 'day' mode
+ minTimeGap : 5,
+ showWeekNumbers : null, // show Number of Week at the very first column of a dayView
+ disabledDates : [], // specific day(s) which won't be selectable and contain additional information.
+ disabledDaysOfWeek : [], // day(s) which won't be selectable(s) (0 = Sunday)
+ enabledDates : [], // specific day(s) which will be selectable, all other days will be disabled
+ eventDates : [], // specific day(s) which will be shown in a different color and using tooltips
+ centuryBreak : 60, // starting short year until 99 where it will be assumed to belong to the last century
+ currentCentury : 2000, // century to be added to 2-digit years (00 to {centuryBreak}-1)
+ selectAdjacentDays : false, // The calendar can show dates from adjacent month. These adjacent month dates can also be made selectable.
+ // popup options ('popup', 'on', 'hoverable', and show/hide callbacks are overridden)
+ popupOptions: {
+ position: 'bottom left',
+ lastResort: 'bottom left',
+ prefer: 'opposite',
+ hideOnScroll: false
+ },
+
+ text: {
+ days: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],
+ months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
+ monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
+ today: 'Today',
+ now: 'Now',
+ am: 'AM',
+ pm: 'PM',
+ weekNo: 'Week'
+ },
+
+ formatter: {
+ header: function (date, mode, settings) {
+ return mode === 'year' ? settings.formatter.yearHeader(date, settings) :
+ mode === 'month' ? settings.formatter.monthHeader(date, settings) :
+ mode === 'day' ? settings.formatter.dayHeader(date, settings) :
+ mode === 'hour' ? settings.formatter.hourHeader(date, settings) :
+ settings.formatter.minuteHeader(date, settings);
+ },
+ yearHeader: function (date, settings) {
+ var decadeYear = Math.ceil(date.getFullYear() / 10) * 10;
+ return (decadeYear - 9) + ' - ' + (decadeYear + 2);
+ },
+ monthHeader: function (date, settings) {
+ return date.getFullYear();
+ },
+ dayHeader: function (date, settings) {
+ var month = settings.text.months[date.getMonth()];
+ var year = date.getFullYear();
+ return month + ' ' + year;
+ },
+ hourHeader: function (date, settings) {
+ return settings.formatter.date(date, settings);
+ },
+ minuteHeader: function (date, settings) {
+ return settings.formatter.date(date, settings);
+ },
+ dayColumnHeader: function (day, settings) {
+ return settings.text.days[day];
+ },
+ datetime: function (date, settings) {
+ if (!date) {
+ return '';
+ }
+ var day = settings.type === 'time' ? '' : settings.formatter.date(date, settings);
+ var time = settings.type.indexOf('time') < 0 ? '' : settings.formatter.time(date, settings, false);
+ var separator = settings.type === 'datetime' ? ' ' : '';
+ return day + separator + time;
+ },
+ date: function (date, settings) {
+ if (!date) {
+ return '';
+ }
+ var day = date.getDate();
+ var month = settings.text.months[date.getMonth()];
+ var year = date.getFullYear();
+ return settings.type === 'year' ? year :
+ settings.type === 'month' ? month + ' ' + year :
+ (settings.monthFirst ? month + ' ' + day : day + ' ' + month) + ', ' + year;
+ },
+ time: function (date, settings, forCalendar) {
+ if (!date) {
+ return '';
+ }
+ var hour = date.getHours();
+ var minute = date.getMinutes();
+ var ampm = '';
+ if (settings.ampm) {
+ ampm = ' ' + (hour < 12 ? settings.text.am : settings.text.pm);
+ hour = hour === 0 ? 12 : hour > 12 ? hour - 12 : hour;
+ }
+ return hour + ':' + (minute < 10 ? '0' : '') + minute + ampm;
+ },
+ today: function (settings) {
+ return settings.type === 'date' ? settings.text.today : settings.text.now;
+ },
+ cell: function (cell, date, cellOptions) {
+ }
+ },
+
+ parser: {
+ date: function (text, settings) {
+ if (text instanceof Date) {
+ return text;
+ }
+ if (!text) {
+ return null;
+ }
+ text = String(text).trim();
+ if (text.length === 0) {
+ return null;
+ }
+ if(text.match(/^[0-9]{4}[\/\-\.][0-9]{1,2}[\/\-\.][0-9]{1,2}$/)){
+ text = text.replace(/[\/\-\.]/g,'/') + ' 00:00:00';
+ }
+ // Reverse date and month in some cases
+ text = settings.monthFirst || !text.match(/^[0-9]{1,2}[\/\-\.]/) ? text : text.replace(/[\/\-\.]/g,'/').replace(/([0-9]+)\/([0-9]+)/,'$2/$1');
+ var textDate = new Date(text);
+ var numberOnly = text.match(/^[0-9]+$/) !== null;
+ if(!numberOnly && !isNaN(textDate.getDate())) {
+ return textDate;
+ }
+ text = text.toLowerCase();
+
+ var i, j, k;
+ var minute = -1, hour = -1, day = -1, month = -1, year = -1;
+ var isAm = undefined;
+
+ var isTimeOnly = settings.type === 'time';
+ var isDateOnly = settings.type.indexOf('time') < 0;
+
+ var words = text.split(settings.regExp.dateWords), word;
+ var numbers = text.split(settings.regExp.dateNumbers), number;
+
+ var parts;
+ var monthString;
+
+ if (!isDateOnly) {
+ //am/pm
+ isAm = $.inArray(settings.text.am.toLowerCase(), words) >= 0 ? true :
+ $.inArray(settings.text.pm.toLowerCase(), words) >= 0 ? false : undefined;
+
+ //time with ':'
+ for (i = 0; i < numbers.length; i++) {
+ number = numbers[i];
+ if (number.indexOf(':') >= 0) {
+ if (hour < 0 || minute < 0) {
+ parts = number.split(':');
+ for (k = 0; k < Math.min(2, parts.length); k++) {
+ j = parseInt(parts[k]);
+ if (isNaN(j)) {
+ j = 0;
+ }
+ if (k === 0) {
+ hour = j % 24;
+ } else {
+ minute = j % 60;
+ }
+ }
+ }
+ numbers.splice(i, 1);
+ }
+ }
+ }
+
+ if (!isTimeOnly) {
+ //textual month
+ for (i = 0; i < words.length; i++) {
+ word = words[i];
+ if (word.length <= 0) {
+ continue;
+ }
+ for (j = 0; j < settings.text.months.length; j++) {
+ monthString = settings.text.months[j];
+ monthString = monthString.substring(0, word.length).toLowerCase();
+ if (monthString === word) {
+ month = j + 1;
+ break;
+ }
+ }
+ if (month >= 0) {
+ break;
+ }
+ }
+
+ //year > settings.centuryBreak
+ for (i = 0; i < numbers.length; i++) {
+ j = parseInt(numbers[i]);
+ if (isNaN(j)) {
+ continue;
+ }
+ if (j >= settings.centuryBreak && i === numbers.length-1) {
+ if (j <= 99) {
+ j += settings.currentCentury - 100;
+ }
+ year = j;
+ numbers.splice(i, 1);
+ break;
+ }
+ }
+
+ //numeric month
+ if (month < 0) {
+ for (i = 0; i < numbers.length; i++) {
+ k = i > 1 || settings.monthFirst ? i : i === 1 ? 0 : 1;
+ j = parseInt(numbers[k]);
+ if (isNaN(j)) {
+ continue;
+ }
+ if (1 <= j && j <= 12) {
+ month = j;
+ numbers.splice(k, 1);
+ break;
+ }
+ }
+ }
+
+ //day
+ for (i = 0; i < numbers.length; i++) {
+ j = parseInt(numbers[i]);
+ if (isNaN(j)) {
+ continue;
+ }
+ if (1 <= j && j <= 31) {
+ day = j;
+ numbers.splice(i, 1);
+ break;
+ }
+ }
+
+ //year <= settings.centuryBreak
+ if (year < 0) {
+ for (i = numbers.length - 1; i >= 0; i--) {
+ j = parseInt(numbers[i]);
+ if (isNaN(j)) {
+ continue;
+ }
+ if (j <= 99) {
+ j += settings.currentCentury;
+ }
+ year = j;
+ numbers.splice(i, 1);
+ break;
+ }
+ }
+ }
+
+ if (!isDateOnly) {
+ //hour
+ if (hour < 0) {
+ for (i = 0; i < numbers.length; i++) {
+ j = parseInt(numbers[i]);
+ if (isNaN(j)) {
+ continue;
+ }
+ if (0 <= j && j <= 23) {
+ hour = j;
+ numbers.splice(i, 1);
+ break;
+ }
+ }
+ }
+
+ //minute
+ if (minute < 0) {
+ for (i = 0; i < numbers.length; i++) {
+ j = parseInt(numbers[i]);
+ if (isNaN(j)) {
+ continue;
+ }
+ if (0 <= j && j <= 59) {
+ minute = j;
+ numbers.splice(i, 1);
+ break;
+ }
+ }
+ }
+ }
+
+ if (minute < 0 && hour < 0 && day < 0 && month < 0 && year < 0) {
+ return null;
+ }
+
+ if (minute < 0) {
+ minute = 0;
+ }
+ if (hour < 0) {
+ hour = 0;
+ }
+ if (day < 0) {
+ day = 1;
+ }
+ if (month < 0) {
+ month = 1;
+ }
+ if (year < 0) {
+ year = new Date().getFullYear();
+ }
+
+ if (isAm !== undefined) {
+ if (isAm) {
+ if (hour === 12) {
+ hour = 0;
+ }
+ } else if (hour < 12) {
+ hour += 12;
+ }
+ }
+
+ var date = new Date(year, month - 1, day, hour, minute);
+ if (date.getMonth() !== month - 1 || date.getFullYear() !== year) {
+ //month or year don't match up, switch to last day of the month
+ date = new Date(year, month, 0, hour, minute);
+ }
+ return isNaN(date.getTime()) ? null : date;
+ }
+ },
+
+ // callback before date is changed, return false to cancel the change
+ onBeforeChange: function (date, text, mode) {
+ return true;
+ },
+
+ // callback when date changes
+ onChange: function (date, text, mode) {
+ },
+
+ // callback before show animation, return false to prevent show
+ onShow: function () {
+ },
+
+ // callback after show animation
+ onVisible: function () {
+ },
+
+ // callback before hide animation, return false to prevent hide
+ onHide: function () {
+ },
+
+ // callback after hide animation
+ onHidden: function () {
+ },
+
+ // callback before item is selected, return false to prevent selection
+ onSelect: function (date, mode) {
+ },
+
+ // is the given date disabled?
+ isDisabled: function (date, mode) {
+ return false;
+ },
+
+ selector: {
+ popup: '.ui.popup',
+ input: 'input',
+ activator: 'input',
+ append: '.inline.field,.inline.fields'
+ },
+
+ regExp: {
+ dateWords: /[^A-Za-z\u00C0-\u024F]+/g,
+ dateNumbers: /[^\d:]+/g
+ },
+
+ error: {
+ popup: 'UI Popup, a required component is not included in this page',
+ method: 'The method you called is not defined.'
+ },
+
+ className: {
+ calendar: 'calendar',
+ active: 'active',
+ popup: 'ui popup',
+ grid: 'ui equal width grid',
+ column: 'column',
+ table: 'ui celled center aligned unstackable table',
+ inverted: 'inverted',
+ prev: 'prev link',
+ next: 'next link',
+ prevIcon: 'chevron left icon',
+ nextIcon: 'chevron right icon',
+ link: 'link',
+ cell: 'link',
+ disabledCell: 'disabled',
+ weekCell: 'disabled',
+ adjacentCell: 'adjacent',
+ activeCell: 'active',
+ rangeCell: 'range',
+ focusCell: 'focus',
+ todayCell: 'today',
+ today: 'today link',
+ disabled: 'disabled'
+ },
+
+ metadata: {
+ date: 'date',
+ focusDate: 'focusDate',
+ startDate: 'startDate',
+ endDate: 'endDate',
+ minDate: 'minDate',
+ maxDate: 'maxDate',
+ mode: 'mode',
+ type: 'type',
+ monthOffset: 'monthOffset',
+ message: 'message',
+ class: 'class',
+ inverted: 'inverted',
+ variation: 'variation',
+ position: 'position',
+ month: 'month',
+ year: 'year'
+ },
+
+ eventClass: 'blue'
+};
+
+})(jQuery, window, document);
+
+/*!
+ * # Fomantic-UI 2.8.8 - Checkbox
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+'use strict';
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.checkbox = function(parameters) {
+ var
+ $allModules = $(this),
+ moduleSelector = $allModules.selector || '',
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+ returnedValue
+ ;
+
+ $allModules
+ .each(function() {
+ var
+ settings = $.extend(true, {}, $.fn.checkbox.settings, parameters),
+
+ className = settings.className,
+ namespace = settings.namespace,
+ selector = settings.selector,
+ error = settings.error,
+
+ eventNamespace = '.' + namespace,
+ moduleNamespace = 'module-' + namespace,
+
+ $module = $(this),
+ $label = $(this).children(selector.label),
+ $input = $(this).children(selector.input),
+ input = $input[0],
+
+ initialLoad = false,
+ shortcutPressed = false,
+ instance = $module.data(moduleNamespace),
+
+ observer,
+ element = this,
+ module
+ ;
+
+ module = {
+
+ initialize: function() {
+ module.verbose('Initializing checkbox', settings);
+
+ module.create.label();
+ module.bind.events();
+
+ module.set.tabbable();
+ module.hide.input();
+
+ module.observeChanges();
+ module.instantiate();
+ module.setup();
+ },
+
+ instantiate: function() {
+ module.verbose('Storing instance of module', module);
+ instance = module;
+ $module
+ .data(moduleNamespace, module)
+ ;
+ },
+
+ destroy: function() {
+ module.verbose('Destroying module');
+ module.unbind.events();
+ module.show.input();
+ $module.removeData(moduleNamespace);
+ },
+
+ fix: {
+ reference: function() {
+ if( $module.is(selector.input) ) {
+ module.debug('Behavior called on adjusting invoked element');
+ $module = $module.closest(selector.checkbox);
+ module.refresh();
+ }
+ }
+ },
+
+ setup: function() {
+ module.set.initialLoad();
+ if( module.is.indeterminate() ) {
+ module.debug('Initial value is indeterminate');
+ module.indeterminate();
+ }
+ else if( module.is.checked() ) {
+ module.debug('Initial value is checked');
+ module.check();
+ }
+ else {
+ module.debug('Initial value is unchecked');
+ module.uncheck();
+ }
+ module.remove.initialLoad();
+ },
+
+ refresh: function() {
+ $label = $module.children(selector.label);
+ $input = $module.children(selector.input);
+ input = $input[0];
+ },
+
+ hide: {
+ input: function() {
+ module.verbose('Modifying z-index to be unselectable');
+ $input.addClass(className.hidden);
+ }
+ },
+ show: {
+ input: function() {
+ module.verbose('Modifying z-index to be selectable');
+ $input.removeClass(className.hidden);
+ }
+ },
+
+ observeChanges: function() {
+ if('MutationObserver' in window) {
+ observer = new MutationObserver(function(mutations) {
+ module.debug('DOM tree modified, updating selector cache');
+ module.refresh();
+ });
+ observer.observe(element, {
+ childList : true,
+ subtree : true
+ });
+ module.debug('Setting up mutation observer', observer);
+ }
+ },
+
+ attachEvents: function(selector, event) {
+ var
+ $element = $(selector)
+ ;
+ event = $.isFunction(module[event])
+ ? module[event]
+ : module.toggle
+ ;
+ if($element.length > 0) {
+ module.debug('Attaching checkbox events to element', selector, event);
+ $element
+ .on('click' + eventNamespace, event)
+ ;
+ }
+ else {
+ module.error(error.notFound);
+ }
+ },
+
+ preventDefaultOnInputTarget: function() {
+ if(typeof event !== 'undefined' && event !== null && $(event.target).is(selector.input)) {
+ module.verbose('Preventing default check action after manual check action');
+ event.preventDefault();
+ }
+ },
+
+ event: {
+ change: function(event) {
+ if( !module.should.ignoreCallbacks() ) {
+ settings.onChange.call(input);
+ }
+ },
+ click: function(event) {
+ var
+ $target = $(event.target)
+ ;
+ if( $target.is(selector.input) ) {
+ module.verbose('Using default check action on initialized checkbox');
+ return;
+ }
+ if( $target.is(selector.link) ) {
+ module.debug('Clicking link inside checkbox, skipping toggle');
+ return;
+ }
+ module.toggle();
+ $input.focus();
+ event.preventDefault();
+ },
+ keydown: function(event) {
+ var
+ key = event.which,
+ keyCode = {
+ enter : 13,
+ space : 32,
+ escape : 27,
+ left : 37,
+ up : 38,
+ right : 39,
+ down : 40
+ }
+ ;
+
+ var r = module.get.radios(),
+ rIndex = r.index($module),
+ rLen = r.length,
+ checkIndex = false;
+
+ if(key == keyCode.left || key == keyCode.up) {
+ checkIndex = (rIndex === 0 ? rLen : rIndex) - 1;
+ } else if(key == keyCode.right || key == keyCode.down) {
+ checkIndex = rIndex === rLen-1 ? 0 : rIndex+1;
+ }
+
+ if (!module.should.ignoreCallbacks() && checkIndex !== false) {
+ if(settings.beforeUnchecked.apply(input)===false) {
+ module.verbose('Option not allowed to be unchecked, cancelling key navigation');
+ return false;
+ }
+ if (settings.beforeChecked.apply($(r[checkIndex]).children(selector.input)[0])===false) {
+ module.verbose('Next option should not allow check, cancelling key navigation');
+ return false;
+ }
+ }
+
+ if(key == keyCode.escape) {
+ module.verbose('Escape key pressed blurring field');
+ $input.blur();
+ shortcutPressed = true;
+ }
+ else if(!event.ctrlKey && ( key == keyCode.space || (key == keyCode.enter && settings.enableEnterKey)) ) {
+ module.verbose('Enter/space key pressed, toggling checkbox');
+ module.toggle();
+ shortcutPressed = true;
+ }
+ else {
+ shortcutPressed = false;
+ }
+ },
+ keyup: function(event) {
+ if(shortcutPressed) {
+ event.preventDefault();
+ }
+ }
+ },
+
+ check: function() {
+ if( !module.should.allowCheck() ) {
+ return;
+ }
+ module.debug('Checking checkbox', $input);
+ module.set.checked();
+ if( !module.should.ignoreCallbacks() ) {
+ settings.onChecked.call(input);
+ module.trigger.change();
+ }
+ module.preventDefaultOnInputTarget();
+ },
+
+ uncheck: function() {
+ if( !module.should.allowUncheck() ) {
+ return;
+ }
+ module.debug('Unchecking checkbox');
+ module.set.unchecked();
+ if( !module.should.ignoreCallbacks() ) {
+ settings.onUnchecked.call(input);
+ module.trigger.change();
+ }
+ module.preventDefaultOnInputTarget();
+ },
+
+ indeterminate: function() {
+ if( module.should.allowIndeterminate() ) {
+ module.debug('Checkbox is already indeterminate');
+ return;
+ }
+ module.debug('Making checkbox indeterminate');
+ module.set.indeterminate();
+ if( !module.should.ignoreCallbacks() ) {
+ settings.onIndeterminate.call(input);
+ module.trigger.change();
+ }
+ },
+
+ determinate: function() {
+ if( module.should.allowDeterminate() ) {
+ module.debug('Checkbox is already determinate');
+ return;
+ }
+ module.debug('Making checkbox determinate');
+ module.set.determinate();
+ if( !module.should.ignoreCallbacks() ) {
+ settings.onDeterminate.call(input);
+ module.trigger.change();
+ }
+ },
+
+ enable: function() {
+ if( module.is.enabled() ) {
+ module.debug('Checkbox is already enabled');
+ return;
+ }
+ module.debug('Enabling checkbox');
+ module.set.enabled();
+ if( !module.should.ignoreCallbacks() ) {
+ settings.onEnable.call(input);
+ // preserve legacy callbacks
+ settings.onEnabled.call(input);
+ module.trigger.change();
+ }
+ },
+
+ disable: function() {
+ if( module.is.disabled() ) {
+ module.debug('Checkbox is already disabled');
+ return;
+ }
+ module.debug('Disabling checkbox');
+ module.set.disabled();
+ if( !module.should.ignoreCallbacks() ) {
+ settings.onDisable.call(input);
+ // preserve legacy callbacks
+ settings.onDisabled.call(input);
+ module.trigger.change();
+ }
+ },
+
+ get: {
+ radios: function() {
+ var
+ name = module.get.name()
+ ;
+ return $('input[name="' + name + '"]').closest(selector.checkbox);
+ },
+ otherRadios: function() {
+ return module.get.radios().not($module);
+ },
+ name: function() {
+ return $input.attr('name');
+ }
+ },
+
+ is: {
+ initialLoad: function() {
+ return initialLoad;
+ },
+ radio: function() {
+ return ($input.hasClass(className.radio) || $input.attr('type') == 'radio');
+ },
+ indeterminate: function() {
+ return $input.prop('indeterminate') !== undefined && $input.prop('indeterminate');
+ },
+ checked: function() {
+ return $input.prop('checked') !== undefined && $input.prop('checked');
+ },
+ disabled: function() {
+ return $input.prop('disabled') !== undefined && $input.prop('disabled');
+ },
+ enabled: function() {
+ return !module.is.disabled();
+ },
+ determinate: function() {
+ return !module.is.indeterminate();
+ },
+ unchecked: function() {
+ return !module.is.checked();
+ }
+ },
+
+ should: {
+ allowCheck: function() {
+ if(module.is.determinate() && module.is.checked() && !module.is.initialLoad() ) {
+ module.debug('Should not allow check, checkbox is already checked');
+ return false;
+ }
+ if(!module.should.ignoreCallbacks() && settings.beforeChecked.apply(input) === false) {
+ module.debug('Should not allow check, beforeChecked cancelled');
+ return false;
+ }
+ return true;
+ },
+ allowUncheck: function() {
+ if(module.is.determinate() && module.is.unchecked() && !module.is.initialLoad() ) {
+ module.debug('Should not allow uncheck, checkbox is already unchecked');
+ return false;
+ }
+ if(!module.should.ignoreCallbacks() && settings.beforeUnchecked.apply(input) === false) {
+ module.debug('Should not allow uncheck, beforeUnchecked cancelled');
+ return false;
+ }
+ return true;
+ },
+ allowIndeterminate: function() {
+ if(module.is.indeterminate() && !module.is.initialLoad() ) {
+ module.debug('Should not allow indeterminate, checkbox is already indeterminate');
+ return false;
+ }
+ if(!module.should.ignoreCallbacks() && settings.beforeIndeterminate.apply(input) === false) {
+ module.debug('Should not allow indeterminate, beforeIndeterminate cancelled');
+ return false;
+ }
+ return true;
+ },
+ allowDeterminate: function() {
+ if(module.is.determinate() && !module.is.initialLoad() ) {
+ module.debug('Should not allow determinate, checkbox is already determinate');
+ return false;
+ }
+ if(!module.should.ignoreCallbacks() && settings.beforeDeterminate.apply(input) === false) {
+ module.debug('Should not allow determinate, beforeDeterminate cancelled');
+ return false;
+ }
+ return true;
+ },
+ ignoreCallbacks: function() {
+ return (initialLoad && !settings.fireOnInit);
+ }
+ },
+
+ can: {
+ change: function() {
+ return !( $module.hasClass(className.disabled) || $module.hasClass(className.readOnly) || $input.prop('disabled') || $input.prop('readonly') );
+ },
+ uncheck: function() {
+ return (typeof settings.uncheckable === 'boolean')
+ ? settings.uncheckable
+ : !module.is.radio()
+ ;
+ }
+ },
+
+ set: {
+ initialLoad: function() {
+ initialLoad = true;
+ },
+ checked: function() {
+ module.verbose('Setting class to checked');
+ $module
+ .removeClass(className.indeterminate)
+ .addClass(className.checked)
+ ;
+ if( module.is.radio() ) {
+ module.uncheckOthers();
+ }
+ if(!module.is.indeterminate() && module.is.checked()) {
+ module.debug('Input is already checked, skipping input property change');
+ return;
+ }
+ module.verbose('Setting state to checked', input);
+ $input
+ .prop('indeterminate', false)
+ .prop('checked', true)
+ ;
+ },
+ unchecked: function() {
+ module.verbose('Removing checked class');
+ $module
+ .removeClass(className.indeterminate)
+ .removeClass(className.checked)
+ ;
+ if(!module.is.indeterminate() && module.is.unchecked() ) {
+ module.debug('Input is already unchecked');
+ return;
+ }
+ module.debug('Setting state to unchecked');
+ $input
+ .prop('indeterminate', false)
+ .prop('checked', false)
+ ;
+ },
+ indeterminate: function() {
+ module.verbose('Setting class to indeterminate');
+ $module
+ .addClass(className.indeterminate)
+ ;
+ if( module.is.indeterminate() ) {
+ module.debug('Input is already indeterminate, skipping input property change');
+ return;
+ }
+ module.debug('Setting state to indeterminate');
+ $input
+ .prop('indeterminate', true)
+ ;
+ },
+ determinate: function() {
+ module.verbose('Removing indeterminate class');
+ $module
+ .removeClass(className.indeterminate)
+ ;
+ if( module.is.determinate() ) {
+ module.debug('Input is already determinate, skipping input property change');
+ return;
+ }
+ module.debug('Setting state to determinate');
+ $input
+ .prop('indeterminate', false)
+ ;
+ },
+ disabled: function() {
+ module.verbose('Setting class to disabled');
+ $module
+ .addClass(className.disabled)
+ ;
+ if( module.is.disabled() ) {
+ module.debug('Input is already disabled, skipping input property change');
+ return;
+ }
+ module.debug('Setting state to disabled');
+ $input
+ .prop('disabled', 'disabled')
+ ;
+ },
+ enabled: function() {
+ module.verbose('Removing disabled class');
+ $module.removeClass(className.disabled);
+ if( module.is.enabled() ) {
+ module.debug('Input is already enabled, skipping input property change');
+ return;
+ }
+ module.debug('Setting state to enabled');
+ $input
+ .prop('disabled', false)
+ ;
+ },
+ tabbable: function() {
+ module.verbose('Adding tabindex to checkbox');
+ if( $input.attr('tabindex') === undefined) {
+ $input.attr('tabindex', 0);
+ }
+ }
+ },
+
+ remove: {
+ initialLoad: function() {
+ initialLoad = false;
+ }
+ },
+
+ trigger: {
+ change: function() {
+ var
+ inputElement = $input[0]
+ ;
+ if(inputElement) {
+ var events = document.createEvent('HTMLEvents');
+ module.verbose('Triggering native change event');
+ events.initEvent('change', true, false);
+ inputElement.dispatchEvent(events);
+ }
+ }
+ },
+
+
+ create: {
+ label: function() {
+ if($input.prevAll(selector.label).length > 0) {
+ $input.prev(selector.label).detach().insertAfter($input);
+ module.debug('Moving existing label', $label);
+ }
+ else if( !module.has.label() ) {
+ $label = $('').insertAfter($input);
+ module.debug('Creating label', $label);
+ }
+ }
+ },
+
+ has: {
+ label: function() {
+ return ($label.length > 0);
+ }
+ },
+
+ bind: {
+ events: function() {
+ module.verbose('Attaching checkbox events');
+ $module
+ .on('click' + eventNamespace, module.event.click)
+ .on('change' + eventNamespace, module.event.change)
+ .on('keydown' + eventNamespace, selector.input, module.event.keydown)
+ .on('keyup' + eventNamespace, selector.input, module.event.keyup)
+ ;
+ }
+ },
+
+ unbind: {
+ events: function() {
+ module.debug('Removing events');
+ $module
+ .off(eventNamespace)
+ ;
+ }
+ },
+
+ uncheckOthers: function() {
+ var
+ $radios = module.get.otherRadios()
+ ;
+ module.debug('Unchecking other radios', $radios);
+ $radios.removeClass(className.checked);
+ },
+
+ toggle: function() {
+ if( !module.can.change() ) {
+ if(!module.is.radio()) {
+ module.debug('Checkbox is read-only or disabled, ignoring toggle');
+ }
+ return;
+ }
+ if( module.is.indeterminate() || module.is.unchecked() ) {
+ module.debug('Currently unchecked');
+ module.check();
+ }
+ else if( module.is.checked() && module.can.uncheck() ) {
+ module.debug('Currently checked');
+ module.uncheck();
+ }
+ },
+ setting: function(name, value) {
+ module.debug('Changing setting', name, value);
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ if($.isPlainObject(settings[name])) {
+ $.extend(true, settings[name], value);
+ }
+ else {
+ settings[name] = value;
+ }
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ module.error(error.method, query);
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ }
+ })
+ ;
+
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.fn.checkbox.settings = {
+
+ name : 'Checkbox',
+ namespace : 'checkbox',
+
+ silent : false,
+ debug : false,
+ verbose : true,
+ performance : true,
+
+ // delegated event context
+ uncheckable : 'auto',
+ fireOnInit : false,
+ enableEnterKey : true,
+
+ onChange : function(){},
+
+ beforeChecked : function(){},
+ beforeUnchecked : function(){},
+ beforeDeterminate : function(){},
+ beforeIndeterminate : function(){},
+
+ onChecked : function(){},
+ onUnchecked : function(){},
+
+ onDeterminate : function() {},
+ onIndeterminate : function() {},
+
+ onEnable : function(){},
+ onDisable : function(){},
+
+ // preserve misspelled callbacks (will be removed in 3.0)
+ onEnabled : function(){},
+ onDisabled : function(){},
+
+ className : {
+ checked : 'checked',
+ indeterminate : 'indeterminate',
+ disabled : 'disabled',
+ hidden : 'hidden',
+ radio : 'radio',
+ readOnly : 'read-only'
+ },
+
+ error : {
+ method : 'The method you called is not defined'
+ },
+
+ selector : {
+ checkbox : '.ui.checkbox',
+ label : 'label, .box',
+ input : 'input[type="checkbox"], input[type="radio"]',
+ link : 'a[href]'
+ }
+
+};
+
+})( jQuery, window, document );
+
+/*!
+ * # Fomantic-UI 2.8.8 - Dimmer
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+'use strict';
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.dimmer = function(parameters) {
+ var
+ $allModules = $(this),
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+
+ returnedValue
+ ;
+
+ $allModules
+ .each(function() {
+ var
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.fn.dimmer.settings, parameters)
+ : $.extend({}, $.fn.dimmer.settings),
+
+ selector = settings.selector,
+ namespace = settings.namespace,
+ className = settings.className,
+ error = settings.error,
+
+ eventNamespace = '.' + namespace,
+ moduleNamespace = 'module-' + namespace,
+ moduleSelector = $allModules.selector || '',
+
+ clickEvent = ('ontouchstart' in document.documentElement)
+ ? 'touchstart'
+ : 'click',
+
+ $module = $(this),
+ $dimmer,
+ $dimmable,
+
+ element = this,
+ instance = $module.data(moduleNamespace),
+ module
+ ;
+
+ module = {
+
+ preinitialize: function() {
+ if( module.is.dimmer() ) {
+
+ $dimmable = $module.parent();
+ $dimmer = $module;
+ }
+ else {
+ $dimmable = $module;
+ if( module.has.dimmer() ) {
+ if(settings.dimmerName) {
+ $dimmer = $dimmable.find(selector.dimmer).filter('.' + settings.dimmerName);
+ }
+ else {
+ $dimmer = $dimmable.find(selector.dimmer);
+ }
+ }
+ else {
+ $dimmer = module.create();
+ }
+ }
+ },
+
+ initialize: function() {
+ module.debug('Initializing dimmer', settings);
+
+ module.bind.events();
+ module.set.dimmable();
+ module.instantiate();
+ },
+
+ instantiate: function() {
+ module.verbose('Storing instance of module', module);
+ instance = module;
+ $module
+ .data(moduleNamespace, instance)
+ ;
+ },
+
+ destroy: function() {
+ module.verbose('Destroying previous module', $dimmer);
+ module.unbind.events();
+ module.remove.variation();
+ $dimmable
+ .off(eventNamespace)
+ ;
+ },
+
+ bind: {
+ events: function() {
+ if(settings.on == 'hover') {
+ $dimmable
+ .on('mouseenter' + eventNamespace, module.show)
+ .on('mouseleave' + eventNamespace, module.hide)
+ ;
+ }
+ else if(settings.on == 'click') {
+ $dimmable
+ .on(clickEvent + eventNamespace, module.toggle)
+ ;
+ }
+ if( module.is.page() ) {
+ module.debug('Setting as a page dimmer', $dimmable);
+ module.set.pageDimmer();
+ }
+
+ if( module.is.closable() ) {
+ module.verbose('Adding dimmer close event', $dimmer);
+ $dimmable
+ .on(clickEvent + eventNamespace, selector.dimmer, module.event.click)
+ ;
+ }
+ }
+ },
+
+ unbind: {
+ events: function() {
+ $module
+ .removeData(moduleNamespace)
+ ;
+ $dimmable
+ .off(eventNamespace)
+ ;
+ }
+ },
+
+ event: {
+ click: function(event) {
+ module.verbose('Determining if event occurred on dimmer', event);
+ if( $dimmer.find(event.target).length === 0 || $(event.target).is(selector.content) ) {
+ module.hide();
+ event.stopImmediatePropagation();
+ }
+ }
+ },
+
+ addContent: function(element) {
+ var
+ $content = $(element)
+ ;
+ module.debug('Add content to dimmer', $content);
+ if($content.parent()[0] !== $dimmer[0]) {
+ $content.detach().appendTo($dimmer);
+ }
+ },
+
+ create: function() {
+ var
+ $element = $( settings.template.dimmer(settings) )
+ ;
+ if(settings.dimmerName) {
+ module.debug('Creating named dimmer', settings.dimmerName);
+ $element.addClass(settings.dimmerName);
+ }
+ $element
+ .appendTo($dimmable)
+ ;
+ return $element;
+ },
+
+ show: function(callback) {
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ module.debug('Showing dimmer', $dimmer, settings);
+ module.set.variation();
+ if( (!module.is.dimmed() || module.is.animating()) && module.is.enabled() ) {
+ module.animate.show(callback);
+ settings.onShow.call(element);
+ settings.onChange.call(element);
+ }
+ else {
+ module.debug('Dimmer is already shown or disabled');
+ }
+ },
+
+ hide: function(callback) {
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ if( module.is.dimmed() || module.is.animating() ) {
+ module.debug('Hiding dimmer', $dimmer);
+ module.animate.hide(callback);
+ settings.onHide.call(element);
+ settings.onChange.call(element);
+ }
+ else {
+ module.debug('Dimmer is not visible');
+ }
+ },
+
+ toggle: function() {
+ module.verbose('Toggling dimmer visibility', $dimmer);
+ if( !module.is.dimmed() ) {
+ module.show();
+ }
+ else {
+ if ( module.is.closable() ) {
+ module.hide();
+ }
+ }
+ },
+
+ animate: {
+ show: function(callback) {
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ if(settings.useCSS && $.fn.transition !== undefined && $dimmer.transition('is supported')) {
+ if(settings.useFlex) {
+ module.debug('Using flex dimmer');
+ module.remove.legacy();
+ }
+ else {
+ module.debug('Using legacy non-flex dimmer');
+ module.set.legacy();
+ }
+ if(settings.opacity !== 'auto') {
+ module.set.opacity();
+ }
+ $dimmer
+ .transition({
+ displayType : settings.useFlex
+ ? 'flex'
+ : 'block',
+ animation : (settings.transition.showMethod || settings.transition) + ' in',
+ queue : false,
+ duration : module.get.duration(),
+ useFailSafe : true,
+ onStart : function() {
+ module.set.dimmed();
+ },
+ onComplete : function() {
+ module.set.active();
+ callback();
+ }
+ })
+ ;
+ }
+ else {
+ module.verbose('Showing dimmer animation with javascript');
+ module.set.dimmed();
+ if(settings.opacity == 'auto') {
+ settings.opacity = 0.8;
+ }
+ $dimmer
+ .stop()
+ .css({
+ opacity : 0,
+ width : '100%',
+ height : '100%'
+ })
+ .fadeTo(module.get.duration(), settings.opacity, function() {
+ $dimmer.removeAttr('style');
+ module.set.active();
+ callback();
+ })
+ ;
+ }
+ },
+ hide: function(callback) {
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ if(settings.useCSS && $.fn.transition !== undefined && $dimmer.transition('is supported')) {
+ module.verbose('Hiding dimmer with css');
+ $dimmer
+ .transition({
+ displayType : settings.useFlex
+ ? 'flex'
+ : 'block',
+ animation : (settings.transition.hideMethod || settings.transition) + ' out',
+ queue : false,
+ duration : module.get.duration(),
+ useFailSafe : true,
+ onComplete : function() {
+ module.remove.dimmed();
+ module.remove.variation();
+ module.remove.active();
+ callback();
+ }
+ })
+ ;
+ }
+ else {
+ module.verbose('Hiding dimmer with javascript');
+ $dimmer
+ .stop()
+ .fadeOut(module.get.duration(), function() {
+ module.remove.dimmed();
+ module.remove.active();
+ $dimmer.removeAttr('style');
+ callback();
+ })
+ ;
+ }
+ }
+ },
+
+ get: {
+ dimmer: function() {
+ return $dimmer;
+ },
+ duration: function() {
+ if( module.is.active() ) {
+ return settings.transition.hideDuration || settings.duration.hide || settings.duration;
+ }
+ else {
+ return settings.transition.showDuration || settings.duration.show || settings.duration;
+ }
+ }
+ },
+
+ has: {
+ dimmer: function() {
+ if(settings.dimmerName) {
+ return ($module.find(selector.dimmer).filter('.' + settings.dimmerName).length > 0);
+ }
+ else {
+ return ( $module.find(selector.dimmer).length > 0 );
+ }
+ }
+ },
+
+ is: {
+ active: function() {
+ return $dimmer.hasClass(className.active);
+ },
+ animating: function() {
+ return ( $dimmer.is(':animated') || $dimmer.hasClass(className.animating) );
+ },
+ closable: function() {
+ if(settings.closable == 'auto') {
+ if(settings.on == 'hover') {
+ return false;
+ }
+ return true;
+ }
+ return settings.closable;
+ },
+ dimmer: function() {
+ return $module.hasClass(className.dimmer);
+ },
+ dimmable: function() {
+ return $module.hasClass(className.dimmable);
+ },
+ dimmed: function() {
+ return $dimmable.hasClass(className.dimmed);
+ },
+ disabled: function() {
+ return $dimmable.hasClass(className.disabled);
+ },
+ enabled: function() {
+ return !module.is.disabled();
+ },
+ page: function () {
+ return $dimmable.is('body');
+ },
+ pageDimmer: function() {
+ return $dimmer.hasClass(className.pageDimmer);
+ }
+ },
+
+ can: {
+ show: function() {
+ return !$dimmer.hasClass(className.disabled);
+ }
+ },
+
+ set: {
+ opacity: function(opacity) {
+ var
+ color = $dimmer.css('background-color'),
+ colorArray = color.split(','),
+ isRGB = (colorArray && colorArray.length >= 3)
+ ;
+ opacity = settings.opacity === 0 ? 0 : settings.opacity || opacity;
+ if(isRGB) {
+ colorArray[2] = colorArray[2].replace(')','');
+ colorArray[3] = opacity + ')';
+ color = colorArray.join(',');
+ }
+ else {
+ color = 'rgba(0, 0, 0, ' + opacity + ')';
+ }
+ module.debug('Setting opacity to', opacity);
+ $dimmer.css('background-color', color);
+ },
+ legacy: function() {
+ $dimmer.addClass(className.legacy);
+ },
+ active: function() {
+ $dimmer.addClass(className.active);
+ },
+ dimmable: function() {
+ $dimmable.addClass(className.dimmable);
+ },
+ dimmed: function() {
+ $dimmable.addClass(className.dimmed);
+ },
+ pageDimmer: function() {
+ $dimmer.addClass(className.pageDimmer);
+ },
+ disabled: function() {
+ $dimmer.addClass(className.disabled);
+ },
+ variation: function(variation) {
+ variation = variation || settings.variation;
+ if(variation) {
+ $dimmer.addClass(variation);
+ }
+ }
+ },
+
+ remove: {
+ active: function() {
+ $dimmer
+ .removeClass(className.active)
+ ;
+ },
+ legacy: function() {
+ $dimmer.removeClass(className.legacy);
+ },
+ dimmed: function() {
+ $dimmable.removeClass(className.dimmed);
+ },
+ disabled: function() {
+ $dimmer.removeClass(className.disabled);
+ },
+ variation: function(variation) {
+ variation = variation || settings.variation;
+ if(variation) {
+ $dimmer.removeClass(variation);
+ }
+ }
+ },
+
+ setting: function(name, value) {
+ module.debug('Changing setting', name, value);
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ if($.isPlainObject(settings[name])) {
+ $.extend(true, settings[name], value);
+ }
+ else {
+ settings[name] = value;
+ }
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if($allModules.length > 1) {
+ title += ' ' + '(' + $allModules.length + ')';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ module.error(error.method, query);
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+
+ module.preinitialize();
+
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ }
+ })
+ ;
+
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.fn.dimmer.settings = {
+
+ name : 'Dimmer',
+ namespace : 'dimmer',
+
+ silent : false,
+ debug : false,
+ verbose : false,
+ performance : true,
+
+ // whether should use flex layout
+ useFlex : true,
+
+ // name to distinguish between multiple dimmers in context
+ dimmerName : false,
+
+ // whether to add a variation type
+ variation : false,
+
+ // whether to bind close events
+ closable : 'auto',
+
+ // whether to use css animations
+ useCSS : true,
+
+ // css animation to use
+ transition : 'fade',
+
+ // event to bind to
+ on : false,
+
+ // overriding opacity value
+ opacity : 'auto',
+
+ // transition durations
+ duration : {
+ show : 500,
+ hide : 500
+ },
+// whether the dynamically created dimmer should have a loader
+ displayLoader: false,
+ loaderText : false,
+ loaderVariation : '',
+
+ onChange : function(){},
+ onShow : function(){},
+ onHide : function(){},
+
+ error : {
+ method : 'The method you called is not defined.'
+ },
+
+ className : {
+ active : 'active',
+ animating : 'animating',
+ dimmable : 'dimmable',
+ dimmed : 'dimmed',
+ dimmer : 'dimmer',
+ disabled : 'disabled',
+ hide : 'hide',
+ legacy : 'legacy',
+ pageDimmer : 'page',
+ show : 'show',
+ loader : 'ui loader'
+ },
+
+ selector: {
+ dimmer : '> .ui.dimmer',
+ content : '.ui.dimmer > .content, .ui.dimmer > .content > .center'
+ },
+
+ template: {
+ dimmer: function(settings) {
+ var d = $('
').addClass('ui dimmer'),l;
+ if(settings.displayLoader) {
+ l = $('
')
+ .addClass(settings.className.loader)
+ .addClass(settings.loaderVariation);
+ if(!!settings.loaderText){
+ l.text(settings.loaderText);
+ l.addClass('text');
+ }
+ d.append(l);
+ }
+ return d;
+ }
+ }
+
+};
+
+})( jQuery, window, document );
+
+/*!
+ * # Fomantic-UI 2.8.8 - Dropdown
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+'use strict';
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.dropdown = function(parameters) {
+ var
+ $allModules = $(this),
+ $document = $(document),
+
+ moduleSelector = $allModules.selector || '',
+
+ hasTouch = ('ontouchstart' in document.documentElement),
+ clickEvent = hasTouch
+ ? 'touchstart'
+ : 'click',
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+ returnedValue
+ ;
+
+ $allModules
+ .each(function(elementIndex) {
+ var
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.fn.dropdown.settings, parameters)
+ : $.extend({}, $.fn.dropdown.settings),
+
+ className = settings.className,
+ message = settings.message,
+ fields = settings.fields,
+ keys = settings.keys,
+ metadata = settings.metadata,
+ namespace = settings.namespace,
+ regExp = settings.regExp,
+ selector = settings.selector,
+ error = settings.error,
+ templates = settings.templates,
+
+ eventNamespace = '.' + namespace,
+ moduleNamespace = 'module-' + namespace,
+
+ $module = $(this),
+ $context = $(settings.context),
+ $text = $module.find(selector.text),
+ $search = $module.find(selector.search),
+ $sizer = $module.find(selector.sizer),
+ $input = $module.find(selector.input),
+ $icon = $module.find(selector.icon),
+ $clear = $module.find(selector.clearIcon),
+
+ $combo = ($module.prev().find(selector.text).length > 0)
+ ? $module.prev().find(selector.text)
+ : $module.prev(),
+
+ $menu = $module.children(selector.menu),
+ $item = $menu.find(selector.item),
+ $divider = settings.hideDividers ? $item.parent().children(selector.divider) : $(),
+
+ activated = false,
+ itemActivated = false,
+ internalChange = false,
+ iconClicked = false,
+ element = this,
+ focused = false,
+ instance = $module.data(moduleNamespace),
+
+ selectActionActive,
+ initialLoad,
+ pageLostFocus,
+ willRefocus,
+ elementNamespace,
+ id,
+ selectObserver,
+ menuObserver,
+ classObserver,
+ module
+ ;
+
+ module = {
+
+ initialize: function() {
+ module.debug('Initializing dropdown', settings);
+
+ if( module.is.alreadySetup() ) {
+ module.setup.reference();
+ }
+ else {
+ if (settings.ignoreDiacritics && !String.prototype.normalize) {
+ settings.ignoreDiacritics = false;
+ module.error(error.noNormalize, element);
+ }
+
+ module.setup.layout();
+
+ if(settings.values) {
+ module.set.initialLoad();
+ module.change.values(settings.values);
+ module.remove.initialLoad();
+ }
+
+ module.refreshData();
+
+ module.save.defaults();
+ module.restore.selected();
+
+ module.create.id();
+ module.bind.events();
+
+ module.observeChanges();
+ module.instantiate();
+ }
+
+ },
+
+ instantiate: function() {
+ module.verbose('Storing instance of dropdown', module);
+ instance = module;
+ $module
+ .data(moduleNamespace, module)
+ ;
+ },
+
+ destroy: function() {
+ module.verbose('Destroying previous dropdown', $module);
+ module.remove.tabbable();
+ module.remove.active();
+ $menu.transition('stop all');
+ $menu.removeClass(className.visible).addClass(className.hidden);
+ $module
+ .off(eventNamespace)
+ .removeData(moduleNamespace)
+ ;
+ $menu
+ .off(eventNamespace)
+ ;
+ $document
+ .off(elementNamespace)
+ ;
+ module.disconnect.menuObserver();
+ module.disconnect.selectObserver();
+ module.disconnect.classObserver();
+ },
+
+ observeChanges: function() {
+ if('MutationObserver' in window) {
+ selectObserver = new MutationObserver(module.event.select.mutation);
+ menuObserver = new MutationObserver(module.event.menu.mutation);
+ classObserver = new MutationObserver(module.event.class.mutation);
+ module.debug('Setting up mutation observer', selectObserver, menuObserver, classObserver);
+ module.observe.select();
+ module.observe.menu();
+ module.observe.class();
+ }
+ },
+
+ disconnect: {
+ menuObserver: function() {
+ if(menuObserver) {
+ menuObserver.disconnect();
+ }
+ },
+ selectObserver: function() {
+ if(selectObserver) {
+ selectObserver.disconnect();
+ }
+ },
+ classObserver: function() {
+ if(classObserver) {
+ classObserver.disconnect();
+ }
+ }
+ },
+ observe: {
+ select: function() {
+ if(module.has.input() && selectObserver) {
+ selectObserver.observe($module[0], {
+ childList : true,
+ subtree : true
+ });
+ }
+ },
+ menu: function() {
+ if(module.has.menu() && menuObserver) {
+ menuObserver.observe($menu[0], {
+ childList : true,
+ subtree : true
+ });
+ }
+ },
+ class: function() {
+ if(module.has.search() && classObserver) {
+ classObserver.observe($module[0], {
+ attributes : true
+ });
+ }
+ }
+ },
+
+ create: {
+ id: function() {
+ id = (Math.random().toString(16) + '000000000').substr(2, 8);
+ elementNamespace = '.' + id;
+ module.verbose('Creating unique id for element', id);
+ },
+ userChoice: function(values) {
+ var
+ $userChoices,
+ $userChoice,
+ isUserValue,
+ html
+ ;
+ values = values || module.get.userValues();
+ if(!values) {
+ return false;
+ }
+ values = Array.isArray(values)
+ ? values
+ : [values]
+ ;
+ $.each(values, function(index, value) {
+ if(module.get.item(value) === false) {
+ html = settings.templates.addition( module.add.variables(message.addResult, value) );
+ $userChoice = $('
')
+ .html(html)
+ .attr('data-' + metadata.value, value)
+ .attr('data-' + metadata.text, value)
+ .addClass(className.addition)
+ .addClass(className.item)
+ ;
+ if(settings.hideAdditions) {
+ $userChoice.addClass(className.hidden);
+ }
+ $userChoices = ($userChoices === undefined)
+ ? $userChoice
+ : $userChoices.add($userChoice)
+ ;
+ module.verbose('Creating user choices for value', value, $userChoice);
+ }
+ });
+ return $userChoices;
+ },
+ userLabels: function(value) {
+ var
+ userValues = module.get.userValues()
+ ;
+ if(userValues) {
+ module.debug('Adding user labels', userValues);
+ $.each(userValues, function(index, value) {
+ module.verbose('Adding custom user value');
+ module.add.label(value, value);
+ });
+ }
+ },
+ menu: function() {
+ $menu = $('
')
+ .addClass(className.menu)
+ .appendTo($module)
+ ;
+ },
+ sizer: function() {
+ $sizer = $(' ')
+ .addClass(className.sizer)
+ .insertAfter($search)
+ ;
+ }
+ },
+
+ search: function(query) {
+ query = (query !== undefined)
+ ? query
+ : module.get.query()
+ ;
+ module.verbose('Searching for query', query);
+ if(settings.fireOnInit === false && module.is.initialLoad()) {
+ module.verbose('Skipping callback on initial load', settings.onSearch);
+ } else if(module.has.minCharacters(query) && settings.onSearch.call(element, query) !== false) {
+ module.filter(query);
+ }
+ else {
+ module.hide(null,true);
+ }
+ },
+
+ select: {
+ firstUnfiltered: function() {
+ module.verbose('Selecting first non-filtered element');
+ module.remove.selectedItem();
+ $item
+ .not(selector.unselectable)
+ .not(selector.addition + selector.hidden)
+ .eq(0)
+ .addClass(className.selected)
+ ;
+ },
+ nextAvailable: function($selected) {
+ $selected = $selected.eq(0);
+ var
+ $nextAvailable = $selected.nextAll(selector.item).not(selector.unselectable).eq(0),
+ $prevAvailable = $selected.prevAll(selector.item).not(selector.unselectable).eq(0),
+ hasNext = ($nextAvailable.length > 0)
+ ;
+ if(hasNext) {
+ module.verbose('Moving selection to', $nextAvailable);
+ $nextAvailable.addClass(className.selected);
+ }
+ else {
+ module.verbose('Moving selection to', $prevAvailable);
+ $prevAvailable.addClass(className.selected);
+ }
+ }
+ },
+
+ setup: {
+ api: function() {
+ var
+ apiSettings = {
+ debug : settings.debug,
+ urlData : {
+ value : module.get.value(),
+ query : module.get.query()
+ },
+ on : false
+ }
+ ;
+ module.verbose('First request, initializing API');
+ $module
+ .api(apiSettings)
+ ;
+ },
+ layout: function() {
+ if( $module.is('select') ) {
+ module.setup.select();
+ module.setup.returnedObject();
+ }
+ if( !module.has.menu() ) {
+ module.create.menu();
+ }
+ if ( module.is.clearable() && !module.has.clearItem() ) {
+ module.verbose('Adding clear icon');
+ $clear = $(' ')
+ .addClass('remove icon')
+ .insertBefore($text)
+ ;
+ }
+ if( module.is.search() && !module.has.search() ) {
+ module.verbose('Adding search input');
+ $search = $(' ')
+ .addClass(className.search)
+ .prop('autocomplete', module.is.chrome() ? 'fomantic-search' : 'off')
+ .insertBefore($text)
+ ;
+ }
+ if( module.is.multiple() && module.is.searchSelection() && !module.has.sizer()) {
+ module.create.sizer();
+ }
+ if(settings.allowTab) {
+ module.set.tabbable();
+ }
+ },
+ select: function() {
+ var
+ selectValues = module.get.selectValues()
+ ;
+ module.debug('Dropdown initialized on a select', selectValues);
+ if( $module.is('select') ) {
+ $input = $module;
+ }
+ // see if select is placed correctly already
+ if($input.parent(selector.dropdown).length > 0) {
+ module.debug('UI dropdown already exists. Creating dropdown menu only');
+ $module = $input.closest(selector.dropdown);
+ if( !module.has.menu() ) {
+ module.create.menu();
+ }
+ $menu = $module.children(selector.menu);
+ module.setup.menu(selectValues);
+ }
+ else {
+ module.debug('Creating entire dropdown from select');
+ $module = $('
')
+ .attr('class', $input.attr('class') )
+ .addClass(className.selection)
+ .addClass(className.dropdown)
+ .html( templates.dropdown(selectValues, fields, settings.preserveHTML, settings.className) )
+ .insertBefore($input)
+ ;
+ if($input.hasClass(className.multiple) && $input.prop('multiple') === false) {
+ module.error(error.missingMultiple);
+ $input.prop('multiple', true);
+ }
+ if($input.is('[multiple]')) {
+ module.set.multiple();
+ }
+ if ($input.prop('disabled')) {
+ module.debug('Disabling dropdown');
+ $module.addClass(className.disabled);
+ }
+ $input
+ .removeAttr('required')
+ .removeAttr('class')
+ .detach()
+ .prependTo($module)
+ ;
+ }
+ module.refresh();
+ },
+ menu: function(values) {
+ $menu.html( templates.menu(values, fields,settings.preserveHTML,settings.className));
+ $item = $menu.find(selector.item);
+ $divider = settings.hideDividers ? $item.parent().children(selector.divider) : $();
+ },
+ reference: function() {
+ module.debug('Dropdown behavior was called on select, replacing with closest dropdown');
+ // replace module reference
+ $module = $module.parent(selector.dropdown);
+ instance = $module.data(moduleNamespace);
+ element = $module.get(0);
+ module.refresh();
+ module.setup.returnedObject();
+ },
+ returnedObject: function() {
+ var
+ $firstModules = $allModules.slice(0, elementIndex),
+ $lastModules = $allModules.slice(elementIndex + 1)
+ ;
+ // adjust all modules to use correct reference
+ $allModules = $firstModules.add($module).add($lastModules);
+ }
+ },
+
+ refresh: function() {
+ module.refreshSelectors();
+ module.refreshData();
+ },
+
+ refreshItems: function() {
+ $item = $menu.find(selector.item);
+ $divider = settings.hideDividers ? $item.parent().children(selector.divider) : $();
+ },
+
+ refreshSelectors: function() {
+ module.verbose('Refreshing selector cache');
+ $text = $module.find(selector.text);
+ $search = $module.find(selector.search);
+ $input = $module.find(selector.input);
+ $icon = $module.find(selector.icon);
+ $combo = ($module.prev().find(selector.text).length > 0)
+ ? $module.prev().find(selector.text)
+ : $module.prev()
+ ;
+ $menu = $module.children(selector.menu);
+ $item = $menu.find(selector.item);
+ $divider = settings.hideDividers ? $item.parent().children(selector.divider) : $();
+ },
+
+ refreshData: function() {
+ module.verbose('Refreshing cached metadata');
+ $item
+ .removeData(metadata.text)
+ .removeData(metadata.value)
+ ;
+ },
+
+ clearData: function() {
+ module.verbose('Clearing metadata');
+ $item
+ .removeData(metadata.text)
+ .removeData(metadata.value)
+ ;
+ $module
+ .removeData(metadata.defaultText)
+ .removeData(metadata.defaultValue)
+ .removeData(metadata.placeholderText)
+ ;
+ },
+
+ clearItems: function() {
+ $menu.empty();
+ module.refreshItems();
+ },
+
+ toggle: function() {
+ module.verbose('Toggling menu visibility');
+ if( !module.is.active() ) {
+ module.show();
+ }
+ else {
+ module.hide();
+ }
+ },
+
+ show: function(callback, preventFocus) {
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ if ((focused || iconClicked) && module.is.remote() && module.is.noApiCache()) {
+ module.clearItems();
+ }
+ if(!module.can.show() && module.is.remote()) {
+ module.debug('No API results retrieved, searching before show');
+ module.queryRemote(module.get.query(), module.show, [callback, preventFocus]);
+ }
+ if( module.can.show() && !module.is.active() ) {
+ module.debug('Showing dropdown');
+ if(module.has.message() && !(module.has.maxSelections() || module.has.allResultsFiltered()) ) {
+ module.remove.message();
+ }
+ if(module.is.allFiltered()) {
+ return true;
+ }
+ if(settings.onShow.call(element) !== false) {
+ module.animate.show(function() {
+ if( module.can.click() ) {
+ module.bind.intent();
+ }
+ if(module.has.search() && !preventFocus) {
+ module.focusSearch();
+ }
+ module.set.visible();
+ callback.call(element);
+ });
+ }
+ }
+ },
+
+ hide: function(callback, preventBlur) {
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ if( module.is.active() && !module.is.animatingOutward() ) {
+ module.debug('Hiding dropdown');
+ if(settings.onHide.call(element) !== false) {
+ module.animate.hide(function() {
+ module.remove.visible();
+ // hidding search focus
+ if ( module.is.focusedOnSearch() && preventBlur !== true ) {
+ $search.blur();
+ }
+ callback.call(element);
+ });
+ }
+ } else if( module.can.click() ) {
+ module.unbind.intent();
+ }
+ iconClicked = false;
+ focused = false;
+ },
+
+ hideOthers: function() {
+ module.verbose('Finding other dropdowns to hide');
+ $allModules
+ .not($module)
+ .has(selector.menu + '.' + className.visible)
+ .dropdown('hide')
+ ;
+ },
+
+ hideMenu: function() {
+ module.verbose('Hiding menu instantaneously');
+ module.remove.active();
+ module.remove.visible();
+ $menu.transition('hide');
+ },
+
+ hideSubMenus: function() {
+ var
+ $subMenus = $menu.children(selector.item).find(selector.menu)
+ ;
+ module.verbose('Hiding sub menus', $subMenus);
+ $subMenus.transition('hide');
+ },
+
+ bind: {
+ events: function() {
+ module.bind.keyboardEvents();
+ module.bind.inputEvents();
+ module.bind.mouseEvents();
+ },
+ keyboardEvents: function() {
+ module.verbose('Binding keyboard events');
+ $module
+ .on('keydown' + eventNamespace, module.event.keydown)
+ ;
+ if( module.has.search() ) {
+ $module
+ .on(module.get.inputEvent() + eventNamespace, selector.search, module.event.input)
+ ;
+ }
+ if( module.is.multiple() ) {
+ $document
+ .on('keydown' + elementNamespace, module.event.document.keydown)
+ ;
+ }
+ },
+ inputEvents: function() {
+ module.verbose('Binding input change events');
+ $module
+ .on('change' + eventNamespace, selector.input, module.event.change)
+ ;
+ },
+ mouseEvents: function() {
+ module.verbose('Binding mouse events');
+ if(module.is.multiple()) {
+ $module
+ .on(clickEvent + eventNamespace, selector.label, module.event.label.click)
+ .on(clickEvent + eventNamespace, selector.remove, module.event.remove.click)
+ ;
+ }
+ if( module.is.searchSelection() ) {
+ $module
+ .on('mousedown' + eventNamespace, module.event.mousedown)
+ .on('mouseup' + eventNamespace, module.event.mouseup)
+ .on('mousedown' + eventNamespace, selector.menu, module.event.menu.mousedown)
+ .on('mouseup' + eventNamespace, selector.menu, module.event.menu.mouseup)
+ .on(clickEvent + eventNamespace, selector.icon, module.event.icon.click)
+ .on(clickEvent + eventNamespace, selector.clearIcon, module.event.clearIcon.click)
+ .on('focus' + eventNamespace, selector.search, module.event.search.focus)
+ .on(clickEvent + eventNamespace, selector.search, module.event.search.focus)
+ .on('blur' + eventNamespace, selector.search, module.event.search.blur)
+ .on(clickEvent + eventNamespace, selector.text, module.event.text.focus)
+ ;
+ if(module.is.multiple()) {
+ $module
+ .on(clickEvent + eventNamespace, module.event.click)
+ .on(clickEvent + eventNamespace, module.event.search.focus)
+ ;
+ }
+ }
+ else {
+ if(settings.on == 'click') {
+ $module
+ .on(clickEvent + eventNamespace, selector.icon, module.event.icon.click)
+ .on(clickEvent + eventNamespace, module.event.test.toggle)
+ ;
+ }
+ else if(settings.on == 'hover') {
+ $module
+ .on('mouseenter' + eventNamespace, module.delay.show)
+ .on('mouseleave' + eventNamespace, module.delay.hide)
+ ;
+ }
+ else {
+ $module
+ .on(settings.on + eventNamespace, module.toggle)
+ ;
+ }
+ $module
+ .on('mousedown' + eventNamespace, module.event.mousedown)
+ .on('mouseup' + eventNamespace, module.event.mouseup)
+ .on('focus' + eventNamespace, module.event.focus)
+ .on(clickEvent + eventNamespace, selector.clearIcon, module.event.clearIcon.click)
+ ;
+ if(module.has.menuSearch() ) {
+ $module
+ .on('blur' + eventNamespace, selector.search, module.event.search.blur)
+ ;
+ }
+ else {
+ $module
+ .on('blur' + eventNamespace, module.event.blur)
+ ;
+ }
+ }
+ $menu
+ .on((hasTouch ? 'touchstart' : 'mouseenter') + eventNamespace, selector.item, module.event.item.mouseenter)
+ .on('mouseleave' + eventNamespace, selector.item, module.event.item.mouseleave)
+ .on('click' + eventNamespace, selector.item, module.event.item.click)
+ ;
+ },
+ intent: function() {
+ module.verbose('Binding hide intent event to document');
+ if(hasTouch) {
+ $document
+ .on('touchstart' + elementNamespace, module.event.test.touch)
+ .on('touchmove' + elementNamespace, module.event.test.touch)
+ ;
+ }
+ $document
+ .on(clickEvent + elementNamespace, module.event.test.hide)
+ ;
+ }
+ },
+
+ unbind: {
+ intent: function() {
+ module.verbose('Removing hide intent event from document');
+ if(hasTouch) {
+ $document
+ .off('touchstart' + elementNamespace)
+ .off('touchmove' + elementNamespace)
+ ;
+ }
+ $document
+ .off(clickEvent + elementNamespace)
+ ;
+ }
+ },
+
+ filter: function(query) {
+ var
+ searchTerm = (query !== undefined)
+ ? query
+ : module.get.query(),
+ afterFiltered = function() {
+ if(module.is.multiple()) {
+ module.filterActive();
+ }
+ if(query || (!query && module.get.activeItem().length == 0)) {
+ module.select.firstUnfiltered();
+ }
+ if( module.has.allResultsFiltered() ) {
+ if( settings.onNoResults.call(element, searchTerm) ) {
+ if(settings.allowAdditions) {
+ if(settings.hideAdditions) {
+ module.verbose('User addition with no menu, setting empty style');
+ module.set.empty();
+ module.hideMenu();
+ }
+ }
+ else {
+ module.verbose('All items filtered, showing message', searchTerm);
+ module.add.message(message.noResults);
+ }
+ }
+ else {
+ module.verbose('All items filtered, hiding dropdown', searchTerm);
+ module.hideMenu();
+ }
+ }
+ else {
+ module.remove.empty();
+ module.remove.message();
+ }
+ if(settings.allowAdditions) {
+ module.add.userSuggestion(module.escape.htmlEntities(query));
+ }
+ if(module.is.searchSelection() && module.can.show() && module.is.focusedOnSearch() ) {
+ module.show();
+ }
+ }
+ ;
+ if(settings.useLabels && module.has.maxSelections()) {
+ return;
+ }
+ if(settings.apiSettings) {
+ if( module.can.useAPI() ) {
+ module.queryRemote(searchTerm, function() {
+ if(settings.filterRemoteData) {
+ module.filterItems(searchTerm);
+ }
+ var preSelected = $input.val();
+ if(!Array.isArray(preSelected)) {
+ preSelected = preSelected && preSelected!=="" ? preSelected.split(settings.delimiter) : [];
+ }
+ if (module.is.multiple()) {
+ $.each(preSelected,function(index,value){
+ $item.filter('[data-value="'+value+'"]')
+ .addClass(className.filtered)
+ ;
+ });
+ }
+ module.focusSearch(true);
+ afterFiltered();
+ });
+ }
+ else {
+ module.error(error.noAPI);
+ }
+ }
+ else {
+ module.filterItems(searchTerm);
+ afterFiltered();
+ }
+ },
+
+ queryRemote: function(query, callback, callbackParameters) {
+ if(!Array.isArray(callbackParameters)){
+ callbackParameters = [callbackParameters];
+ }
+ var
+ apiSettings = {
+ errorDuration : false,
+ cache : 'local',
+ throttle : settings.throttle,
+ urlData : {
+ query: query
+ },
+ onError: function() {
+ module.add.message(message.serverError);
+ iconClicked = false;
+ focused = false;
+ callback.apply(null, callbackParameters);
+ },
+ onFailure: function() {
+ module.add.message(message.serverError);
+ iconClicked = false;
+ focused = false;
+ callback.apply(null, callbackParameters);
+ },
+ onSuccess : function(response) {
+ var
+ values = response[fields.remoteValues]
+ ;
+ if (!Array.isArray(values)){
+ values = [];
+ }
+ module.remove.message();
+ var menuConfig = {};
+ menuConfig[fields.values] = values;
+ module.setup.menu(menuConfig);
+
+ if(values.length===0 && !settings.allowAdditions) {
+ module.add.message(message.noResults);
+ }
+ else {
+ var value = module.is.multiple() ? module.get.values() : module.get.value();
+ if (value !== '') {
+ module.verbose('Value(s) present after click icon, select value(s) in items');
+ module.set.selected(value, null, null, true);
+ }
+ }
+ iconClicked = false;
+ focused = false;
+ callback.apply(null, callbackParameters);
+ }
+ }
+ ;
+ if( !$module.api('get request') ) {
+ module.setup.api();
+ }
+ apiSettings = $.extend(true, {}, apiSettings, settings.apiSettings);
+ $module
+ .api('setting', apiSettings)
+ .api('query')
+ ;
+ },
+
+ filterItems: function(query) {
+ var
+ searchTerm = module.remove.diacritics(query !== undefined
+ ? query
+ : module.get.query()
+ ),
+ results = null,
+ escapedTerm = module.escape.string(searchTerm),
+ regExpFlags = (settings.ignoreSearchCase ? 'i' : '') + 'gm',
+ beginsWithRegExp = new RegExp('^' + escapedTerm, regExpFlags)
+ ;
+ // avoid loop if we're matching nothing
+ if( module.has.query() ) {
+ results = [];
+
+ module.verbose('Searching for matching values', searchTerm);
+ $item
+ .each(function(){
+ var
+ $choice = $(this),
+ text,
+ value
+ ;
+ if($choice.hasClass(className.unfilterable)) {
+ results.push(this);
+ return true;
+ }
+ if(settings.match === 'both' || settings.match === 'text') {
+ text = module.remove.diacritics(String(module.get.choiceText($choice, false)));
+ if(text.search(beginsWithRegExp) !== -1) {
+ results.push(this);
+ return true;
+ }
+ else if (settings.fullTextSearch === 'exact' && module.exactSearch(searchTerm, text)) {
+ results.push(this);
+ return true;
+ }
+ else if (settings.fullTextSearch === true && module.fuzzySearch(searchTerm, text)) {
+ results.push(this);
+ return true;
+ }
+ }
+ if(settings.match === 'both' || settings.match === 'value') {
+ value = module.remove.diacritics(String(module.get.choiceValue($choice, text)));
+ if(value.search(beginsWithRegExp) !== -1) {
+ results.push(this);
+ return true;
+ }
+ else if (settings.fullTextSearch === 'exact' && module.exactSearch(searchTerm, value)) {
+ results.push(this);
+ return true;
+ }
+ else if (settings.fullTextSearch === true && module.fuzzySearch(searchTerm, value)) {
+ results.push(this);
+ return true;
+ }
+ }
+ })
+ ;
+ }
+ module.debug('Showing only matched items', searchTerm);
+ module.remove.filteredItem();
+ if(results) {
+ $item
+ .not(results)
+ .addClass(className.filtered)
+ ;
+ }
+
+ if(!module.has.query()) {
+ $divider
+ .removeClass(className.hidden);
+ } else if(settings.hideDividers === true) {
+ $divider
+ .addClass(className.hidden);
+ } else if(settings.hideDividers === 'empty') {
+ $divider
+ .removeClass(className.hidden)
+ .filter(function() {
+ // First find the last divider in this divider group
+ // Dividers which are direct siblings are considered a group
+ var lastDivider = $(this).nextUntil(selector.item);
+
+ return (lastDivider.length ? lastDivider : $(this))
+ // Count all non-filtered items until the next divider (or end of the dropdown)
+ .nextUntil(selector.divider)
+ .filter(selector.item + ":not(." + className.filtered + ")")
+ // Hide divider if no items are found
+ .length === 0;
+ })
+ .addClass(className.hidden);
+ }
+ },
+
+ fuzzySearch: function(query, term) {
+ var
+ termLength = term.length,
+ queryLength = query.length
+ ;
+ query = (settings.ignoreSearchCase ? query.toLowerCase() : query);
+ term = (settings.ignoreSearchCase ? term.toLowerCase() : term);
+ if(queryLength > termLength) {
+ return false;
+ }
+ if(queryLength === termLength) {
+ return (query === term);
+ }
+ search: for (var characterIndex = 0, nextCharacterIndex = 0; characterIndex < queryLength; characterIndex++) {
+ var
+ queryCharacter = query.charCodeAt(characterIndex)
+ ;
+ while(nextCharacterIndex < termLength) {
+ if(term.charCodeAt(nextCharacterIndex++) === queryCharacter) {
+ continue search;
+ }
+ }
+ return false;
+ }
+ return true;
+ },
+ exactSearch: function (query, term) {
+ query = (settings.ignoreSearchCase ? query.toLowerCase() : query);
+ term = (settings.ignoreSearchCase ? term.toLowerCase() : term);
+ return term.indexOf(query) > -1;
+
+ },
+ filterActive: function() {
+ if(settings.useLabels) {
+ $item.filter('.' + className.active)
+ .addClass(className.filtered)
+ ;
+ }
+ },
+
+ focusSearch: function(skipHandler) {
+ if( module.has.search() && !module.is.focusedOnSearch() ) {
+ if(skipHandler) {
+ $module.off('focus' + eventNamespace, selector.search);
+ $search.focus();
+ $module.on('focus' + eventNamespace, selector.search, module.event.search.focus);
+ }
+ else {
+ $search.focus();
+ }
+ }
+ },
+
+ blurSearch: function() {
+ if( module.has.search() ) {
+ $search.blur();
+ }
+ },
+
+ forceSelection: function() {
+ var
+ $currentlySelected = $item.not(className.filtered).filter('.' + className.selected).eq(0),
+ $activeItem = $item.not(className.filtered).filter('.' + className.active).eq(0),
+ $selectedItem = ($currentlySelected.length > 0)
+ ? $currentlySelected
+ : $activeItem,
+ hasSelected = ($selectedItem.length > 0)
+ ;
+ if(settings.allowAdditions || (hasSelected && !module.is.multiple())) {
+ module.debug('Forcing partial selection to selected item', $selectedItem);
+ module.event.item.click.call($selectedItem, {}, true);
+ }
+ else {
+ module.remove.searchTerm();
+ }
+ },
+
+ change: {
+ values: function(values) {
+ if(!settings.allowAdditions) {
+ module.clear();
+ }
+ module.debug('Creating dropdown with specified values', values);
+ var menuConfig = {};
+ menuConfig[fields.values] = values;
+ module.setup.menu(menuConfig);
+ $.each(values, function(index, item) {
+ if(item.selected == true) {
+ module.debug('Setting initial selection to', item[fields.value]);
+ module.set.selected(item[fields.value]);
+ if(!module.is.multiple()) {
+ return false;
+ }
+ }
+ });
+
+ if(module.has.selectInput()) {
+ module.disconnect.selectObserver();
+ $input.html('');
+ $input.append(' ');
+ $.each(values, function(index, item) {
+ var
+ value = settings.templates.deQuote(item[fields.value]),
+ name = settings.templates.escape(
+ item[fields.name] || '',
+ settings.preserveHTML
+ )
+ ;
+ $input.append('' + name + ' ');
+ });
+ module.observe.select();
+ }
+ }
+ },
+
+ event: {
+ change: function() {
+ if(!internalChange) {
+ module.debug('Input changed, updating selection');
+ module.set.selected();
+ }
+ },
+ focus: function() {
+ if(settings.showOnFocus && !activated && module.is.hidden() && !pageLostFocus) {
+ focused = true;
+ module.show();
+ }
+ },
+ blur: function(event) {
+ pageLostFocus = (document.activeElement === this);
+ if(!activated && !pageLostFocus) {
+ module.remove.activeLabel();
+ module.hide();
+ }
+ },
+ mousedown: function() {
+ if(module.is.searchSelection()) {
+ // prevent menu hiding on immediate re-focus
+ willRefocus = true;
+ }
+ else {
+ // prevents focus callback from occurring on mousedown
+ activated = true;
+ }
+ },
+ mouseup: function() {
+ if(module.is.searchSelection()) {
+ // prevent menu hiding on immediate re-focus
+ willRefocus = false;
+ }
+ else {
+ activated = false;
+ }
+ },
+ click: function(event) {
+ var
+ $target = $(event.target)
+ ;
+ // focus search
+ if($target.is($module)) {
+ if(!module.is.focusedOnSearch()) {
+ module.focusSearch();
+ }
+ else {
+ module.show();
+ }
+ }
+ },
+ search: {
+ focus: function(event) {
+ activated = true;
+ if(module.is.multiple()) {
+ module.remove.activeLabel();
+ }
+ if(!focused && !module.is.active() && (settings.showOnFocus || (event.type !== 'focus' && event.type !== 'focusin'))) {
+ focused = true;
+ module.search();
+ }
+ },
+ blur: function(event) {
+ pageLostFocus = (document.activeElement === this);
+ if(module.is.searchSelection() && !willRefocus) {
+ if(!itemActivated && !pageLostFocus) {
+ if(settings.forceSelection) {
+ module.forceSelection();
+ } else if(!settings.allowAdditions){
+ module.remove.searchTerm();
+ }
+ module.hide();
+ }
+ }
+ willRefocus = false;
+ }
+ },
+ clearIcon: {
+ click: function(event) {
+ module.clear();
+ if(module.is.searchSelection()) {
+ module.remove.searchTerm();
+ }
+ module.hide();
+ event.stopPropagation();
+ }
+ },
+ icon: {
+ click: function(event) {
+ iconClicked=true;
+ if(module.has.search()) {
+ if(!module.is.active()) {
+ if(settings.showOnFocus){
+ module.focusSearch();
+ } else {
+ module.toggle();
+ }
+ } else {
+ module.blurSearch();
+ }
+ } else {
+ module.toggle();
+ }
+ event.stopPropagation();
+ }
+ },
+ text: {
+ focus: function(event) {
+ activated = true;
+ module.focusSearch();
+ }
+ },
+ input: function(event) {
+ if(module.is.multiple() || module.is.searchSelection()) {
+ module.set.filtered();
+ }
+ clearTimeout(module.timer);
+ module.timer = setTimeout(module.search, settings.delay.search);
+ },
+ label: {
+ click: function(event) {
+ var
+ $label = $(this),
+ $labels = $module.find(selector.label),
+ $activeLabels = $labels.filter('.' + className.active),
+ $nextActive = $label.nextAll('.' + className.active),
+ $prevActive = $label.prevAll('.' + className.active),
+ $range = ($nextActive.length > 0)
+ ? $label.nextUntil($nextActive).add($activeLabels).add($label)
+ : $label.prevUntil($prevActive).add($activeLabels).add($label)
+ ;
+ if(event.shiftKey) {
+ $activeLabels.removeClass(className.active);
+ $range.addClass(className.active);
+ }
+ else if(event.ctrlKey) {
+ $label.toggleClass(className.active);
+ }
+ else {
+ $activeLabels.removeClass(className.active);
+ $label.addClass(className.active);
+ }
+ settings.onLabelSelect.apply(this, $labels.filter('.' + className.active));
+ event.stopPropagation();
+ }
+ },
+ remove: {
+ click: function(event) {
+ var
+ $label = $(this).parent()
+ ;
+ if( $label.hasClass(className.active) ) {
+ // remove all selected labels
+ module.remove.activeLabels();
+ }
+ else {
+ // remove this label only
+ module.remove.activeLabels( $label );
+ }
+ event.stopPropagation();
+ }
+ },
+ test: {
+ toggle: function(event) {
+ var
+ toggleBehavior = (module.is.multiple())
+ ? module.show
+ : module.toggle
+ ;
+ if(module.is.bubbledLabelClick(event) || module.is.bubbledIconClick(event)) {
+ return;
+ }
+ if (!module.is.multiple() || (module.is.multiple() && !module.is.active())) {
+ focused = true;
+ }
+ if( module.determine.eventOnElement(event, toggleBehavior) ) {
+ event.preventDefault();
+ }
+ },
+ touch: function(event) {
+ module.determine.eventOnElement(event, function() {
+ if(event.type == 'touchstart') {
+ module.timer = setTimeout(function() {
+ module.hide();
+ }, settings.delay.touch);
+ }
+ else if(event.type == 'touchmove') {
+ clearTimeout(module.timer);
+ }
+ });
+ event.stopPropagation();
+ },
+ hide: function(event) {
+ if(module.determine.eventInModule(event, module.hide)){
+ if(element.id && $(event.target).attr('for') === element.id){
+ event.preventDefault();
+ }
+ }
+ }
+ },
+ class: {
+ mutation: function(mutations) {
+ mutations.forEach(function(mutation) {
+ if(mutation.attributeName === "class") {
+ module.check.disabled();
+ }
+ });
+ }
+ },
+ select: {
+ mutation: function(mutations) {
+ module.debug(' modified, recreating menu');
+ if(module.is.selectMutation(mutations)) {
+ module.disconnect.selectObserver();
+ module.refresh();
+ module.setup.select();
+ module.set.selected();
+ module.observe.select();
+ }
+ }
+ },
+ menu: {
+ mutation: function(mutations) {
+ var
+ mutation = mutations[0],
+ $addedNode = mutation.addedNodes
+ ? $(mutation.addedNodes[0])
+ : $(false),
+ $removedNode = mutation.removedNodes
+ ? $(mutation.removedNodes[0])
+ : $(false),
+ $changedNodes = $addedNode.add($removedNode),
+ isUserAddition = $changedNodes.is(selector.addition) || $changedNodes.closest(selector.addition).length > 0,
+ isMessage = $changedNodes.is(selector.message) || $changedNodes.closest(selector.message).length > 0
+ ;
+ if(isUserAddition || isMessage) {
+ module.debug('Updating item selector cache');
+ module.refreshItems();
+ }
+ else {
+ module.debug('Menu modified, updating selector cache');
+ module.refresh();
+ }
+ },
+ mousedown: function() {
+ itemActivated = true;
+ },
+ mouseup: function() {
+ itemActivated = false;
+ }
+ },
+ item: {
+ mouseenter: function(event) {
+ var
+ $target = $(event.target),
+ $item = $(this),
+ $subMenu = $item.children(selector.menu),
+ $otherMenus = $item.siblings(selector.item).children(selector.menu),
+ hasSubMenu = ($subMenu.length > 0),
+ isBubbledEvent = ($subMenu.find($target).length > 0)
+ ;
+ if( !isBubbledEvent && hasSubMenu ) {
+ clearTimeout(module.itemTimer);
+ module.itemTimer = setTimeout(function() {
+ module.verbose('Showing sub-menu', $subMenu);
+ $.each($otherMenus, function() {
+ module.animate.hide(false, $(this));
+ });
+ module.animate.show(false, $subMenu);
+ }, settings.delay.show);
+ event.preventDefault();
+ }
+ },
+ mouseleave: function(event) {
+ var
+ $subMenu = $(this).children(selector.menu)
+ ;
+ if($subMenu.length > 0) {
+ clearTimeout(module.itemTimer);
+ module.itemTimer = setTimeout(function() {
+ module.verbose('Hiding sub-menu', $subMenu);
+ module.animate.hide(false, $subMenu);
+ }, settings.delay.hide);
+ }
+ },
+ click: function (event, skipRefocus) {
+ var
+ $choice = $(this),
+ $target = (event)
+ ? $(event.target)
+ : $(''),
+ $subMenu = $choice.find(selector.menu),
+ text = module.get.choiceText($choice),
+ value = module.get.choiceValue($choice, text),
+ hasSubMenu = ($subMenu.length > 0),
+ isBubbledEvent = ($subMenu.find($target).length > 0)
+ ;
+ // prevents IE11 bug where menu receives focus even though `tabindex=-1`
+ if (document.activeElement.tagName.toLowerCase() !== 'input') {
+ $(document.activeElement).blur();
+ }
+ if(!isBubbledEvent && (!hasSubMenu || settings.allowCategorySelection)) {
+ if(module.is.searchSelection()) {
+ if(settings.allowAdditions) {
+ module.remove.userAddition();
+ }
+ module.remove.searchTerm();
+ if(!module.is.focusedOnSearch() && !(skipRefocus == true)) {
+ module.focusSearch(true);
+ }
+ }
+ if(!settings.useLabels) {
+ module.remove.filteredItem();
+ module.set.scrollPosition($choice);
+ }
+ module.determine.selectAction.call(this, text, value);
+ }
+ }
+ },
+
+ document: {
+ // label selection should occur even when element has no focus
+ keydown: function(event) {
+ var
+ pressedKey = event.which,
+ isShortcutKey = module.is.inObject(pressedKey, keys)
+ ;
+ if(isShortcutKey) {
+ var
+ $label = $module.find(selector.label),
+ $activeLabel = $label.filter('.' + className.active),
+ activeValue = $activeLabel.data(metadata.value),
+ labelIndex = $label.index($activeLabel),
+ labelCount = $label.length,
+ hasActiveLabel = ($activeLabel.length > 0),
+ hasMultipleActive = ($activeLabel.length > 1),
+ isFirstLabel = (labelIndex === 0),
+ isLastLabel = (labelIndex + 1 == labelCount),
+ isSearch = module.is.searchSelection(),
+ isFocusedOnSearch = module.is.focusedOnSearch(),
+ isFocused = module.is.focused(),
+ caretAtStart = (isFocusedOnSearch && module.get.caretPosition(false) === 0),
+ isSelectedSearch = (caretAtStart && module.get.caretPosition(true) !== 0),
+ $nextLabel
+ ;
+ if(isSearch && !hasActiveLabel && !isFocusedOnSearch) {
+ return;
+ }
+
+ if(pressedKey == keys.leftArrow) {
+ // activate previous label
+ if((isFocused || caretAtStart) && !hasActiveLabel) {
+ module.verbose('Selecting previous label');
+ $label.last().addClass(className.active);
+ }
+ else if(hasActiveLabel) {
+ if(!event.shiftKey) {
+ module.verbose('Selecting previous label');
+ $label.removeClass(className.active);
+ }
+ else {
+ module.verbose('Adding previous label to selection');
+ }
+ if(isFirstLabel && !hasMultipleActive) {
+ $activeLabel.addClass(className.active);
+ }
+ else {
+ $activeLabel.prev(selector.siblingLabel)
+ .addClass(className.active)
+ .end()
+ ;
+ }
+ event.preventDefault();
+ }
+ }
+ else if(pressedKey == keys.rightArrow) {
+ // activate first label
+ if(isFocused && !hasActiveLabel) {
+ $label.first().addClass(className.active);
+ }
+ // activate next label
+ if(hasActiveLabel) {
+ if(!event.shiftKey) {
+ module.verbose('Selecting next label');
+ $label.removeClass(className.active);
+ }
+ else {
+ module.verbose('Adding next label to selection');
+ }
+ if(isLastLabel) {
+ if(isSearch) {
+ if(!isFocusedOnSearch) {
+ module.focusSearch();
+ }
+ else {
+ $label.removeClass(className.active);
+ }
+ }
+ else if(hasMultipleActive) {
+ $activeLabel.next(selector.siblingLabel).addClass(className.active);
+ }
+ else {
+ $activeLabel.addClass(className.active);
+ }
+ }
+ else {
+ $activeLabel.next(selector.siblingLabel).addClass(className.active);
+ }
+ event.preventDefault();
+ }
+ }
+ else if(pressedKey == keys.deleteKey || pressedKey == keys.backspace) {
+ if(hasActiveLabel) {
+ module.verbose('Removing active labels');
+ if(isLastLabel) {
+ if(isSearch && !isFocusedOnSearch) {
+ module.focusSearch();
+ }
+ }
+ $activeLabel.last().next(selector.siblingLabel).addClass(className.active);
+ module.remove.activeLabels($activeLabel);
+ event.preventDefault();
+ }
+ else if(caretAtStart && !isSelectedSearch && !hasActiveLabel && pressedKey == keys.backspace) {
+ module.verbose('Removing last label on input backspace');
+ $activeLabel = $label.last().addClass(className.active);
+ module.remove.activeLabels($activeLabel);
+ }
+ }
+ else {
+ $activeLabel.removeClass(className.active);
+ }
+ }
+ }
+ },
+
+ keydown: function(event) {
+ var
+ pressedKey = event.which,
+ isShortcutKey = module.is.inObject(pressedKey, keys)
+ ;
+ if(isShortcutKey) {
+ var
+ $currentlySelected = $item.not(selector.unselectable).filter('.' + className.selected).eq(0),
+ $activeItem = $menu.children('.' + className.active).eq(0),
+ $selectedItem = ($currentlySelected.length > 0)
+ ? $currentlySelected
+ : $activeItem,
+ $visibleItems = ($selectedItem.length > 0)
+ ? $selectedItem.siblings(':not(.' + className.filtered +')').addBack()
+ : $menu.children(':not(.' + className.filtered +')'),
+ $subMenu = $selectedItem.children(selector.menu),
+ $parentMenu = $selectedItem.closest(selector.menu),
+ inVisibleMenu = ($parentMenu.hasClass(className.visible) || $parentMenu.hasClass(className.animating) || $parentMenu.parent(selector.menu).length > 0),
+ hasSubMenu = ($subMenu.length> 0),
+ hasSelectedItem = ($selectedItem.length > 0),
+ selectedIsSelectable = ($selectedItem.not(selector.unselectable).length > 0),
+ delimiterPressed = (pressedKey == keys.delimiter && settings.allowAdditions && module.is.multiple()),
+ isAdditionWithoutMenu = (settings.allowAdditions && settings.hideAdditions && (pressedKey == keys.enter || delimiterPressed) && selectedIsSelectable),
+ $nextItem,
+ isSubMenuItem,
+ newIndex
+ ;
+ // allow selection with menu closed
+ if(isAdditionWithoutMenu) {
+ module.verbose('Selecting item from keyboard shortcut', $selectedItem);
+ module.event.item.click.call($selectedItem, event);
+ if(module.is.searchSelection()) {
+ module.remove.searchTerm();
+ }
+ if(module.is.multiple()){
+ event.preventDefault();
+ }
+ }
+
+ // visible menu keyboard shortcuts
+ if( module.is.visible() ) {
+
+ // enter (select or open sub-menu)
+ if(pressedKey == keys.enter || delimiterPressed) {
+ if(pressedKey == keys.enter && hasSelectedItem && hasSubMenu && !settings.allowCategorySelection) {
+ module.verbose('Pressed enter on unselectable category, opening sub menu');
+ pressedKey = keys.rightArrow;
+ }
+ else if(selectedIsSelectable) {
+ module.verbose('Selecting item from keyboard shortcut', $selectedItem);
+ module.event.item.click.call($selectedItem, event);
+ if(module.is.searchSelection()) {
+ module.remove.searchTerm();
+ if(module.is.multiple()) {
+ $search.focus();
+ }
+ }
+ }
+ event.preventDefault();
+ }
+
+ // sub-menu actions
+ if(hasSelectedItem) {
+
+ if(pressedKey == keys.leftArrow) {
+
+ isSubMenuItem = ($parentMenu[0] !== $menu[0]);
+
+ if(isSubMenuItem) {
+ module.verbose('Left key pressed, closing sub-menu');
+ module.animate.hide(false, $parentMenu);
+ $selectedItem
+ .removeClass(className.selected)
+ ;
+ $parentMenu
+ .closest(selector.item)
+ .addClass(className.selected)
+ ;
+ event.preventDefault();
+ }
+ }
+
+ // right arrow (show sub-menu)
+ if(pressedKey == keys.rightArrow) {
+ if(hasSubMenu) {
+ module.verbose('Right key pressed, opening sub-menu');
+ module.animate.show(false, $subMenu);
+ $selectedItem
+ .removeClass(className.selected)
+ ;
+ $subMenu
+ .find(selector.item).eq(0)
+ .addClass(className.selected)
+ ;
+ event.preventDefault();
+ }
+ }
+ }
+
+ // up arrow (traverse menu up)
+ if(pressedKey == keys.upArrow) {
+ $nextItem = (hasSelectedItem && inVisibleMenu)
+ ? $selectedItem.prevAll(selector.item + ':not(' + selector.unselectable + ')').eq(0)
+ : $item.eq(0)
+ ;
+ if($visibleItems.index( $nextItem ) < 0) {
+ module.verbose('Up key pressed but reached top of current menu');
+ event.preventDefault();
+ return;
+ }
+ else {
+ module.verbose('Up key pressed, changing active item');
+ $selectedItem
+ .removeClass(className.selected)
+ ;
+ $nextItem
+ .addClass(className.selected)
+ ;
+ module.set.scrollPosition($nextItem);
+ if(settings.selectOnKeydown && module.is.single()) {
+ module.set.selectedItem($nextItem);
+ }
+ }
+ event.preventDefault();
+ }
+
+ // down arrow (traverse menu down)
+ if(pressedKey == keys.downArrow) {
+ $nextItem = (hasSelectedItem && inVisibleMenu)
+ ? $nextItem = $selectedItem.nextAll(selector.item + ':not(' + selector.unselectable + ')').eq(0)
+ : $item.eq(0)
+ ;
+ if($nextItem.length === 0) {
+ module.verbose('Down key pressed but reached bottom of current menu');
+ event.preventDefault();
+ return;
+ }
+ else {
+ module.verbose('Down key pressed, changing active item');
+ $item
+ .removeClass(className.selected)
+ ;
+ $nextItem
+ .addClass(className.selected)
+ ;
+ module.set.scrollPosition($nextItem);
+ if(settings.selectOnKeydown && module.is.single()) {
+ module.set.selectedItem($nextItem);
+ }
+ }
+ event.preventDefault();
+ }
+
+ // page down (show next page)
+ if(pressedKey == keys.pageUp) {
+ module.scrollPage('up');
+ event.preventDefault();
+ }
+ if(pressedKey == keys.pageDown) {
+ module.scrollPage('down');
+ event.preventDefault();
+ }
+
+ // escape (close menu)
+ if(pressedKey == keys.escape) {
+ module.verbose('Escape key pressed, closing dropdown');
+ module.hide();
+ }
+
+ }
+ else {
+ // delimiter key
+ if(delimiterPressed) {
+ event.preventDefault();
+ }
+ // down arrow (open menu)
+ if(pressedKey == keys.downArrow && !module.is.visible()) {
+ module.verbose('Down key pressed, showing dropdown');
+ module.show();
+ event.preventDefault();
+ }
+ }
+ }
+ else {
+ if( !module.has.search() ) {
+ module.set.selectedLetter( String.fromCharCode(pressedKey) );
+ }
+ }
+ }
+ },
+
+ trigger: {
+ change: function() {
+ var
+ inputElement = $input[0]
+ ;
+ if(inputElement) {
+ var events = document.createEvent('HTMLEvents');
+ module.verbose('Triggering native change event');
+ events.initEvent('change', true, false);
+ inputElement.dispatchEvent(events);
+ }
+ }
+ },
+
+ determine: {
+ selectAction: function(text, value) {
+ selectActionActive = true;
+ module.verbose('Determining action', settings.action);
+ if( $.isFunction( module.action[settings.action] ) ) {
+ module.verbose('Triggering preset action', settings.action, text, value);
+ module.action[ settings.action ].call(element, text, value, this);
+ }
+ else if( $.isFunction(settings.action) ) {
+ module.verbose('Triggering user action', settings.action, text, value);
+ settings.action.call(element, text, value, this);
+ }
+ else {
+ module.error(error.action, settings.action);
+ }
+ selectActionActive = false;
+ },
+ eventInModule: function(event, callback) {
+ var
+ $target = $(event.target),
+ inDocument = ($target.closest(document.documentElement).length > 0),
+ inModule = ($target.closest($module).length > 0)
+ ;
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ if(inDocument && !inModule) {
+ module.verbose('Triggering event', callback);
+ callback();
+ return true;
+ }
+ else {
+ module.verbose('Event occurred in dropdown, canceling callback');
+ return false;
+ }
+ },
+ eventOnElement: function(event, callback) {
+ var
+ $target = $(event.target),
+ $label = $target.closest(selector.siblingLabel),
+ inVisibleDOM = document.body.contains(event.target),
+ notOnLabel = ($module.find($label).length === 0 || !(module.is.multiple() && settings.useLabels)),
+ notInMenu = ($target.closest($menu).length === 0)
+ ;
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ if(inVisibleDOM && notOnLabel && notInMenu) {
+ module.verbose('Triggering event', callback);
+ callback();
+ return true;
+ }
+ else {
+ module.verbose('Event occurred in dropdown menu, canceling callback');
+ return false;
+ }
+ }
+ },
+
+ action: {
+
+ nothing: function() {},
+
+ activate: function(text, value, element) {
+ value = (value !== undefined)
+ ? value
+ : text
+ ;
+ if( module.can.activate( $(element) ) ) {
+ module.set.selected(value, $(element));
+ if(!module.is.multiple()) {
+ module.hideAndClear();
+ }
+ }
+ },
+
+ select: function(text, value, element) {
+ value = (value !== undefined)
+ ? value
+ : text
+ ;
+ if( module.can.activate( $(element) ) ) {
+ module.set.value(value, text, $(element));
+ if(!module.is.multiple()) {
+ module.hideAndClear();
+ }
+ }
+ },
+
+ combo: function(text, value, element) {
+ value = (value !== undefined)
+ ? value
+ : text
+ ;
+ module.set.selected(value, $(element));
+ module.hideAndClear();
+ },
+
+ hide: function(text, value, element) {
+ module.set.value(value, text, $(element));
+ module.hideAndClear();
+ }
+
+ },
+
+ get: {
+ id: function() {
+ return id;
+ },
+ defaultText: function() {
+ return $module.data(metadata.defaultText);
+ },
+ defaultValue: function() {
+ return $module.data(metadata.defaultValue);
+ },
+ placeholderText: function() {
+ if(settings.placeholder != 'auto' && typeof settings.placeholder == 'string') {
+ return settings.placeholder;
+ }
+ return $module.data(metadata.placeholderText) || '';
+ },
+ text: function() {
+ return settings.preserveHTML ? $text.html() : $text.text();
+ },
+ query: function() {
+ return String($search.val()).trim();
+ },
+ searchWidth: function(value) {
+ value = (value !== undefined)
+ ? value
+ : $search.val()
+ ;
+ $sizer.text(value);
+ // prevent rounding issues
+ return Math.ceil( $sizer.width() + 1);
+ },
+ selectionCount: function() {
+ var
+ values = module.get.values(),
+ count
+ ;
+ count = ( module.is.multiple() )
+ ? Array.isArray(values)
+ ? values.length
+ : 0
+ : (module.get.value() !== '')
+ ? 1
+ : 0
+ ;
+ return count;
+ },
+ transition: function($subMenu) {
+ return (settings.transition === 'auto')
+ ? module.is.upward($subMenu)
+ ? 'slide up'
+ : 'slide down'
+ : settings.transition
+ ;
+ },
+ userValues: function() {
+ var
+ values = module.get.values()
+ ;
+ if(!values) {
+ return false;
+ }
+ values = Array.isArray(values)
+ ? values
+ : [values]
+ ;
+ return $.grep(values, function(value) {
+ return (module.get.item(value) === false);
+ });
+ },
+ uniqueArray: function(array) {
+ return $.grep(array, function (value, index) {
+ return $.inArray(value, array) === index;
+ });
+ },
+ caretPosition: function(returnEndPos) {
+ var
+ input = $search.get(0),
+ range,
+ rangeLength
+ ;
+ if(returnEndPos && 'selectionEnd' in input){
+ return input.selectionEnd;
+ }
+ else if(!returnEndPos && 'selectionStart' in input) {
+ return input.selectionStart;
+ }
+ if (document.selection) {
+ input.focus();
+ range = document.selection.createRange();
+ rangeLength = range.text.length;
+ if(returnEndPos) {
+ return rangeLength;
+ }
+ range.moveStart('character', -input.value.length);
+ return range.text.length - rangeLength;
+ }
+ },
+ value: function() {
+ var
+ value = ($input.length > 0)
+ ? $input.val()
+ : $module.data(metadata.value),
+ isEmptyMultiselect = (Array.isArray(value) && value.length === 1 && value[0] === '')
+ ;
+ // prevents placeholder element from being selected when multiple
+ return (value === undefined || isEmptyMultiselect)
+ ? ''
+ : value
+ ;
+ },
+ values: function(raw) {
+ var
+ value = module.get.value()
+ ;
+ if(value === '') {
+ return '';
+ }
+ return ( !module.has.selectInput() && module.is.multiple() )
+ ? (typeof value == 'string') // delimited string
+ ? (raw ? value : module.escape.htmlEntities(value)).split(settings.delimiter)
+ : ''
+ : value
+ ;
+ },
+ remoteValues: function() {
+ var
+ values = module.get.values(),
+ remoteValues = false
+ ;
+ if(values) {
+ if(typeof values == 'string') {
+ values = [values];
+ }
+ $.each(values, function(index, value) {
+ var
+ name = module.read.remoteData(value)
+ ;
+ module.verbose('Restoring value from session data', name, value);
+ if(name) {
+ if(!remoteValues) {
+ remoteValues = {};
+ }
+ remoteValues[value] = name;
+ }
+ });
+ }
+ return remoteValues;
+ },
+ choiceText: function($choice, preserveHTML) {
+ preserveHTML = (preserveHTML !== undefined)
+ ? preserveHTML
+ : settings.preserveHTML
+ ;
+ if($choice) {
+ if($choice.find(selector.menu).length > 0) {
+ module.verbose('Retrieving text of element with sub-menu');
+ $choice = $choice.clone();
+ $choice.find(selector.menu).remove();
+ $choice.find(selector.menuIcon).remove();
+ }
+ return ($choice.data(metadata.text) !== undefined)
+ ? $choice.data(metadata.text)
+ : (preserveHTML)
+ ? $choice.html() && $choice.html().trim()
+ : $choice.text() && $choice.text().trim()
+ ;
+ }
+ },
+ choiceValue: function($choice, choiceText) {
+ choiceText = choiceText || module.get.choiceText($choice);
+ if(!$choice) {
+ return false;
+ }
+ return ($choice.data(metadata.value) !== undefined)
+ ? String( $choice.data(metadata.value) )
+ : (typeof choiceText === 'string')
+ ? String(
+ settings.ignoreSearchCase
+ ? choiceText.toLowerCase()
+ : choiceText
+ ).trim()
+ : String(choiceText)
+ ;
+ },
+ inputEvent: function() {
+ var
+ input = $search[0]
+ ;
+ if(input) {
+ return (input.oninput !== undefined)
+ ? 'input'
+ : (input.onpropertychange !== undefined)
+ ? 'propertychange'
+ : 'keyup'
+ ;
+ }
+ return false;
+ },
+ selectValues: function() {
+ var
+ select = {},
+ oldGroup = [],
+ values = []
+ ;
+ $module
+ .find('option')
+ .each(function() {
+ var
+ $option = $(this),
+ name = $option.html(),
+ disabled = $option.attr('disabled'),
+ value = ( $option.attr('value') !== undefined )
+ ? $option.attr('value')
+ : name,
+ text = ( $option.data(metadata.text) !== undefined )
+ ? $option.data(metadata.text)
+ : name,
+ group = $option.parent('optgroup')
+ ;
+ if(settings.placeholder === 'auto' && value === '') {
+ select.placeholder = name;
+ }
+ else {
+ if(group.length !== oldGroup.length || group[0] !== oldGroup[0]) {
+ values.push({
+ type: 'header',
+ divider: settings.headerDivider,
+ name: group.attr('label') || ''
+ });
+ oldGroup = group;
+ }
+ values.push({
+ name : name,
+ value : value,
+ text : text,
+ disabled : disabled
+ });
+ }
+ })
+ ;
+ if(settings.placeholder && settings.placeholder !== 'auto') {
+ module.debug('Setting placeholder value to', settings.placeholder);
+ select.placeholder = settings.placeholder;
+ }
+ if(settings.sortSelect) {
+ if(settings.sortSelect === true) {
+ values.sort(function(a, b) {
+ return a.name.localeCompare(b.name);
+ });
+ } else if(settings.sortSelect === 'natural') {
+ values.sort(function(a, b) {
+ return (a.name.toLowerCase().localeCompare(b.name.toLowerCase()));
+ });
+ } else if($.isFunction(settings.sortSelect)) {
+ values.sort(settings.sortSelect);
+ }
+ select[fields.values] = values;
+ module.debug('Retrieved and sorted values from select', select);
+ }
+ else {
+ select[fields.values] = values;
+ module.debug('Retrieved values from select', select);
+ }
+ return select;
+ },
+ activeItem: function() {
+ return $item.filter('.' + className.active);
+ },
+ selectedItem: function() {
+ var
+ $selectedItem = $item.not(selector.unselectable).filter('.' + className.selected)
+ ;
+ return ($selectedItem.length > 0)
+ ? $selectedItem
+ : $item.eq(0)
+ ;
+ },
+ itemWithAdditions: function(value) {
+ var
+ $items = module.get.item(value),
+ $userItems = module.create.userChoice(value),
+ hasUserItems = ($userItems && $userItems.length > 0)
+ ;
+ if(hasUserItems) {
+ $items = ($items.length > 0)
+ ? $items.add($userItems)
+ : $userItems
+ ;
+ }
+ return $items;
+ },
+ item: function(value, strict) {
+ var
+ $selectedItem = false,
+ shouldSearch,
+ isMultiple
+ ;
+ value = (value !== undefined)
+ ? value
+ : ( module.get.values() !== undefined)
+ ? module.get.values()
+ : module.get.text()
+ ;
+ isMultiple = (module.is.multiple() && Array.isArray(value));
+ shouldSearch = (isMultiple)
+ ? (value.length > 0)
+ : (value !== undefined && value !== null)
+ ;
+ strict = (value === '' || value === false || value === true)
+ ? true
+ : strict || false
+ ;
+ if(shouldSearch) {
+ $item
+ .each(function() {
+ var
+ $choice = $(this),
+ optionText = module.get.choiceText($choice),
+ optionValue = module.get.choiceValue($choice, optionText)
+ ;
+ // safe early exit
+ if(optionValue === null || optionValue === undefined) {
+ return;
+ }
+ if(isMultiple) {
+ if($.inArray(module.escape.htmlEntities(String(optionValue)), value.map(function(v){return String(v);})) !== -1) {
+ $selectedItem = ($selectedItem)
+ ? $selectedItem.add($choice)
+ : $choice
+ ;
+ }
+ }
+ else if(strict) {
+ module.verbose('Ambiguous dropdown value using strict type check', $choice, value);
+ if( optionValue === value) {
+ $selectedItem = $choice;
+ return true;
+ }
+ }
+ else {
+ if(settings.ignoreCase) {
+ optionValue = optionValue.toLowerCase();
+ value = value.toLowerCase();
+ }
+ if(module.escape.htmlEntities(String(optionValue)) === module.escape.htmlEntities(String(value))) {
+ module.verbose('Found select item by value', optionValue, value);
+ $selectedItem = $choice;
+ return true;
+ }
+ }
+ })
+ ;
+ }
+ return $selectedItem;
+ },
+ displayType: function() {
+ return $module.hasClass('column') ? 'flex' : settings.displayType;
+ }
+ },
+
+ check: {
+ maxSelections: function(selectionCount) {
+ if(settings.maxSelections) {
+ selectionCount = (selectionCount !== undefined)
+ ? selectionCount
+ : module.get.selectionCount()
+ ;
+ if(selectionCount >= settings.maxSelections) {
+ module.debug('Maximum selection count reached');
+ if(settings.useLabels) {
+ $item.addClass(className.filtered);
+ module.add.message(message.maxSelections);
+ }
+ return true;
+ }
+ else {
+ module.verbose('No longer at maximum selection count');
+ module.remove.message();
+ module.remove.filteredItem();
+ if(module.is.searchSelection()) {
+ module.filterItems();
+ }
+ return false;
+ }
+ }
+ return true;
+ },
+ disabled: function(){
+ $search.attr('tabindex',module.is.disabled() ? -1 : 0);
+ }
+ },
+
+ restore: {
+ defaults: function(preventChangeTrigger) {
+ module.clear(preventChangeTrigger);
+ module.restore.defaultText();
+ module.restore.defaultValue();
+ },
+ defaultText: function() {
+ var
+ defaultText = module.get.defaultText(),
+ placeholderText = module.get.placeholderText
+ ;
+ if(defaultText === placeholderText) {
+ module.debug('Restoring default placeholder text', defaultText);
+ module.set.placeholderText(defaultText);
+ }
+ else {
+ module.debug('Restoring default text', defaultText);
+ module.set.text(defaultText);
+ }
+ },
+ placeholderText: function() {
+ module.set.placeholderText();
+ },
+ defaultValue: function() {
+ var
+ defaultValue = module.get.defaultValue()
+ ;
+ if(defaultValue !== undefined) {
+ module.debug('Restoring default value', defaultValue);
+ if(defaultValue !== '') {
+ module.set.value(defaultValue);
+ module.set.selected();
+ }
+ else {
+ module.remove.activeItem();
+ module.remove.selectedItem();
+ }
+ }
+ },
+ labels: function() {
+ if(settings.allowAdditions) {
+ if(!settings.useLabels) {
+ module.error(error.labels);
+ settings.useLabels = true;
+ }
+ module.debug('Restoring selected values');
+ module.create.userLabels();
+ }
+ module.check.maxSelections();
+ },
+ selected: function() {
+ module.restore.values();
+ if(module.is.multiple()) {
+ module.debug('Restoring previously selected values and labels');
+ module.restore.labels();
+ }
+ else {
+ module.debug('Restoring previously selected values');
+ }
+ },
+ values: function() {
+ // prevents callbacks from occurring on initial load
+ module.set.initialLoad();
+ if(settings.apiSettings && settings.saveRemoteData && module.get.remoteValues()) {
+ module.restore.remoteValues();
+ }
+ else {
+ module.set.selected();
+ }
+ var value = module.get.value();
+ if(value && value !== '' && !(Array.isArray(value) && value.length === 0)) {
+ $input.removeClass(className.noselection);
+ } else {
+ $input.addClass(className.noselection);
+ }
+ module.remove.initialLoad();
+ },
+ remoteValues: function() {
+ var
+ values = module.get.remoteValues()
+ ;
+ module.debug('Recreating selected from session data', values);
+ if(values) {
+ if( module.is.single() ) {
+ $.each(values, function(value, name) {
+ module.set.text(name);
+ });
+ }
+ else {
+ $.each(values, function(value, name) {
+ module.add.label(value, name);
+ });
+ }
+ }
+ }
+ },
+
+ read: {
+ remoteData: function(value) {
+ var
+ name
+ ;
+ if(window.Storage === undefined) {
+ module.error(error.noStorage);
+ return;
+ }
+ name = sessionStorage.getItem(value);
+ return (name !== undefined)
+ ? name
+ : false
+ ;
+ }
+ },
+
+ save: {
+ defaults: function() {
+ module.save.defaultText();
+ module.save.placeholderText();
+ module.save.defaultValue();
+ },
+ defaultValue: function() {
+ var
+ value = module.get.value()
+ ;
+ module.verbose('Saving default value as', value);
+ $module.data(metadata.defaultValue, value);
+ },
+ defaultText: function() {
+ var
+ text = module.get.text()
+ ;
+ module.verbose('Saving default text as', text);
+ $module.data(metadata.defaultText, text);
+ },
+ placeholderText: function() {
+ var
+ text
+ ;
+ if(settings.placeholder !== false && $text.hasClass(className.placeholder)) {
+ text = module.get.text();
+ module.verbose('Saving placeholder text as', text);
+ $module.data(metadata.placeholderText, text);
+ }
+ },
+ remoteData: function(name, value) {
+ if(window.Storage === undefined) {
+ module.error(error.noStorage);
+ return;
+ }
+ module.verbose('Saving remote data to session storage', value, name);
+ sessionStorage.setItem(value, name);
+ }
+ },
+
+ clear: function(preventChangeTrigger) {
+ if(module.is.multiple() && settings.useLabels) {
+ module.remove.labels($module.find(selector.label), preventChangeTrigger);
+ }
+ else {
+ module.remove.activeItem();
+ module.remove.selectedItem();
+ module.remove.filteredItem();
+ }
+ module.set.placeholderText();
+ module.clearValue(preventChangeTrigger);
+ },
+
+ clearValue: function(preventChangeTrigger) {
+ module.set.value('', null, null, preventChangeTrigger);
+ },
+
+ scrollPage: function(direction, $selectedItem) {
+ var
+ $currentItem = $selectedItem || module.get.selectedItem(),
+ $menu = $currentItem.closest(selector.menu),
+ menuHeight = $menu.outerHeight(),
+ currentScroll = $menu.scrollTop(),
+ itemHeight = $item.eq(0).outerHeight(),
+ itemsPerPage = Math.floor(menuHeight / itemHeight),
+ maxScroll = $menu.prop('scrollHeight'),
+ newScroll = (direction == 'up')
+ ? currentScroll - (itemHeight * itemsPerPage)
+ : currentScroll + (itemHeight * itemsPerPage),
+ $selectableItem = $item.not(selector.unselectable),
+ isWithinRange,
+ $nextSelectedItem,
+ elementIndex
+ ;
+ elementIndex = (direction == 'up')
+ ? $selectableItem.index($currentItem) - itemsPerPage
+ : $selectableItem.index($currentItem) + itemsPerPage
+ ;
+ isWithinRange = (direction == 'up')
+ ? (elementIndex >= 0)
+ : (elementIndex < $selectableItem.length)
+ ;
+ $nextSelectedItem = (isWithinRange)
+ ? $selectableItem.eq(elementIndex)
+ : (direction == 'up')
+ ? $selectableItem.first()
+ : $selectableItem.last()
+ ;
+ if($nextSelectedItem.length > 0) {
+ module.debug('Scrolling page', direction, $nextSelectedItem);
+ $currentItem
+ .removeClass(className.selected)
+ ;
+ $nextSelectedItem
+ .addClass(className.selected)
+ ;
+ if(settings.selectOnKeydown && module.is.single()) {
+ module.set.selectedItem($nextSelectedItem);
+ }
+ $menu
+ .scrollTop(newScroll)
+ ;
+ }
+ },
+
+ set: {
+ filtered: function() {
+ var
+ isMultiple = module.is.multiple(),
+ isSearch = module.is.searchSelection(),
+ isSearchMultiple = (isMultiple && isSearch),
+ searchValue = (isSearch)
+ ? module.get.query()
+ : '',
+ hasSearchValue = (typeof searchValue === 'string' && searchValue.length > 0),
+ searchWidth = module.get.searchWidth(),
+ valueIsSet = searchValue !== ''
+ ;
+ if(isMultiple && hasSearchValue) {
+ module.verbose('Adjusting input width', searchWidth, settings.glyphWidth);
+ $search.css('width', searchWidth);
+ }
+ if(hasSearchValue || (isSearchMultiple && valueIsSet)) {
+ module.verbose('Hiding placeholder text');
+ $text.addClass(className.filtered);
+ }
+ else if(!isMultiple || (isSearchMultiple && !valueIsSet)) {
+ module.verbose('Showing placeholder text');
+ $text.removeClass(className.filtered);
+ }
+ },
+ empty: function() {
+ $module.addClass(className.empty);
+ },
+ loading: function() {
+ $module.addClass(className.loading);
+ },
+ placeholderText: function(text) {
+ text = text || module.get.placeholderText();
+ module.debug('Setting placeholder text', text);
+ module.set.text(text);
+ $text.addClass(className.placeholder);
+ },
+ tabbable: function() {
+ if( module.is.searchSelection() ) {
+ module.debug('Added tabindex to searchable dropdown');
+ $search
+ .val('')
+ ;
+ module.check.disabled();
+ $menu
+ .attr('tabindex', -1)
+ ;
+ }
+ else {
+ module.debug('Added tabindex to dropdown');
+ if( $module.attr('tabindex') === undefined) {
+ $module
+ .attr('tabindex', 0)
+ ;
+ $menu
+ .attr('tabindex', -1)
+ ;
+ }
+ }
+ },
+ initialLoad: function() {
+ module.verbose('Setting initial load');
+ initialLoad = true;
+ },
+ activeItem: function($item) {
+ if( settings.allowAdditions && $item.filter(selector.addition).length > 0 ) {
+ $item.addClass(className.filtered);
+ }
+ else {
+ $item.addClass(className.active);
+ }
+ },
+ partialSearch: function(text) {
+ var
+ length = module.get.query().length
+ ;
+ $search.val( text.substr(0, length));
+ },
+ scrollPosition: function($item, forceScroll) {
+ var
+ edgeTolerance = 5,
+ $menu,
+ hasActive,
+ offset,
+ itemHeight,
+ itemOffset,
+ menuOffset,
+ menuScroll,
+ menuHeight,
+ abovePage,
+ belowPage
+ ;
+
+ $item = $item || module.get.selectedItem();
+ $menu = $item.closest(selector.menu);
+ hasActive = ($item && $item.length > 0);
+ forceScroll = (forceScroll !== undefined)
+ ? forceScroll
+ : false
+ ;
+ if(module.get.activeItem().length === 0){
+ forceScroll = false;
+ }
+ if($item && $menu.length > 0 && hasActive) {
+ itemOffset = $item.position().top;
+
+ $menu.addClass(className.loading);
+ menuScroll = $menu.scrollTop();
+ menuOffset = $menu.offset().top;
+ itemOffset = $item.offset().top;
+ offset = menuScroll - menuOffset + itemOffset;
+ if(!forceScroll) {
+ menuHeight = $menu.height();
+ belowPage = menuScroll + menuHeight < (offset + edgeTolerance);
+ abovePage = ((offset - edgeTolerance) < menuScroll);
+ }
+ module.debug('Scrolling to active item', offset);
+ if(forceScroll || abovePage || belowPage) {
+ $menu.scrollTop(offset);
+ }
+ $menu.removeClass(className.loading);
+ }
+ },
+ text: function(text) {
+ if(settings.action === 'combo') {
+ module.debug('Changing combo button text', text, $combo);
+ if(settings.preserveHTML) {
+ $combo.html(text);
+ }
+ else {
+ $combo.text(text);
+ }
+ }
+ else if(settings.action === 'activate') {
+ if(text !== module.get.placeholderText()) {
+ $text.removeClass(className.placeholder);
+ }
+ module.debug('Changing text', text, $text);
+ $text
+ .removeClass(className.filtered)
+ ;
+ if(settings.preserveHTML) {
+ $text.html(text);
+ }
+ else {
+ $text.text(text);
+ }
+ }
+ },
+ selectedItem: function($item) {
+ var
+ value = module.get.choiceValue($item),
+ searchText = module.get.choiceText($item, false),
+ text = module.get.choiceText($item, true)
+ ;
+ module.debug('Setting user selection to item', $item);
+ module.remove.activeItem();
+ module.set.partialSearch(searchText);
+ module.set.activeItem($item);
+ module.set.selected(value, $item);
+ module.set.text(text);
+ },
+ selectedLetter: function(letter) {
+ var
+ $selectedItem = $item.filter('.' + className.selected),
+ alreadySelectedLetter = $selectedItem.length > 0 && module.has.firstLetter($selectedItem, letter),
+ $nextValue = false,
+ $nextItem
+ ;
+ // check next of same letter
+ if(alreadySelectedLetter) {
+ $nextItem = $selectedItem.nextAll($item).eq(0);
+ if( module.has.firstLetter($nextItem, letter) ) {
+ $nextValue = $nextItem;
+ }
+ }
+ // check all values
+ if(!$nextValue) {
+ $item
+ .each(function(){
+ if(module.has.firstLetter($(this), letter)) {
+ $nextValue = $(this);
+ return false;
+ }
+ })
+ ;
+ }
+ // set next value
+ if($nextValue) {
+ module.verbose('Scrolling to next value with letter', letter);
+ module.set.scrollPosition($nextValue);
+ $selectedItem.removeClass(className.selected);
+ $nextValue.addClass(className.selected);
+ if(settings.selectOnKeydown && module.is.single()) {
+ module.set.selectedItem($nextValue);
+ }
+ }
+ },
+ direction: function($menu) {
+ if(settings.direction == 'auto') {
+ // reset position, remove upward if it's base menu
+ if (!$menu) {
+ module.remove.upward();
+ } else if (module.is.upward($menu)) {
+ //we need make sure when make assertion openDownward for $menu, $menu does not have upward class
+ module.remove.upward($menu);
+ }
+
+ if(module.can.openDownward($menu)) {
+ module.remove.upward($menu);
+ }
+ else {
+ module.set.upward($menu);
+ }
+ if(!module.is.leftward($menu) && !module.can.openRightward($menu)) {
+ module.set.leftward($menu);
+ }
+ }
+ else if(settings.direction == 'upward') {
+ module.set.upward($menu);
+ }
+ },
+ upward: function($currentMenu) {
+ var $element = $currentMenu || $module;
+ $element.addClass(className.upward);
+ },
+ leftward: function($currentMenu) {
+ var $element = $currentMenu || $menu;
+ $element.addClass(className.leftward);
+ },
+ value: function(value, text, $selected, preventChangeTrigger) {
+ if(value !== undefined && value !== '' && !(Array.isArray(value) && value.length === 0)) {
+ $input.removeClass(className.noselection);
+ } else {
+ $input.addClass(className.noselection);
+ }
+ var
+ escapedValue = module.escape.value(value),
+ hasInput = ($input.length > 0),
+ currentValue = module.get.values(),
+ stringValue = (value !== undefined)
+ ? String(value)
+ : value,
+ newValue
+ ;
+ if(hasInput) {
+ if(!settings.allowReselection && stringValue == currentValue) {
+ module.verbose('Skipping value update already same value', value, currentValue);
+ if(!module.is.initialLoad()) {
+ return;
+ }
+ }
+
+ if( module.is.single() && module.has.selectInput() && module.can.extendSelect() ) {
+ module.debug('Adding user option', value);
+ module.add.optionValue(value);
+ }
+ module.debug('Updating input value', escapedValue, currentValue);
+ internalChange = true;
+ $input
+ .val(escapedValue)
+ ;
+ if(settings.fireOnInit === false && module.is.initialLoad()) {
+ module.debug('Input native change event ignored on initial load');
+ }
+ else if(preventChangeTrigger !== true) {
+ module.trigger.change();
+ }
+ internalChange = false;
+ }
+ else {
+ module.verbose('Storing value in metadata', escapedValue, $input);
+ if(escapedValue !== currentValue) {
+ $module.data(metadata.value, stringValue);
+ }
+ }
+ if(settings.fireOnInit === false && module.is.initialLoad()) {
+ module.verbose('No callback on initial load', settings.onChange);
+ }
+ else if(preventChangeTrigger !== true) {
+ settings.onChange.call(element, value, text, $selected);
+ }
+ },
+ active: function() {
+ $module
+ .addClass(className.active)
+ ;
+ },
+ multiple: function() {
+ $module.addClass(className.multiple);
+ },
+ visible: function() {
+ $module.addClass(className.visible);
+ },
+ exactly: function(value, $selectedItem) {
+ module.debug('Setting selected to exact values');
+ module.clear();
+ module.set.selected(value, $selectedItem);
+ },
+ selected: function(value, $selectedItem, preventChangeTrigger, keepSearchTerm) {
+ var
+ isMultiple = module.is.multiple()
+ ;
+ $selectedItem = (settings.allowAdditions)
+ ? $selectedItem || module.get.itemWithAdditions(value)
+ : $selectedItem || module.get.item(value)
+ ;
+ if(!$selectedItem) {
+ return;
+ }
+ module.debug('Setting selected menu item to', $selectedItem);
+ if(module.is.multiple()) {
+ module.remove.searchWidth();
+ }
+ if(module.is.single()) {
+ module.remove.activeItem();
+ module.remove.selectedItem();
+ }
+ else if(settings.useLabels) {
+ module.remove.selectedItem();
+ }
+ // select each item
+ $selectedItem
+ .each(function() {
+ var
+ $selected = $(this),
+ selectedText = module.get.choiceText($selected),
+ selectedValue = module.get.choiceValue($selected, selectedText),
+
+ isFiltered = $selected.hasClass(className.filtered),
+ isActive = $selected.hasClass(className.active),
+ isUserValue = $selected.hasClass(className.addition),
+ shouldAnimate = (isMultiple && $selectedItem.length == 1)
+ ;
+ if(isMultiple) {
+ if(!isActive || isUserValue) {
+ if(settings.apiSettings && settings.saveRemoteData) {
+ module.save.remoteData(selectedText, selectedValue);
+ }
+ if(settings.useLabels) {
+ module.add.label(selectedValue, selectedText, shouldAnimate);
+ module.add.value(selectedValue, selectedText, $selected);
+ module.set.activeItem($selected);
+ module.filterActive();
+ module.select.nextAvailable($selectedItem);
+ }
+ else {
+ module.add.value(selectedValue, selectedText, $selected);
+ module.set.text(module.add.variables(message.count));
+ module.set.activeItem($selected);
+ }
+ }
+ else if(!isFiltered && (settings.useLabels || selectActionActive)) {
+ module.debug('Selected active value, removing label');
+ module.remove.selected(selectedValue);
+ }
+ }
+ else {
+ if(settings.apiSettings && settings.saveRemoteData) {
+ module.save.remoteData(selectedText, selectedValue);
+ }
+ if (!keepSearchTerm) {
+ module.set.text(selectedText);
+ }
+ module.set.value(selectedValue, selectedText, $selected, preventChangeTrigger);
+ $selected
+ .addClass(className.active)
+ .addClass(className.selected)
+ ;
+ }
+ })
+ ;
+ if (!keepSearchTerm) {
+ module.remove.searchTerm();
+ }
+ }
+ },
+
+ add: {
+ label: function(value, text, shouldAnimate) {
+ var
+ $next = module.is.searchSelection()
+ ? $search
+ : $text,
+ escapedValue = module.escape.value(value),
+ $label
+ ;
+ if(settings.ignoreCase) {
+ escapedValue = escapedValue.toLowerCase();
+ }
+ $label = $(' ')
+ .addClass(className.label)
+ .attr('data-' + metadata.value, escapedValue)
+ .html(templates.label(escapedValue, text, settings.preserveHTML, settings.className))
+ ;
+ $label = settings.onLabelCreate.call($label, escapedValue, text);
+
+ if(module.has.label(value)) {
+ module.debug('User selection already exists, skipping', escapedValue);
+ return;
+ }
+ if(settings.label.variation) {
+ $label.addClass(settings.label.variation);
+ }
+ if(shouldAnimate === true) {
+ module.debug('Animating in label', $label);
+ $label
+ .addClass(className.hidden)
+ .insertBefore($next)
+ .transition({
+ animation : settings.label.transition,
+ debug : settings.debug,
+ verbose : settings.verbose,
+ duration : settings.label.duration
+ })
+ ;
+ }
+ else {
+ module.debug('Adding selection label', $label);
+ $label
+ .insertBefore($next)
+ ;
+ }
+ },
+ message: function(message) {
+ var
+ $message = $menu.children(selector.message),
+ html = settings.templates.message(module.add.variables(message))
+ ;
+ if($message.length > 0) {
+ $message
+ .html(html)
+ ;
+ }
+ else {
+ $message = $('
')
+ .html(html)
+ .addClass(className.message)
+ .appendTo($menu)
+ ;
+ }
+ },
+ optionValue: function(value) {
+ var
+ escapedValue = module.escape.value(value),
+ $option = $input.find('option[value="' + module.escape.string(escapedValue) + '"]'),
+ hasOption = ($option.length > 0)
+ ;
+ if(hasOption) {
+ return;
+ }
+ // temporarily disconnect observer
+ module.disconnect.selectObserver();
+ if( module.is.single() ) {
+ module.verbose('Removing previous user addition');
+ $input.find('option.' + className.addition).remove();
+ }
+ $(' ')
+ .prop('value', escapedValue)
+ .addClass(className.addition)
+ .html(value)
+ .appendTo($input)
+ ;
+ module.verbose('Adding user addition as an ', value);
+ module.observe.select();
+ },
+ userSuggestion: function(value) {
+ var
+ $addition = $menu.children(selector.addition),
+ $existingItem = module.get.item(value),
+ alreadyHasValue = $existingItem && $existingItem.not(selector.addition).length,
+ hasUserSuggestion = $addition.length > 0,
+ html
+ ;
+ if(settings.useLabels && module.has.maxSelections()) {
+ return;
+ }
+ if(value === '' || alreadyHasValue) {
+ $addition.remove();
+ return;
+ }
+ if(hasUserSuggestion) {
+ $addition
+ .data(metadata.value, value)
+ .data(metadata.text, value)
+ .attr('data-' + metadata.value, value)
+ .attr('data-' + metadata.text, value)
+ .removeClass(className.filtered)
+ ;
+ if(!settings.hideAdditions) {
+ html = settings.templates.addition( module.add.variables(message.addResult, value) );
+ $addition
+ .html(html)
+ ;
+ }
+ module.verbose('Replacing user suggestion with new value', $addition);
+ }
+ else {
+ $addition = module.create.userChoice(value);
+ $addition
+ .prependTo($menu)
+ ;
+ module.verbose('Adding item choice to menu corresponding with user choice addition', $addition);
+ }
+ if(!settings.hideAdditions || module.is.allFiltered()) {
+ $addition
+ .addClass(className.selected)
+ .siblings()
+ .removeClass(className.selected)
+ ;
+ }
+ module.refreshItems();
+ },
+ variables: function(message, term) {
+ var
+ hasCount = (message.search('{count}') !== -1),
+ hasMaxCount = (message.search('{maxCount}') !== -1),
+ hasTerm = (message.search('{term}') !== -1),
+ count,
+ query
+ ;
+ module.verbose('Adding templated variables to message', message);
+ if(hasCount) {
+ count = module.get.selectionCount();
+ message = message.replace('{count}', count);
+ }
+ if(hasMaxCount) {
+ count = module.get.selectionCount();
+ message = message.replace('{maxCount}', settings.maxSelections);
+ }
+ if(hasTerm) {
+ query = term || module.get.query();
+ message = message.replace('{term}', query);
+ }
+ return message;
+ },
+ value: function(addedValue, addedText, $selectedItem) {
+ var
+ currentValue = module.get.values(true),
+ newValue
+ ;
+ if(module.has.value(addedValue)) {
+ module.debug('Value already selected');
+ return;
+ }
+ if(addedValue === '') {
+ module.debug('Cannot select blank values from multiselect');
+ return;
+ }
+ // extend current array
+ if(Array.isArray(currentValue)) {
+ newValue = currentValue.concat([addedValue]);
+ newValue = module.get.uniqueArray(newValue);
+ }
+ else {
+ newValue = [addedValue];
+ }
+ // add values
+ if( module.has.selectInput() ) {
+ if(module.can.extendSelect()) {
+ module.debug('Adding value to select', addedValue, newValue, $input);
+ module.add.optionValue(addedValue);
+ }
+ }
+ else {
+ newValue = newValue.join(settings.delimiter);
+ module.debug('Setting hidden input to delimited value', newValue, $input);
+ }
+
+ if(settings.fireOnInit === false && module.is.initialLoad()) {
+ module.verbose('Skipping onadd callback on initial load', settings.onAdd);
+ }
+ else {
+ settings.onAdd.call(element, addedValue, addedText, $selectedItem);
+ }
+ module.set.value(newValue, addedText, $selectedItem);
+ module.check.maxSelections();
+ },
+ },
+
+ remove: {
+ active: function() {
+ $module.removeClass(className.active);
+ },
+ activeLabel: function() {
+ $module.find(selector.label).removeClass(className.active);
+ },
+ empty: function() {
+ $module.removeClass(className.empty);
+ },
+ loading: function() {
+ $module.removeClass(className.loading);
+ },
+ initialLoad: function() {
+ initialLoad = false;
+ },
+ upward: function($currentMenu) {
+ var $element = $currentMenu || $module;
+ $element.removeClass(className.upward);
+ },
+ leftward: function($currentMenu) {
+ var $element = $currentMenu || $menu;
+ $element.removeClass(className.leftward);
+ },
+ visible: function() {
+ $module.removeClass(className.visible);
+ },
+ activeItem: function() {
+ $item.removeClass(className.active);
+ },
+ filteredItem: function() {
+ if(settings.useLabels && module.has.maxSelections() ) {
+ return;
+ }
+ if(settings.useLabels && module.is.multiple()) {
+ $item.not('.' + className.active).removeClass(className.filtered);
+ }
+ else {
+ $item.removeClass(className.filtered);
+ }
+ if(settings.hideDividers) {
+ $divider.removeClass(className.hidden);
+ }
+ module.remove.empty();
+ },
+ optionValue: function(value) {
+ var
+ escapedValue = module.escape.value(value),
+ $option = $input.find('option[value="' + module.escape.string(escapedValue) + '"]'),
+ hasOption = ($option.length > 0)
+ ;
+ if(!hasOption || !$option.hasClass(className.addition)) {
+ return;
+ }
+ // temporarily disconnect observer
+ if(selectObserver) {
+ selectObserver.disconnect();
+ module.verbose('Temporarily disconnecting mutation observer');
+ }
+ $option.remove();
+ module.verbose('Removing user addition as an ', escapedValue);
+ if(selectObserver) {
+ selectObserver.observe($input[0], {
+ childList : true,
+ subtree : true
+ });
+ }
+ },
+ message: function() {
+ $menu.children(selector.message).remove();
+ },
+ searchWidth: function() {
+ $search.css('width', '');
+ },
+ searchTerm: function() {
+ module.verbose('Cleared search term');
+ $search.val('');
+ module.set.filtered();
+ },
+ userAddition: function() {
+ $item.filter(selector.addition).remove();
+ },
+ selected: function(value, $selectedItem, preventChangeTrigger) {
+ $selectedItem = (settings.allowAdditions)
+ ? $selectedItem || module.get.itemWithAdditions(value)
+ : $selectedItem || module.get.item(value)
+ ;
+
+ if(!$selectedItem) {
+ return false;
+ }
+
+ $selectedItem
+ .each(function() {
+ var
+ $selected = $(this),
+ selectedText = module.get.choiceText($selected),
+ selectedValue = module.get.choiceValue($selected, selectedText)
+ ;
+ if(module.is.multiple()) {
+ if(settings.useLabels) {
+ module.remove.value(selectedValue, selectedText, $selected, preventChangeTrigger);
+ module.remove.label(selectedValue);
+ }
+ else {
+ module.remove.value(selectedValue, selectedText, $selected, preventChangeTrigger);
+ if(module.get.selectionCount() === 0) {
+ module.set.placeholderText();
+ }
+ else {
+ module.set.text(module.add.variables(message.count));
+ }
+ }
+ }
+ else {
+ module.remove.value(selectedValue, selectedText, $selected, preventChangeTrigger);
+ }
+ $selected
+ .removeClass(className.filtered)
+ .removeClass(className.active)
+ ;
+ if(settings.useLabels) {
+ $selected.removeClass(className.selected);
+ }
+ })
+ ;
+ },
+ selectedItem: function() {
+ $item.removeClass(className.selected);
+ },
+ value: function(removedValue, removedText, $removedItem, preventChangeTrigger) {
+ var
+ values = module.get.values(),
+ newValue
+ ;
+ removedValue = module.escape.htmlEntities(removedValue);
+ if( module.has.selectInput() ) {
+ module.verbose('Input is removing selected option', removedValue);
+ newValue = module.remove.arrayValue(removedValue, values);
+ module.remove.optionValue(removedValue);
+ }
+ else {
+ module.verbose('Removing from delimited values', removedValue);
+ newValue = module.remove.arrayValue(removedValue, values);
+ newValue = newValue.join(settings.delimiter);
+ }
+ if(settings.fireOnInit === false && module.is.initialLoad()) {
+ module.verbose('No callback on initial load', settings.onRemove);
+ }
+ else {
+ settings.onRemove.call(element, removedValue, removedText, $removedItem);
+ }
+ module.set.value(newValue, removedText, $removedItem, preventChangeTrigger);
+ module.check.maxSelections();
+ },
+ arrayValue: function(removedValue, values) {
+ if( !Array.isArray(values) ) {
+ values = [values];
+ }
+ values = $.grep(values, function(value){
+ return (removedValue != value);
+ });
+ module.verbose('Removed value from delimited string', removedValue, values);
+ return values;
+ },
+ label: function(value, shouldAnimate) {
+ var
+ escapedValue = module.escape.value(value),
+ $labels = $module.find(selector.label),
+ $removedLabel = $labels.filter('[data-' + metadata.value + '="' + module.escape.string(settings.ignoreCase ? escapedValue.toLowerCase() : escapedValue) +'"]')
+ ;
+ module.verbose('Removing label', $removedLabel);
+ $removedLabel.remove();
+ },
+ activeLabels: function($activeLabels) {
+ $activeLabels = $activeLabels || $module.find(selector.label).filter('.' + className.active);
+ module.verbose('Removing active label selections', $activeLabels);
+ module.remove.labels($activeLabels);
+ },
+ labels: function($labels, preventChangeTrigger) {
+ $labels = $labels || $module.find(selector.label);
+ module.verbose('Removing labels', $labels);
+ $labels
+ .each(function(){
+ var
+ $label = $(this),
+ value = $label.data(metadata.value),
+ stringValue = (value !== undefined)
+ ? String(value)
+ : value,
+ isUserValue = module.is.userValue(stringValue)
+ ;
+ if(settings.onLabelRemove.call($label, value) === false) {
+ module.debug('Label remove callback cancelled removal');
+ return;
+ }
+ module.remove.message();
+ if(isUserValue) {
+ module.remove.value(stringValue, stringValue, module.get.item(stringValue), preventChangeTrigger);
+ module.remove.label(stringValue);
+ }
+ else {
+ // selected will also remove label
+ module.remove.selected(stringValue, false, preventChangeTrigger);
+ }
+ })
+ ;
+ },
+ tabbable: function() {
+ if( module.is.searchSelection() ) {
+ module.debug('Searchable dropdown initialized');
+ $search
+ .removeAttr('tabindex')
+ ;
+ $menu
+ .removeAttr('tabindex')
+ ;
+ }
+ else {
+ module.debug('Simple selection dropdown initialized');
+ $module
+ .removeAttr('tabindex')
+ ;
+ $menu
+ .removeAttr('tabindex')
+ ;
+ }
+ },
+ diacritics: function(text) {
+ return settings.ignoreDiacritics ? text.normalize('NFD').replace(/[\u0300-\u036f]/g, '') : text;
+ }
+ },
+
+ has: {
+ menuSearch: function() {
+ return (module.has.search() && $search.closest($menu).length > 0);
+ },
+ clearItem: function() {
+ return ($clear.length > 0);
+ },
+ search: function() {
+ return ($search.length > 0);
+ },
+ sizer: function() {
+ return ($sizer.length > 0);
+ },
+ selectInput: function() {
+ return ( $input.is('select') );
+ },
+ minCharacters: function(searchTerm) {
+ if(settings.minCharacters && !iconClicked) {
+ searchTerm = (searchTerm !== undefined)
+ ? String(searchTerm)
+ : String(module.get.query())
+ ;
+ return (searchTerm.length >= settings.minCharacters);
+ }
+ iconClicked=false;
+ return true;
+ },
+ firstLetter: function($item, letter) {
+ var
+ text,
+ firstLetter
+ ;
+ if(!$item || $item.length === 0 || typeof letter !== 'string') {
+ return false;
+ }
+ text = module.get.choiceText($item, false);
+ letter = letter.toLowerCase();
+ firstLetter = String(text).charAt(0).toLowerCase();
+ return (letter == firstLetter);
+ },
+ input: function() {
+ return ($input.length > 0);
+ },
+ items: function() {
+ return ($item.length > 0);
+ },
+ menu: function() {
+ return ($menu.length > 0);
+ },
+ subMenu: function($currentMenu) {
+ return ($currentMenu || $menu).find(selector.menu).length > 0;
+ },
+ message: function() {
+ return ($menu.children(selector.message).length !== 0);
+ },
+ label: function(value) {
+ var
+ escapedValue = module.escape.value(value),
+ $labels = $module.find(selector.label)
+ ;
+ if(settings.ignoreCase) {
+ escapedValue = escapedValue.toLowerCase();
+ }
+ return ($labels.filter('[data-' + metadata.value + '="' + module.escape.string(escapedValue) +'"]').length > 0);
+ },
+ maxSelections: function() {
+ return (settings.maxSelections && module.get.selectionCount() >= settings.maxSelections);
+ },
+ allResultsFiltered: function() {
+ var
+ $normalResults = $item.not(selector.addition)
+ ;
+ return ($normalResults.filter(selector.unselectable).length === $normalResults.length);
+ },
+ userSuggestion: function() {
+ return ($menu.children(selector.addition).length > 0);
+ },
+ query: function() {
+ return (module.get.query() !== '');
+ },
+ value: function(value) {
+ return (settings.ignoreCase)
+ ? module.has.valueIgnoringCase(value)
+ : module.has.valueMatchingCase(value)
+ ;
+ },
+ valueMatchingCase: function(value) {
+ var
+ values = module.get.values(true),
+ hasValue = Array.isArray(values)
+ ? values && ($.inArray(value, values) !== -1)
+ : (values == value)
+ ;
+ return (hasValue)
+ ? true
+ : false
+ ;
+ },
+ valueIgnoringCase: function(value) {
+ var
+ values = module.get.values(true),
+ hasValue = false
+ ;
+ if(!Array.isArray(values)) {
+ values = [values];
+ }
+ $.each(values, function(index, existingValue) {
+ if(String(value).toLowerCase() == String(existingValue).toLowerCase()) {
+ hasValue = true;
+ return false;
+ }
+ });
+ return hasValue;
+ }
+ },
+
+ is: {
+ active: function() {
+ return $module.hasClass(className.active);
+ },
+ animatingInward: function() {
+ return $menu.transition('is inward');
+ },
+ animatingOutward: function() {
+ return $menu.transition('is outward');
+ },
+ bubbledLabelClick: function(event) {
+ return $(event.target).is('select, input') && $module.closest('label').length > 0;
+ },
+ bubbledIconClick: function(event) {
+ return $(event.target).closest($icon).length > 0;
+ },
+ chrome: function() {
+ return !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime);
+ },
+ alreadySetup: function() {
+ return ($module.is('select') && $module.parent(selector.dropdown).data(moduleNamespace) !== undefined && $module.prev().length === 0);
+ },
+ animating: function($subMenu) {
+ return ($subMenu)
+ ? $subMenu.transition && $subMenu.transition('is animating')
+ : $menu.transition && $menu.transition('is animating')
+ ;
+ },
+ leftward: function($subMenu) {
+ var $selectedMenu = $subMenu || $menu;
+ return $selectedMenu.hasClass(className.leftward);
+ },
+ clearable: function() {
+ return ($module.hasClass(className.clearable) || settings.clearable);
+ },
+ disabled: function() {
+ return $module.hasClass(className.disabled);
+ },
+ focused: function() {
+ return (document.activeElement === $module[0]);
+ },
+ focusedOnSearch: function() {
+ return (document.activeElement === $search[0]);
+ },
+ allFiltered: function() {
+ return( (module.is.multiple() || module.has.search()) && !(settings.hideAdditions == false && module.has.userSuggestion()) && !module.has.message() && module.has.allResultsFiltered() );
+ },
+ hidden: function($subMenu) {
+ return !module.is.visible($subMenu);
+ },
+ initialLoad: function() {
+ return initialLoad;
+ },
+ inObject: function(needle, object) {
+ var
+ found = false
+ ;
+ $.each(object, function(index, property) {
+ if(property == needle) {
+ found = true;
+ return true;
+ }
+ });
+ return found;
+ },
+ multiple: function() {
+ return $module.hasClass(className.multiple);
+ },
+ remote: function() {
+ return settings.apiSettings && module.can.useAPI();
+ },
+ noApiCache: function() {
+ return settings.apiSettings && !settings.apiSettings.cache
+ },
+ single: function() {
+ return !module.is.multiple();
+ },
+ selectMutation: function(mutations) {
+ var
+ selectChanged = false
+ ;
+ $.each(mutations, function(index, mutation) {
+ if($(mutation.target).is('select') || $(mutation.addedNodes).is('select')) {
+ selectChanged = true;
+ return false;
+ }
+ });
+ return selectChanged;
+ },
+ search: function() {
+ return $module.hasClass(className.search);
+ },
+ searchSelection: function() {
+ return ( module.has.search() && $search.parent(selector.dropdown).length === 1 );
+ },
+ selection: function() {
+ return $module.hasClass(className.selection);
+ },
+ userValue: function(value) {
+ return ($.inArray(value, module.get.userValues()) !== -1);
+ },
+ upward: function($menu) {
+ var $element = $menu || $module;
+ return $element.hasClass(className.upward);
+ },
+ visible: function($subMenu) {
+ return ($subMenu)
+ ? $subMenu.hasClass(className.visible)
+ : $menu.hasClass(className.visible)
+ ;
+ },
+ verticallyScrollableContext: function() {
+ var
+ overflowY = ($context.get(0) !== window)
+ ? $context.css('overflow-y')
+ : false
+ ;
+ return (overflowY == 'auto' || overflowY == 'scroll');
+ },
+ horizontallyScrollableContext: function() {
+ var
+ overflowX = ($context.get(0) !== window)
+ ? $context.css('overflow-X')
+ : false
+ ;
+ return (overflowX == 'auto' || overflowX == 'scroll');
+ }
+ },
+
+ can: {
+ activate: function($item) {
+ if(settings.useLabels) {
+ return true;
+ }
+ if(!module.has.maxSelections()) {
+ return true;
+ }
+ if(module.has.maxSelections() && $item.hasClass(className.active)) {
+ return true;
+ }
+ return false;
+ },
+ openDownward: function($subMenu) {
+ var
+ $currentMenu = $subMenu || $menu,
+ canOpenDownward = true,
+ onScreen = {},
+ calculations
+ ;
+ $currentMenu
+ .addClass(className.loading)
+ ;
+ calculations = {
+ context: {
+ offset : ($context.get(0) === window)
+ ? { top: 0, left: 0}
+ : $context.offset(),
+ scrollTop : $context.scrollTop(),
+ height : $context.outerHeight()
+ },
+ menu : {
+ offset: $currentMenu.offset(),
+ height: $currentMenu.outerHeight()
+ }
+ };
+ if(module.is.verticallyScrollableContext()) {
+ calculations.menu.offset.top += calculations.context.scrollTop;
+ }
+ if(module.has.subMenu($currentMenu)) {
+ calculations.menu.height += $currentMenu.find(selector.menu).first().outerHeight();
+ }
+ onScreen = {
+ above : (calculations.context.scrollTop) <= calculations.menu.offset.top - calculations.context.offset.top - calculations.menu.height,
+ below : (calculations.context.scrollTop + calculations.context.height) >= calculations.menu.offset.top - calculations.context.offset.top + calculations.menu.height
+ };
+ if(onScreen.below) {
+ module.verbose('Dropdown can fit in context downward', onScreen);
+ canOpenDownward = true;
+ }
+ else if(!onScreen.below && !onScreen.above) {
+ module.verbose('Dropdown cannot fit in either direction, favoring downward', onScreen);
+ canOpenDownward = true;
+ }
+ else {
+ module.verbose('Dropdown cannot fit below, opening upward', onScreen);
+ canOpenDownward = false;
+ }
+ $currentMenu.removeClass(className.loading);
+ return canOpenDownward;
+ },
+ openRightward: function($subMenu) {
+ var
+ $currentMenu = $subMenu || $menu,
+ canOpenRightward = true,
+ isOffscreenRight = false,
+ calculations
+ ;
+ $currentMenu
+ .addClass(className.loading)
+ ;
+ calculations = {
+ context: {
+ offset : ($context.get(0) === window)
+ ? { top: 0, left: 0}
+ : $context.offset(),
+ scrollLeft : $context.scrollLeft(),
+ width : $context.outerWidth()
+ },
+ menu: {
+ offset : $currentMenu.offset(),
+ width : $currentMenu.outerWidth()
+ }
+ };
+ if(module.is.horizontallyScrollableContext()) {
+ calculations.menu.offset.left += calculations.context.scrollLeft;
+ }
+ isOffscreenRight = (calculations.menu.offset.left - calculations.context.offset.left + calculations.menu.width >= calculations.context.scrollLeft + calculations.context.width);
+ if(isOffscreenRight) {
+ module.verbose('Dropdown cannot fit in context rightward', isOffscreenRight);
+ canOpenRightward = false;
+ }
+ $currentMenu.removeClass(className.loading);
+ return canOpenRightward;
+ },
+ click: function() {
+ return (hasTouch || settings.on == 'click');
+ },
+ extendSelect: function() {
+ return settings.allowAdditions || settings.apiSettings;
+ },
+ show: function() {
+ return !module.is.disabled() && (module.has.items() || module.has.message());
+ },
+ useAPI: function() {
+ return $.fn.api !== undefined;
+ }
+ },
+
+ animate: {
+ show: function(callback, $subMenu) {
+ var
+ $currentMenu = $subMenu || $menu,
+ start = ($subMenu)
+ ? function() {}
+ : function() {
+ module.hideSubMenus();
+ module.hideOthers();
+ module.set.active();
+ },
+ transition
+ ;
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ module.verbose('Doing menu show animation', $currentMenu);
+ module.set.direction($subMenu);
+ transition = settings.transition.showMethod || module.get.transition($subMenu);
+ if( module.is.selection() ) {
+ module.set.scrollPosition(module.get.selectedItem(), true);
+ }
+ if( module.is.hidden($currentMenu) || module.is.animating($currentMenu) ) {
+ if(transition === 'none') {
+ start();
+ $currentMenu.transition({
+ displayType: module.get.displayType()
+ }).transition('show');
+ callback.call(element);
+ }
+ else if($.fn.transition !== undefined && $module.transition('is supported')) {
+ $currentMenu
+ .transition({
+ animation : transition + ' in',
+ debug : settings.debug,
+ verbose : settings.verbose,
+ duration : settings.transition.showDuration || settings.duration,
+ queue : true,
+ onStart : start,
+ displayType: module.get.displayType(),
+ onComplete : function() {
+ callback.call(element);
+ }
+ })
+ ;
+ }
+ else {
+ module.error(error.noTransition, transition);
+ }
+ }
+ },
+ hide: function(callback, $subMenu) {
+ var
+ $currentMenu = $subMenu || $menu,
+ start = ($subMenu)
+ ? function() {}
+ : function() {
+ if( module.can.click() ) {
+ module.unbind.intent();
+ }
+ module.remove.active();
+ },
+ transition = settings.transition.hideMethod || module.get.transition($subMenu)
+ ;
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ if( module.is.visible($currentMenu) || module.is.animating($currentMenu) ) {
+ module.verbose('Doing menu hide animation', $currentMenu);
+
+ if(transition === 'none') {
+ start();
+ $currentMenu.transition({
+ displayType: module.get.displayType()
+ }).transition('hide');
+ callback.call(element);
+ }
+ else if($.fn.transition !== undefined && $module.transition('is supported')) {
+ $currentMenu
+ .transition({
+ animation : transition + ' out',
+ duration : settings.transition.hideDuration || settings.duration,
+ debug : settings.debug,
+ verbose : settings.verbose,
+ queue : false,
+ onStart : start,
+ displayType: module.get.displayType(),
+ onComplete : function() {
+ callback.call(element);
+ }
+ })
+ ;
+ }
+ else {
+ module.error(error.transition);
+ }
+ }
+ }
+ },
+
+ hideAndClear: function() {
+ module.remove.searchTerm();
+ if( module.has.maxSelections() ) {
+ return;
+ }
+ if(module.has.search()) {
+ module.hide(function() {
+ module.remove.filteredItem();
+ });
+ }
+ else {
+ module.hide();
+ }
+ },
+
+ delay: {
+ show: function() {
+ module.verbose('Delaying show event to ensure user intent');
+ clearTimeout(module.timer);
+ module.timer = setTimeout(module.show, settings.delay.show);
+ },
+ hide: function() {
+ module.verbose('Delaying hide event to ensure user intent');
+ clearTimeout(module.timer);
+ module.timer = setTimeout(module.hide, settings.delay.hide);
+ }
+ },
+
+ escape: {
+ value: function(value) {
+ var
+ multipleValues = Array.isArray(value),
+ stringValue = (typeof value === 'string'),
+ isUnparsable = (!stringValue && !multipleValues),
+ hasQuotes = (stringValue && value.search(regExp.quote) !== -1),
+ values = []
+ ;
+ if(isUnparsable || !hasQuotes) {
+ return value;
+ }
+ module.debug('Encoding quote values for use in select', value);
+ if(multipleValues) {
+ $.each(value, function(index, value){
+ values.push(value.replace(regExp.quote, '"'));
+ });
+ return values;
+ }
+ return value.replace(regExp.quote, '"');
+ },
+ string: function(text) {
+ text = String(text);
+ return text.replace(regExp.escape, '\\$&');
+ },
+ htmlEntities: function(string) {
+ var
+ badChars = /[<>"'`]/g,
+ shouldEscape = /[&<>"'`]/,
+ escape = {
+ "<": "<",
+ ">": ">",
+ '"': """,
+ "'": "'",
+ "`": "`"
+ },
+ escapedChar = function(chr) {
+ return escape[chr];
+ }
+ ;
+ if(shouldEscape.test(string)) {
+ string = string.replace(/&(?![a-z0-9#]{1,6};)/, "&");
+ return string.replace(badChars, escapedChar);
+ }
+ return string;
+ }
+ },
+
+ setting: function(name, value) {
+ module.debug('Changing setting', name, value);
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ if($.isPlainObject(settings[name])) {
+ $.extend(true, settings[name], value);
+ }
+ else {
+ settings[name] = value;
+ }
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ module.error(error.method, query);
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ }
+ })
+ ;
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : $allModules
+ ;
+};
+
+$.fn.dropdown.settings = {
+
+ silent : false,
+ debug : false,
+ verbose : false,
+ performance : true,
+
+ on : 'click', // what event should show menu action on item selection
+ action : 'activate', // action on item selection (nothing, activate, select, combo, hide, function(){})
+
+ values : false, // specify values to use for dropdown
+
+ clearable : false, // whether the value of the dropdown can be cleared
+
+ apiSettings : false,
+ selectOnKeydown : true, // Whether selection should occur automatically when keyboard shortcuts used
+ minCharacters : 0, // Minimum characters required to trigger API call
+
+ filterRemoteData : false, // Whether API results should be filtered after being returned for query term
+ saveRemoteData : true, // Whether remote name/value pairs should be stored in sessionStorage to allow remote data to be restored on page refresh
+
+ throttle : 200, // How long to wait after last user input to search remotely
+
+ context : window, // Context to use when determining if on screen
+ direction : 'auto', // Whether dropdown should always open in one direction
+ keepOnScreen : true, // Whether dropdown should check whether it is on screen before showing
+
+ match : 'both', // what to match against with search selection (both, text, or label)
+ fullTextSearch : false, // search anywhere in value (set to 'exact' to require exact matches)
+ ignoreDiacritics : false, // match results also if they contain diacritics of the same base character (for example searching for "a" will also match "á" or "â" or "à ", etc...)
+ hideDividers : false, // Whether to hide any divider elements (specified in selector.divider) that are sibling to any items when searched (set to true will hide all dividers, set to 'empty' will hide them when they are not followed by a visible item)
+
+ placeholder : 'auto', // whether to convert blank values to placeholder text
+ preserveHTML : true, // preserve html when selecting value
+ sortSelect : false, // sort selection on init
+
+ forceSelection : true, // force a choice on blur with search selection
+
+ allowAdditions : false, // whether multiple select should allow user added values
+ ignoreCase : false, // whether to consider case sensitivity when creating labels
+ ignoreSearchCase : true, // whether to consider case sensitivity when filtering items
+ hideAdditions : true, // whether or not to hide special message prompting a user they can enter a value
+
+ maxSelections : false, // When set to a number limits the number of selections to this count
+ useLabels : true, // whether multiple select should filter currently active selections from choices
+ delimiter : ',', // when multiselect uses normal the values will be delimited with this character
+
+ showOnFocus : true, // show menu on focus
+ allowReselection : false, // whether current value should trigger callbacks when reselected
+ allowTab : true, // add tabindex to element
+ allowCategorySelection : false, // allow elements with sub-menus to be selected
+
+ fireOnInit : false, // Whether callbacks should fire when initializing dropdown values
+
+ transition : 'auto', // auto transition will slide down or up based on direction
+ duration : 200, // duration of transition
+ displayType : false, // displayType of transition
+
+ glyphWidth : 1.037, // widest glyph width in em (W is 1.037 em) used to calculate multiselect input width
+
+ headerDivider : true, // whether option headers should have an additional divider line underneath when converted from
+
+ // label settings on multi-select
+ label: {
+ transition : 'scale',
+ duration : 200,
+ variation : false
+ },
+
+ // delay before event
+ delay : {
+ hide : 300,
+ show : 200,
+ search : 20,
+ touch : 50
+ },
+
+ /* Callbacks */
+ onChange : function(value, text, $selected){},
+ onAdd : function(value, text, $selected){},
+ onRemove : function(value, text, $selected){},
+ onSearch : function(searchTerm){},
+
+ onLabelSelect : function($selectedLabels){},
+ onLabelCreate : function(value, text) { return $(this); },
+ onLabelRemove : function(value) { return true; },
+ onNoResults : function(searchTerm) { return true; },
+ onShow : function(){},
+ onHide : function(){},
+
+ /* Component */
+ name : 'Dropdown',
+ namespace : 'dropdown',
+
+ message: {
+ addResult : 'Add {term} ',
+ count : '{count} selected',
+ maxSelections : 'Max {maxCount} selections',
+ noResults : 'No results found.',
+ serverError : 'There was an error contacting the server'
+ },
+
+ error : {
+ action : 'You called a dropdown action that was not defined',
+ alreadySetup : 'Once a select has been initialized behaviors must be called on the created ui dropdown',
+ labels : 'Allowing user additions currently requires the use of labels.',
+ missingMultiple : ' requires multiple property to be set to correctly preserve multiple values',
+ method : 'The method you called is not defined.',
+ noAPI : 'The API module is required to load resources remotely',
+ noStorage : 'Saving remote data requires session storage',
+ noTransition : 'This module requires ui transitions ',
+ noNormalize : '"ignoreDiacritics" setting will be ignored. Browser does not support String().normalize(). You may consider including as a polyfill.'
+ },
+
+ regExp : {
+ escape : /[-[\]{}()*+?.,\\^$|#\s:=@]/g,
+ quote : /"/g
+ },
+
+ metadata : {
+ defaultText : 'defaultText',
+ defaultValue : 'defaultValue',
+ placeholderText : 'placeholder',
+ text : 'text',
+ value : 'value'
+ },
+
+ // property names for remote query
+ fields: {
+ remoteValues : 'results', // grouping for api results
+ values : 'values', // grouping for all dropdown values
+ disabled : 'disabled', // whether value should be disabled
+ name : 'name', // displayed dropdown text
+ description : 'description', // displayed dropdown description
+ descriptionVertical : 'descriptionVertical', // whether description should be vertical
+ value : 'value', // actual dropdown value
+ text : 'text', // displayed text when selected
+ type : 'type', // type of dropdown element
+ image : 'image', // optional image path
+ imageClass : 'imageClass', // optional individual class for image
+ icon : 'icon', // optional icon name
+ iconClass : 'iconClass', // optional individual class for icon (for example to use flag instead)
+ class : 'class', // optional individual class for item/header
+ divider : 'divider' // optional divider append for group headers
+ },
+
+ keys : {
+ backspace : 8,
+ delimiter : 188, // comma
+ deleteKey : 46,
+ enter : 13,
+ escape : 27,
+ pageUp : 33,
+ pageDown : 34,
+ leftArrow : 37,
+ upArrow : 38,
+ rightArrow : 39,
+ downArrow : 40
+ },
+
+ selector : {
+ addition : '.addition',
+ divider : '.divider, .header',
+ dropdown : '.ui.dropdown',
+ hidden : '.hidden',
+ icon : '> .dropdown.icon',
+ input : '> input[type="hidden"], > select',
+ item : '.item',
+ label : '> .label',
+ remove : '> .label > .delete.icon',
+ siblingLabel : '.label',
+ menu : '.menu',
+ message : '.message',
+ menuIcon : '.dropdown.icon',
+ search : 'input.search, .menu > .search > input, .menu input.search',
+ sizer : '> span.sizer',
+ text : '> .text:not(.icon)',
+ unselectable : '.disabled, .filtered',
+ clearIcon : '> .remove.icon'
+ },
+
+ className : {
+ active : 'active',
+ addition : 'addition',
+ animating : 'animating',
+ description : 'description',
+ descriptionVertical : 'vertical',
+ disabled : 'disabled',
+ empty : 'empty',
+ dropdown : 'ui dropdown',
+ filtered : 'filtered',
+ hidden : 'hidden transition',
+ icon : 'icon',
+ image : 'image',
+ item : 'item',
+ label : 'ui label',
+ loading : 'loading',
+ menu : 'menu',
+ message : 'message',
+ multiple : 'multiple',
+ placeholder : 'default',
+ sizer : 'sizer',
+ search : 'search',
+ selected : 'selected',
+ selection : 'selection',
+ text : 'text',
+ upward : 'upward',
+ leftward : 'left',
+ visible : 'visible',
+ clearable : 'clearable',
+ noselection : 'noselection',
+ delete : 'delete',
+ header : 'header',
+ divider : 'divider',
+ groupIcon : '',
+ unfilterable : 'unfilterable'
+ }
+
+};
+
+/* Templates */
+$.fn.dropdown.settings.templates = {
+ deQuote: function(string, encode) {
+ return String(string).replace(/"/g,encode ? """ : "");
+ },
+ escape: function(string, preserveHTML) {
+ if (preserveHTML){
+ return string;
+ }
+ var
+ badChars = /[<>"'`]/g,
+ shouldEscape = /[&<>"'`]/,
+ escape = {
+ "<": "<",
+ ">": ">",
+ '"': """,
+ "'": "'",
+ "`": "`"
+ },
+ escapedChar = function(chr) {
+ return escape[chr];
+ }
+ ;
+ if(shouldEscape.test(string)) {
+ string = string.replace(/&(?![a-z0-9#]{1,6};)/, "&");
+ return string.replace(badChars, escapedChar);
+ }
+ return string;
+ },
+ // generates dropdown from select values
+ dropdown: function(select, fields, preserveHTML, className) {
+ var
+ placeholder = select.placeholder || false,
+ html = '',
+ escape = $.fn.dropdown.settings.templates.escape
+ ;
+ html += ' ';
+ if(placeholder) {
+ html += '' + escape(placeholder,preserveHTML) + '
';
+ }
+ else {
+ html += '
';
+ }
+ html += '';
+ return html;
+ },
+
+ // generates just menu from select
+ menu: function(response, fields, preserveHTML, className) {
+ var
+ values = response[fields.values] || [],
+ html = '',
+ escape = $.fn.dropdown.settings.templates.escape,
+ deQuote = $.fn.dropdown.settings.templates.deQuote
+ ;
+ $.each(values, function(index, option) {
+ var
+ itemType = (option[fields.type])
+ ? option[fields.type]
+ : 'item',
+ isMenu = itemType.indexOf('menu') !== -1
+ ;
+
+ if( itemType === 'item' || isMenu) {
+ var
+ maybeText = (option[fields.text])
+ ? ' data-text="' + deQuote(option[fields.text],true) + '"'
+ : '',
+ maybeDisabled = (option[fields.disabled])
+ ? className.disabled+' '
+ : '',
+ maybeDescriptionVertical = (option[fields.descriptionVertical])
+ ? className.descriptionVertical+' '
+ : '',
+ hasDescription = (escape(option[fields.description] || '', preserveHTML) != '')
+ ;
+ html += '';
+ if (isMenu) {
+ html += '
';
+ }
+ if(option[fields.image]) {
+ html += '
';
+ }
+ if(option[fields.icon]) {
+ html += '
';
+ }
+ if(hasDescription){
+ html += '
'+ escape(option[fields.description] || '', preserveHTML) + ' ';
+ html += (!isMenu) ? '
' : '';
+ }
+ if (isMenu) {
+ html += '';
+ }
+ html += escape(option[fields.name] || '', preserveHTML);
+ if (isMenu) {
+ html += ' ';
+ html += '';
+ html += $.fn.dropdown.settings.templates.menu(option, fields, preserveHTML, className);
+ html += '
';
+ } else if(hasDescription){
+ html += ' ';
+ }
+ html += '
';
+ } else if (itemType === 'header') {
+ var groupName = escape(option[fields.name] || '', preserveHTML),
+ groupIcon = option[fields.icon] ? deQuote(option[fields.icon]) : className.groupIcon
+ ;
+ if(groupName !== '' || groupIcon !== '') {
+ html += '';
+ }
+ if(option[fields.divider]){
+ html += '
';
+ }
+ }
+ });
+ return html;
+ },
+
+ // generates label for multiselect
+ label: function(value, text, preserveHTML, className) {
+ var
+ escape = $.fn.dropdown.settings.templates.escape;
+ return escape(text,preserveHTML) + ' ';
+ },
+
+
+ // generates messages like "No results"
+ message: function(message) {
+ return message;
+ },
+
+ // generates user addition to selection menu
+ addition: function(choice) {
+ return choice;
+ }
+
+};
+
+})( jQuery, window, document );
+
+/*!
+ * # Fomantic-UI 2.8.8 - Embed
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+"use strict";
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.embed = function(parameters) {
+
+ var
+ $allModules = $(this),
+
+ moduleSelector = $allModules.selector || '',
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+
+ returnedValue
+ ;
+
+ $allModules
+ .each(function() {
+ var
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.fn.embed.settings, parameters)
+ : $.extend({}, $.fn.embed.settings),
+
+ selector = settings.selector,
+ className = settings.className,
+ sources = settings.sources,
+ error = settings.error,
+ metadata = settings.metadata,
+ namespace = settings.namespace,
+ templates = settings.templates,
+
+ eventNamespace = '.' + namespace,
+ moduleNamespace = 'module-' + namespace,
+
+ $module = $(this),
+ $placeholder = $module.find(selector.placeholder),
+ $icon = $module.find(selector.icon),
+ $embed = $module.find(selector.embed),
+
+ element = this,
+ instance = $module.data(moduleNamespace),
+ module
+ ;
+
+ module = {
+
+ initialize: function() {
+ module.debug('Initializing embed');
+ module.determine.autoplay();
+ module.create();
+ module.bind.events();
+ module.instantiate();
+ },
+
+ instantiate: function() {
+ module.verbose('Storing instance of module', module);
+ instance = module;
+ $module
+ .data(moduleNamespace, module)
+ ;
+ },
+
+ destroy: function() {
+ module.verbose('Destroying previous instance of embed');
+ module.reset();
+ $module
+ .removeData(moduleNamespace)
+ .off(eventNamespace)
+ ;
+ },
+
+ refresh: function() {
+ module.verbose('Refreshing selector cache');
+ $placeholder = $module.find(selector.placeholder);
+ $icon = $module.find(selector.icon);
+ $embed = $module.find(selector.embed);
+ },
+
+ bind: {
+ events: function() {
+ if( module.has.placeholder() ) {
+ module.debug('Adding placeholder events');
+ $module
+ .on('click' + eventNamespace, selector.placeholder, module.createAndShow)
+ .on('click' + eventNamespace, selector.icon, module.createAndShow)
+ ;
+ }
+ }
+ },
+
+ create: function() {
+ var
+ placeholder = module.get.placeholder()
+ ;
+ if(placeholder) {
+ module.createPlaceholder();
+ }
+ else {
+ module.createAndShow();
+ }
+ },
+
+ createPlaceholder: function(placeholder) {
+ var
+ icon = module.get.icon(),
+ url = module.get.url(),
+ embed = module.generate.embed(url)
+ ;
+ placeholder = placeholder || module.get.placeholder();
+ $module.html( templates.placeholder(placeholder, icon) );
+ module.debug('Creating placeholder for embed', placeholder, icon);
+ },
+
+ createEmbed: function(url) {
+ module.refresh();
+ url = url || module.get.url();
+ $embed = $('
')
+ .addClass(className.embed)
+ .html( module.generate.embed(url) )
+ .appendTo($module)
+ ;
+ settings.onCreate.call(element, url);
+ module.debug('Creating embed object', $embed);
+ },
+
+ changeEmbed: function(url) {
+ $embed
+ .html( module.generate.embed(url) )
+ ;
+ },
+
+ createAndShow: function() {
+ module.createEmbed();
+ module.show();
+ },
+
+ // sets new embed
+ change: function(source, id, url) {
+ module.debug('Changing video to ', source, id, url);
+ $module
+ .data(metadata.source, source)
+ .data(metadata.id, id)
+ ;
+ if(url) {
+ $module.data(metadata.url, url);
+ }
+ else {
+ $module.removeData(metadata.url);
+ }
+ if(module.has.embed()) {
+ module.changeEmbed();
+ }
+ else {
+ module.create();
+ }
+ },
+
+ // clears embed
+ reset: function() {
+ module.debug('Clearing embed and showing placeholder');
+ module.remove.data();
+ module.remove.active();
+ module.remove.embed();
+ module.showPlaceholder();
+ settings.onReset.call(element);
+ },
+
+ // shows current embed
+ show: function() {
+ module.debug('Showing embed');
+ module.set.active();
+ settings.onDisplay.call(element);
+ },
+
+ hide: function() {
+ module.debug('Hiding embed');
+ module.showPlaceholder();
+ },
+
+ showPlaceholder: function() {
+ module.debug('Showing placeholder image');
+ module.remove.active();
+ settings.onPlaceholderDisplay.call(element);
+ },
+
+ get: {
+ id: function() {
+ return settings.id || $module.data(metadata.id);
+ },
+ placeholder: function() {
+ return settings.placeholder || $module.data(metadata.placeholder);
+ },
+ icon: function() {
+ return (settings.icon)
+ ? settings.icon
+ : ($module.data(metadata.icon) !== undefined)
+ ? $module.data(metadata.icon)
+ : module.determine.icon()
+ ;
+ },
+ source: function(url) {
+ return (settings.source)
+ ? settings.source
+ : ($module.data(metadata.source) !== undefined)
+ ? $module.data(metadata.source)
+ : module.determine.source()
+ ;
+ },
+ type: function() {
+ var source = module.get.source();
+ return (sources[source] !== undefined)
+ ? sources[source].type
+ : false
+ ;
+ },
+ url: function() {
+ return (settings.url)
+ ? settings.url
+ : ($module.data(metadata.url) !== undefined)
+ ? $module.data(metadata.url)
+ : module.determine.url()
+ ;
+ }
+ },
+
+ determine: {
+ autoplay: function() {
+ if(module.should.autoplay()) {
+ settings.autoplay = true;
+ }
+ },
+ source: function(url) {
+ var
+ matchedSource = false
+ ;
+ url = url || module.get.url();
+ if(url) {
+ $.each(sources, function(name, source) {
+ if(url.search(source.domain) !== -1) {
+ matchedSource = name;
+ return false;
+ }
+ });
+ }
+ return matchedSource;
+ },
+ icon: function() {
+ var
+ source = module.get.source()
+ ;
+ return (sources[source] !== undefined)
+ ? sources[source].icon
+ : false
+ ;
+ },
+ url: function() {
+ var
+ id = settings.id || $module.data(metadata.id),
+ source = settings.source || $module.data(metadata.source),
+ url
+ ;
+ url = (sources[source] !== undefined)
+ ? sources[source].url.replace('{id}', id)
+ : false
+ ;
+ if(url) {
+ $module.data(metadata.url, url);
+ }
+ return url;
+ }
+ },
+
+
+ set: {
+ active: function() {
+ $module.addClass(className.active);
+ }
+ },
+
+ remove: {
+ data: function() {
+ $module
+ .removeData(metadata.id)
+ .removeData(metadata.icon)
+ .removeData(metadata.placeholder)
+ .removeData(metadata.source)
+ .removeData(metadata.url)
+ ;
+ },
+ active: function() {
+ $module.removeClass(className.active);
+ },
+ embed: function() {
+ $embed.empty();
+ }
+ },
+
+ encode: {
+ parameters: function(parameters) {
+ var
+ urlString = [],
+ index
+ ;
+ for (index in parameters) {
+ urlString.push( encodeURIComponent(index) + '=' + encodeURIComponent( parameters[index] ) );
+ }
+ return urlString.join('&');
+ }
+ },
+
+ generate: {
+ embed: function(url) {
+ module.debug('Generating embed html');
+ var
+ source = module.get.source(),
+ html,
+ parameters
+ ;
+ url = module.get.url(url);
+ if(url) {
+ parameters = module.generate.parameters(source);
+ html = templates.iframe(url, parameters);
+ }
+ else {
+ module.error(error.noURL, $module);
+ }
+ return html;
+ },
+ parameters: function(source, extraParameters) {
+ var
+ parameters = (sources[source] && sources[source].parameters !== undefined)
+ ? sources[source].parameters(settings)
+ : {}
+ ;
+ extraParameters = extraParameters || settings.parameters;
+ if(extraParameters) {
+ parameters = $.extend({}, parameters, extraParameters);
+ }
+ parameters = settings.onEmbed(parameters);
+ return module.encode.parameters(parameters);
+ }
+ },
+
+ has: {
+ embed: function() {
+ return ($embed.length > 0);
+ },
+ placeholder: function() {
+ return settings.placeholder || $module.data(metadata.placeholder);
+ }
+ },
+
+ should: {
+ autoplay: function() {
+ return (settings.autoplay === 'auto')
+ ? (settings.placeholder || $module.data(metadata.placeholder) !== undefined)
+ : settings.autoplay
+ ;
+ }
+ },
+
+ is: {
+ video: function() {
+ return module.get.type() == 'video';
+ }
+ },
+
+ setting: function(name, value) {
+ module.debug('Changing setting', name, value);
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ if($.isPlainObject(settings[name])) {
+ $.extend(true, settings[name], value);
+ }
+ else {
+ settings[name] = value;
+ }
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if($allModules.length > 1) {
+ title += ' ' + '(' + $allModules.length + ')';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ module.error(error.method, query);
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ }
+ })
+ ;
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.fn.embed.settings = {
+
+ name : 'Embed',
+ namespace : 'embed',
+
+ silent : false,
+ debug : false,
+ verbose : false,
+ performance : true,
+
+ icon : false,
+ source : false,
+ url : false,
+ id : false,
+
+ // standard video settings
+ autoplay : 'auto',
+ color : '#444444',
+ hd : true,
+ brandedUI : false,
+
+ // additional parameters to include with the embed
+ parameters: false,
+
+ onDisplay : function() {},
+ onPlaceholderDisplay : function() {},
+ onReset : function() {},
+ onCreate : function(url) {},
+ onEmbed : function(parameters) {
+ return parameters;
+ },
+
+ metadata : {
+ id : 'id',
+ icon : 'icon',
+ placeholder : 'placeholder',
+ source : 'source',
+ url : 'url'
+ },
+
+ error : {
+ noURL : 'No URL specified',
+ method : 'The method you called is not defined'
+ },
+
+ className : {
+ active : 'active',
+ embed : 'embed'
+ },
+
+ selector : {
+ embed : '.embed',
+ placeholder : '.placeholder',
+ icon : '.icon'
+ },
+
+ sources: {
+ youtube: {
+ name : 'youtube',
+ type : 'video',
+ icon : 'video play',
+ domain : 'youtube.com',
+ url : '//www.youtube.com/embed/{id}',
+ parameters: function(settings) {
+ return {
+ autohide : !settings.brandedUI,
+ autoplay : settings.autoplay,
+ color : settings.color || undefined,
+ hq : settings.hd,
+ jsapi : settings.api,
+ modestbranding : !settings.brandedUI
+ };
+ }
+ },
+ vimeo: {
+ name : 'vimeo',
+ type : 'video',
+ icon : 'video play',
+ domain : 'vimeo.com',
+ url : '//player.vimeo.com/video/{id}',
+ parameters: function(settings) {
+ return {
+ api : settings.api,
+ autoplay : settings.autoplay,
+ byline : settings.brandedUI,
+ color : settings.color || undefined,
+ portrait : settings.brandedUI,
+ title : settings.brandedUI
+ };
+ }
+ }
+ },
+
+ templates: {
+ iframe : function(url, parameters) {
+ var src = url;
+ if (parameters) {
+ src += '?' + parameters;
+ }
+ return ''
+ + ''
+ ;
+ },
+ placeholder : function(image, icon) {
+ var
+ html = ''
+ ;
+ if(icon) {
+ html += ' ';
+ }
+ if(image) {
+ html += ' ';
+ }
+ return html;
+ }
+ },
+
+ // NOT YET IMPLEMENTED
+ api : false,
+ onPause : function() {},
+ onPlay : function() {},
+ onStop : function() {}
+
+};
+
+
+
+})( jQuery, window, document );
+
+/*!
+ * # Fomantic-UI 2.8.8 - Modal
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+'use strict';
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.modal = function(parameters) {
+ var
+ $allModules = $(this),
+ $window = $(window),
+ $document = $(document),
+ $body = $('body'),
+
+ moduleSelector = $allModules.selector || '',
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+
+ requestAnimationFrame = window.requestAnimationFrame
+ || window.mozRequestAnimationFrame
+ || window.webkitRequestAnimationFrame
+ || window.msRequestAnimationFrame
+ || function(callback) { setTimeout(callback, 0); },
+
+ returnedValue
+ ;
+
+ $allModules
+ .each(function() {
+ var
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.fn.modal.settings, parameters)
+ : $.extend({}, $.fn.modal.settings),
+
+ selector = settings.selector,
+ className = settings.className,
+ namespace = settings.namespace,
+ fields = settings.fields,
+ error = settings.error,
+
+ eventNamespace = '.' + namespace,
+ moduleNamespace = 'module-' + namespace,
+
+ $module = $(this),
+ $context = $(settings.context),
+ $close = $module.find(selector.close),
+
+ $allModals,
+ $otherModals,
+ $focusedElement,
+ $dimmable,
+ $dimmer,
+
+ element = this,
+ instance = $module.hasClass('modal') ? $module.data(moduleNamespace) : undefined,
+
+ ignoreRepeatedEvents = false,
+
+ initialMouseDownInModal,
+ initialMouseDownInScrollbar,
+ initialBodyMargin = '',
+ tempBodyMargin = '',
+
+ elementEventNamespace,
+ id,
+ observer,
+ module
+ ;
+ module = {
+
+ initialize: function() {
+ if(!$module.hasClass('modal')) {
+ module.create.modal();
+ if(!$.isFunction(settings.onHidden)) {
+ settings.onHidden = function () {
+ module.destroy();
+ $module.remove();
+ };
+ }
+ }
+ $module.addClass(settings.class);
+ if (settings.title !== '') {
+ $module.find(selector.title).html(module.helpers.escape(settings.title, settings.preserveHTML)).addClass(settings.classTitle);
+ }
+ if (settings.content !== '') {
+ $module.find(selector.content).html(module.helpers.escape(settings.content, settings.preserveHTML)).addClass(settings.classContent);
+ }
+ if(module.has.configActions()){
+ var $actions = $module.find(selector.actions).addClass(settings.classActions);
+ if ($actions.length === 0) {
+ $actions = $('
', {class: className.actions + ' ' + (settings.classActions || '')}).appendTo($module);
+ } else {
+ $actions.empty();
+ }
+ settings.actions.forEach(function (el) {
+ var icon = el[fields.icon] ? ' ' : '',
+ text = module.helpers.escape(el[fields.text] || '', settings.preserveHTML),
+ cls = module.helpers.deQuote(el[fields.class] || ''),
+ click = el[fields.click] && $.isFunction(el[fields.click]) ? el[fields.click] : function () {};
+ $actions.append($(' ', {
+ html: icon + text,
+ class: className.button + ' ' + cls,
+ click: function () {
+ if (click.call(element, $module) === false) {
+ return;
+ }
+ module.hide();
+ }
+ }));
+ });
+ }
+ module.cache = {};
+ module.verbose('Initializing dimmer', $context);
+
+ module.create.id();
+ module.create.dimmer();
+
+ if ( settings.allowMultiple ) {
+ module.create.innerDimmer();
+ }
+ if (!settings.centered){
+ $module.addClass('top aligned');
+ }
+ module.refreshModals();
+
+ module.bind.events();
+ if(settings.observeChanges) {
+ module.observeChanges();
+ }
+ module.instantiate();
+ if(settings.autoShow){
+ module.show();
+ }
+ },
+
+ instantiate: function() {
+ module.verbose('Storing instance of modal');
+ instance = module;
+ $module
+ .data(moduleNamespace, instance)
+ ;
+ },
+
+ create: {
+ modal: function() {
+ $module = $('
', {class: className.modal});
+ if (settings.closeIcon) {
+ $close = $(' ', {class: className.close})
+ $module.append($close);
+ }
+ if (settings.title !== '') {
+ $('
', {class: className.title}).appendTo($module);
+ }
+ if (settings.content !== '') {
+ $('
', {class: className.content}).appendTo($module);
+ }
+ if (module.has.configActions()) {
+ $('
', {class: className.actions}).appendTo($module);
+ }
+ $context.append($module);
+ },
+ dimmer: function() {
+ var
+ defaultSettings = {
+ debug : settings.debug,
+ dimmerName : 'modals'
+ },
+ dimmerSettings = $.extend(true, defaultSettings, settings.dimmerSettings)
+ ;
+ if($.fn.dimmer === undefined) {
+ module.error(error.dimmer);
+ return;
+ }
+ module.debug('Creating dimmer');
+ $dimmable = $context.dimmer(dimmerSettings);
+ if(settings.detachable) {
+ module.verbose('Modal is detachable, moving content into dimmer');
+ $dimmable.dimmer('add content', $module);
+ }
+ else {
+ module.set.undetached();
+ }
+ $dimmer = $dimmable.dimmer('get dimmer');
+ },
+ id: function() {
+ id = (Math.random().toString(16) + '000000000').substr(2, 8);
+ elementEventNamespace = '.' + id;
+ module.verbose('Creating unique id for element', id);
+ },
+ innerDimmer: function() {
+ if ( $module.find(selector.dimmer).length == 0 ) {
+ $module.prepend('
');
+ }
+ }
+ },
+
+ destroy: function() {
+ if (observer) {
+ observer.disconnect();
+ }
+ module.verbose('Destroying previous modal');
+ $module
+ .removeData(moduleNamespace)
+ .off(eventNamespace)
+ ;
+ $window.off(elementEventNamespace);
+ $dimmer.off(elementEventNamespace);
+ $close.off(eventNamespace);
+ $context.dimmer('destroy');
+ },
+
+ observeChanges: function() {
+ if('MutationObserver' in window) {
+ observer = new MutationObserver(function(mutations) {
+ module.debug('DOM tree modified, refreshing');
+ module.refresh();
+ });
+ observer.observe(element, {
+ childList : true,
+ subtree : true
+ });
+ module.debug('Setting up mutation observer', observer);
+ }
+ },
+
+ refresh: function() {
+ module.remove.scrolling();
+ module.cacheSizes();
+ if(!module.can.useFlex()) {
+ module.set.modalOffset();
+ }
+ module.set.screenHeight();
+ module.set.type();
+ },
+
+ refreshModals: function() {
+ $otherModals = $module.siblings(selector.modal);
+ $allModals = $otherModals.add($module);
+ },
+
+ attachEvents: function(selector, event) {
+ var
+ $toggle = $(selector)
+ ;
+ event = $.isFunction(module[event])
+ ? module[event]
+ : module.toggle
+ ;
+ if($toggle.length > 0) {
+ module.debug('Attaching modal events to element', selector, event);
+ $toggle
+ .off(eventNamespace)
+ .on('click' + eventNamespace, event)
+ ;
+ }
+ else {
+ module.error(error.notFound, selector);
+ }
+ },
+
+ bind: {
+ events: function() {
+ module.verbose('Attaching events');
+ $module
+ .on('click' + eventNamespace, selector.close, module.event.close)
+ .on('click' + eventNamespace, selector.approve, module.event.approve)
+ .on('click' + eventNamespace, selector.deny, module.event.deny)
+ ;
+ $window
+ .on('resize' + elementEventNamespace, module.event.resize)
+ ;
+ },
+ scrollLock: function() {
+ // touch events default to passive, due to changes in chrome to optimize mobile perf
+ $dimmable.get(0).addEventListener('touchmove', module.event.preventScroll, { passive: false });
+ }
+ },
+
+ unbind: {
+ scrollLock: function() {
+ $dimmable.get(0).removeEventListener('touchmove', module.event.preventScroll, { passive: false });
+ }
+ },
+
+ get: {
+ id: function() {
+ return (Math.random().toString(16) + '000000000').substr(2, 8);
+ },
+ element: function() {
+ return $module;
+ },
+ settings: function() {
+ return settings;
+ }
+ },
+
+ event: {
+ approve: function() {
+ if(ignoreRepeatedEvents || settings.onApprove.call(element, $(this)) === false) {
+ module.verbose('Approve callback returned false cancelling hide');
+ return;
+ }
+ ignoreRepeatedEvents = true;
+ module.hide(function() {
+ ignoreRepeatedEvents = false;
+ });
+ },
+ preventScroll: function(event) {
+ if(event.target.className.indexOf('dimmer') !== -1) {
+ event.preventDefault();
+ }
+ },
+ deny: function() {
+ if(ignoreRepeatedEvents || settings.onDeny.call(element, $(this)) === false) {
+ module.verbose('Deny callback returned false cancelling hide');
+ return;
+ }
+ ignoreRepeatedEvents = true;
+ module.hide(function() {
+ ignoreRepeatedEvents = false;
+ });
+ },
+ close: function() {
+ module.hide();
+ },
+ mousedown: function(event) {
+ var
+ $target = $(event.target),
+ isRtl = module.is.rtl();
+ ;
+ initialMouseDownInModal = ($target.closest(selector.modal).length > 0);
+ if(initialMouseDownInModal) {
+ module.verbose('Mouse down event registered inside the modal');
+ }
+ initialMouseDownInScrollbar = module.is.scrolling() && ((!isRtl && $(window).outerWidth() - settings.scrollbarWidth <= event.clientX) || (isRtl && settings.scrollbarWidth >= event.clientX));
+ if(initialMouseDownInScrollbar) {
+ module.verbose('Mouse down event registered inside the scrollbar');
+ }
+ },
+ mouseup: function(event) {
+ if(!settings.closable) {
+ module.verbose('Dimmer clicked but closable setting is disabled');
+ return;
+ }
+ if(initialMouseDownInModal) {
+ module.debug('Dimmer clicked but mouse down was initially registered inside the modal');
+ return;
+ }
+ if(initialMouseDownInScrollbar){
+ module.debug('Dimmer clicked but mouse down was initially registered inside the scrollbar');
+ return;
+ }
+ var
+ $target = $(event.target),
+ isInModal = ($target.closest(selector.modal).length > 0),
+ isInDOM = $.contains(document.documentElement, event.target)
+ ;
+ if(!isInModal && isInDOM && module.is.active() && $module.hasClass(className.front) ) {
+ module.debug('Dimmer clicked, hiding all modals');
+ if(settings.allowMultiple) {
+ if(!module.hideAll()) {
+ return;
+ }
+ }
+ else if(!module.hide()){
+ return;
+ }
+ module.remove.clickaway();
+ }
+ },
+ debounce: function(method, delay) {
+ clearTimeout(module.timer);
+ module.timer = setTimeout(method, delay);
+ },
+ keyboard: function(event) {
+ var
+ keyCode = event.which,
+ escapeKey = 27
+ ;
+ if(keyCode == escapeKey) {
+ if(settings.closable) {
+ module.debug('Escape key pressed hiding modal');
+ if ( $module.hasClass(className.front) ) {
+ module.hide();
+ }
+ }
+ else {
+ module.debug('Escape key pressed, but closable is set to false');
+ }
+ event.preventDefault();
+ }
+ },
+ resize: function() {
+ if( $dimmable.dimmer('is active') && ( module.is.animating() || module.is.active() ) ) {
+ requestAnimationFrame(module.refresh);
+ }
+ }
+ },
+
+ toggle: function() {
+ if( module.is.active() || module.is.animating() ) {
+ module.hide();
+ }
+ else {
+ module.show();
+ }
+ },
+
+ show: function(callback) {
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ module.refreshModals();
+ module.set.dimmerSettings();
+ module.set.dimmerStyles();
+
+ module.showModal(callback);
+ },
+
+ hide: function(callback) {
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ module.refreshModals();
+ return module.hideModal(callback);
+ },
+
+ showModal: function(callback) {
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ if( module.is.animating() || !module.is.active() ) {
+ module.showDimmer();
+ module.cacheSizes();
+ module.set.bodyMargin();
+ if(module.can.useFlex()) {
+ module.remove.legacy();
+ }
+ else {
+ module.set.legacy();
+ module.set.modalOffset();
+ module.debug('Using non-flex legacy modal positioning.');
+ }
+ module.set.screenHeight();
+ module.set.type();
+ module.set.clickaway();
+
+ if( !settings.allowMultiple && module.others.active() ) {
+ module.hideOthers(module.showModal);
+ }
+ else {
+ ignoreRepeatedEvents = false;
+ if( settings.allowMultiple ) {
+ if ( module.others.active() ) {
+ $otherModals.filter('.' + className.active).find(selector.dimmer).addClass('active');
+ }
+
+ if ( settings.detachable ) {
+ $module.detach().appendTo($dimmer);
+ }
+ }
+ settings.onShow.call(element);
+ if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
+ module.debug('Showing modal with css animations');
+ $module
+ .transition({
+ debug : settings.debug,
+ animation : (settings.transition.showMethod || settings.transition) + ' in',
+ queue : settings.queue,
+ duration : settings.transition.showDuration || settings.duration,
+ useFailSafe : true,
+ onComplete : function() {
+ settings.onVisible.apply(element);
+ if(settings.keyboardShortcuts) {
+ module.add.keyboardShortcuts();
+ }
+ module.save.focus();
+ module.set.active();
+ if(settings.autofocus) {
+ module.set.autofocus();
+ }
+ callback();
+ }
+ })
+ ;
+ }
+ else {
+ module.error(error.noTransition);
+ }
+ }
+ }
+ else {
+ module.debug('Modal is already visible');
+ }
+ },
+
+ hideModal: function(callback, keepDimmed, hideOthersToo) {
+ var
+ $previousModal = $otherModals.filter('.' + className.active).last()
+ ;
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ module.debug('Hiding modal');
+ if(settings.onHide.call(element, $(this)) === false) {
+ module.verbose('Hide callback returned false cancelling hide');
+ ignoreRepeatedEvents = false;
+ return false;
+ }
+
+ if( module.is.animating() || module.is.active() ) {
+ if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
+ module.remove.active();
+ $module
+ .transition({
+ debug : settings.debug,
+ animation : (settings.transition.hideMethod || settings.transition) + ' out',
+ queue : settings.queue,
+ duration : settings.transition.hideDuration || settings.duration,
+ useFailSafe : true,
+ onStart : function() {
+ if(!module.others.active() && !module.others.animating() && !keepDimmed) {
+ module.hideDimmer();
+ }
+ if( settings.keyboardShortcuts && !module.others.active() ) {
+ module.remove.keyboardShortcuts();
+ }
+ },
+ onComplete : function() {
+ module.unbind.scrollLock();
+ if ( settings.allowMultiple ) {
+ $previousModal.addClass(className.front);
+ $module.removeClass(className.front);
+
+ if ( hideOthersToo ) {
+ $allModals.find(selector.dimmer).removeClass('active');
+ }
+ else {
+ $previousModal.find(selector.dimmer).removeClass('active');
+ }
+ }
+ if($.isFunction(settings.onHidden)) {
+ settings.onHidden.call(element);
+ }
+ module.remove.dimmerStyles();
+ module.restore.focus();
+ callback();
+ }
+ })
+ ;
+ }
+ else {
+ module.error(error.noTransition);
+ }
+ }
+ },
+
+ showDimmer: function() {
+ if($dimmable.dimmer('is animating') || !$dimmable.dimmer('is active') ) {
+ module.save.bodyMargin();
+ module.debug('Showing dimmer');
+ $dimmable.dimmer('show');
+ }
+ else {
+ module.debug('Dimmer already visible');
+ }
+ },
+
+ hideDimmer: function() {
+ if( $dimmable.dimmer('is animating') || ($dimmable.dimmer('is active')) ) {
+ module.unbind.scrollLock();
+ $dimmable.dimmer('hide', function() {
+ module.restore.bodyMargin();
+ module.remove.clickaway();
+ module.remove.screenHeight();
+ });
+ }
+ else {
+ module.debug('Dimmer is not visible cannot hide');
+ return;
+ }
+ },
+
+ hideAll: function(callback) {
+ var
+ $visibleModals = $allModals.filter('.' + className.active + ', .' + className.animating)
+ ;
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ if( $visibleModals.length > 0 ) {
+ module.debug('Hiding all visible modals');
+ var hideOk = true;
+//check in reverse order trying to hide most top displayed modal first
+ $($visibleModals.get().reverse()).each(function(index,element){
+ if(hideOk){
+ hideOk = $(element).modal('hide modal', callback, false, true);
+ }
+ });
+ if(hideOk) {
+ module.hideDimmer();
+ }
+ return hideOk;
+ }
+ },
+
+ hideOthers: function(callback) {
+ var
+ $visibleModals = $otherModals.filter('.' + className.active + ', .' + className.animating)
+ ;
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ if( $visibleModals.length > 0 ) {
+ module.debug('Hiding other modals', $otherModals);
+ $visibleModals
+ .modal('hide modal', callback, true)
+ ;
+ }
+ },
+
+ others: {
+ active: function() {
+ return ($otherModals.filter('.' + className.active).length > 0);
+ },
+ animating: function() {
+ return ($otherModals.filter('.' + className.animating).length > 0);
+ }
+ },
+
+
+ add: {
+ keyboardShortcuts: function() {
+ module.verbose('Adding keyboard shortcuts');
+ $document
+ .on('keyup' + eventNamespace, module.event.keyboard)
+ ;
+ }
+ },
+
+ save: {
+ focus: function() {
+ var
+ $activeElement = $(document.activeElement),
+ inCurrentModal = $activeElement.closest($module).length > 0
+ ;
+ if(!inCurrentModal) {
+ $focusedElement = $(document.activeElement).blur();
+ }
+ },
+ bodyMargin: function() {
+ initialBodyMargin = $body.css('margin-'+(module.can.leftBodyScrollbar() ? 'left':'right'));
+ var bodyMarginRightPixel = parseInt(initialBodyMargin.replace(/[^\d.]/g, '')),
+ bodyScrollbarWidth = window.innerWidth - document.documentElement.clientWidth;
+ tempBodyMargin = bodyMarginRightPixel + bodyScrollbarWidth;
+ }
+ },
+
+ restore: {
+ focus: function() {
+ if($focusedElement && $focusedElement.length > 0 && settings.restoreFocus) {
+ $focusedElement.focus();
+ }
+ },
+ bodyMargin: function() {
+ var position = module.can.leftBodyScrollbar() ? 'left':'right';
+ $body.css('margin-'+position, initialBodyMargin);
+ $body.find(selector.bodyFixed.replace('right',position)).each(function(){
+ var el = $(this),
+ attribute = el.css('position') === 'fixed' ? 'padding-'+position : position
+ ;
+ el.css(attribute, '');
+ });
+ }
+ },
+
+ remove: {
+ active: function() {
+ $module.removeClass(className.active);
+ },
+ legacy: function() {
+ $module.removeClass(className.legacy);
+ },
+ clickaway: function() {
+ if (!settings.detachable) {
+ $module
+ .off('mousedown' + elementEventNamespace)
+ ;
+ }
+ $dimmer
+ .off('mousedown' + elementEventNamespace)
+ ;
+ $dimmer
+ .off('mouseup' + elementEventNamespace)
+ ;
+ },
+ dimmerStyles: function() {
+ $dimmer.removeClass(className.inverted);
+ $dimmable.removeClass(className.blurring);
+ },
+ bodyStyle: function() {
+ if($body.attr('style') === '') {
+ module.verbose('Removing style attribute');
+ $body.removeAttr('style');
+ }
+ },
+ screenHeight: function() {
+ module.debug('Removing page height');
+ $body
+ .css('height', '')
+ ;
+ },
+ keyboardShortcuts: function() {
+ module.verbose('Removing keyboard shortcuts');
+ $document
+ .off('keyup' + eventNamespace)
+ ;
+ },
+ scrolling: function() {
+ $dimmable.removeClass(className.scrolling);
+ $module.removeClass(className.scrolling);
+ }
+ },
+
+ cacheSizes: function() {
+ $module.addClass(className.loading);
+ var
+ scrollHeight = $module.prop('scrollHeight'),
+ modalWidth = $module.outerWidth(),
+ modalHeight = $module.outerHeight()
+ ;
+ if(module.cache.pageHeight === undefined || modalHeight !== 0) {
+ $.extend(module.cache, {
+ pageHeight : $(document).outerHeight(),
+ width : modalWidth,
+ height : modalHeight + settings.offset,
+ scrollHeight : scrollHeight + settings.offset,
+ contextHeight : (settings.context == 'body')
+ ? $(window).height()
+ : $dimmable.height(),
+ });
+ module.cache.topOffset = -(module.cache.height / 2);
+ }
+ $module.removeClass(className.loading);
+ module.debug('Caching modal and container sizes', module.cache);
+ },
+ helpers: {
+ deQuote: function(string) {
+ return String(string).replace(/"/g,"");
+ },
+ escape: function(string, preserveHTML) {
+ if (preserveHTML){
+ return string;
+ }
+ var
+ badChars = /[<>"'`]/g,
+ shouldEscape = /[&<>"'`]/,
+ escape = {
+ "<": "<",
+ ">": ">",
+ '"': """,
+ "'": "'",
+ "`": "`"
+ },
+ escapedChar = function(chr) {
+ return escape[chr];
+ }
+ ;
+ if(shouldEscape.test(string)) {
+ string = string.replace(/&(?![a-z0-9#]{1,6};)/, "&");
+ return string.replace(badChars, escapedChar);
+ }
+ return string;
+ }
+ },
+ can: {
+ leftBodyScrollbar: function(){
+ if(module.cache.leftBodyScrollbar === undefined) {
+ module.cache.leftBodyScrollbar = module.is.rtl() && ((module.is.iframe && !module.is.firefox()) || module.is.safari() || module.is.edge() || module.is.ie());
+ }
+ return module.cache.leftBodyScrollbar;
+ },
+ useFlex: function() {
+ if (settings.useFlex === 'auto') {
+ return settings.detachable && !module.is.ie();
+ }
+ if(settings.useFlex && module.is.ie()) {
+ module.debug('useFlex true is not supported in IE');
+ } else if(settings.useFlex && !settings.detachable) {
+ module.debug('useFlex true in combination with detachable false is not supported');
+ }
+ return settings.useFlex;
+ },
+ fit: function() {
+ var
+ contextHeight = module.cache.contextHeight,
+ verticalCenter = module.cache.contextHeight / 2,
+ topOffset = module.cache.topOffset,
+ scrollHeight = module.cache.scrollHeight,
+ height = module.cache.height,
+ paddingHeight = settings.padding,
+ startPosition = (verticalCenter + topOffset)
+ ;
+ return (scrollHeight > height)
+ ? (startPosition + scrollHeight + paddingHeight < contextHeight)
+ : (height + (paddingHeight * 2) < contextHeight)
+ ;
+ }
+ },
+ has: {
+ configActions: function () {
+ return Array.isArray(settings.actions) && settings.actions.length > 0;
+ }
+ },
+ is: {
+ active: function() {
+ return $module.hasClass(className.active);
+ },
+ ie: function() {
+ if(module.cache.isIE === undefined) {
+ var
+ isIE11 = (!(window.ActiveXObject) && 'ActiveXObject' in window),
+ isIE = ('ActiveXObject' in window)
+ ;
+ module.cache.isIE = (isIE11 || isIE);
+ }
+ return module.cache.isIE;
+ },
+ animating: function() {
+ return $module.transition('is supported')
+ ? $module.transition('is animating')
+ : $module.is(':visible')
+ ;
+ },
+ scrolling: function() {
+ return $dimmable.hasClass(className.scrolling);
+ },
+ modernBrowser: function() {
+ // appName for IE11 reports 'Netscape' can no longer use
+ return !(window.ActiveXObject || 'ActiveXObject' in window);
+ },
+ rtl: function() {
+ if(module.cache.isRTL === undefined) {
+ module.cache.isRTL = $body.attr('dir') === 'rtl' || $body.css('direction') === 'rtl';
+ }
+ return module.cache.isRTL;
+ },
+ safari: function() {
+ if(module.cache.isSafari === undefined) {
+ module.cache.isSafari = /constructor/i.test(window.HTMLElement) || !!window.ApplePaySession;
+ }
+ return module.cache.isSafari;
+ },
+ edge: function(){
+ if(module.cache.isEdge === undefined) {
+ module.cache.isEdge = !!window.setImmediate && !module.is.ie();
+ }
+ return module.cache.isEdge;
+ },
+ firefox: function(){
+ if(module.cache.isFirefox === undefined) {
+ module.cache.isFirefox = !!window.InstallTrigger;
+ }
+ return module.cache.isFirefox;
+ },
+ iframe: function() {
+ return !(self === top);
+ }
+ },
+
+ set: {
+ autofocus: function() {
+ var
+ $inputs = $module.find('[tabindex], :input').filter(':visible').filter(function() {
+ return $(this).closest('.disabled').length === 0;
+ }),
+ $autofocus = $inputs.filter('[autofocus]'),
+ $input = ($autofocus.length > 0)
+ ? $autofocus.first()
+ : $inputs.first()
+ ;
+ if($input.length > 0) {
+ $input.focus();
+ }
+ },
+ bodyMargin: function() {
+ var position = module.can.leftBodyScrollbar() ? 'left':'right';
+ if(settings.detachable || module.can.fit()) {
+ $body.css('margin-'+position, tempBodyMargin + 'px');
+ }
+ $body.find(selector.bodyFixed.replace('right',position)).each(function(){
+ var el = $(this),
+ attribute = el.css('position') === 'fixed' ? 'padding-'+position : position
+ ;
+ el.css(attribute, 'calc(' + el.css(attribute) + ' + ' + tempBodyMargin + 'px)');
+ });
+ },
+ clickaway: function() {
+ if (!settings.detachable) {
+ $module
+ .on('mousedown' + elementEventNamespace, module.event.mousedown)
+ ;
+ }
+ $dimmer
+ .on('mousedown' + elementEventNamespace, module.event.mousedown)
+ ;
+ $dimmer
+ .on('mouseup' + elementEventNamespace, module.event.mouseup)
+ ;
+ },
+ dimmerSettings: function() {
+ if($.fn.dimmer === undefined) {
+ module.error(error.dimmer);
+ return;
+ }
+ var
+ defaultSettings = {
+ debug : settings.debug,
+ dimmerName : 'modals',
+ closable : 'auto',
+ useFlex : module.can.useFlex(),
+ duration : {
+ show : settings.transition.showDuration || settings.duration,
+ hide : settings.transition.hideDuration || settings.duration
+ }
+ },
+ dimmerSettings = $.extend(true, defaultSettings, settings.dimmerSettings)
+ ;
+ if(settings.inverted) {
+ dimmerSettings.variation = (dimmerSettings.variation !== undefined)
+ ? dimmerSettings.variation + ' inverted'
+ : 'inverted'
+ ;
+ }
+ $context.dimmer('setting', dimmerSettings);
+ },
+ dimmerStyles: function() {
+ if(settings.inverted) {
+ $dimmer.addClass(className.inverted);
+ }
+ else {
+ $dimmer.removeClass(className.inverted);
+ }
+ if(settings.blurring) {
+ $dimmable.addClass(className.blurring);
+ }
+ else {
+ $dimmable.removeClass(className.blurring);
+ }
+ },
+ modalOffset: function() {
+ if (!settings.detachable) {
+ var canFit = module.can.fit();
+ $module
+ .css({
+ top: (!$module.hasClass('aligned') && canFit)
+ ? $(document).scrollTop() + (module.cache.contextHeight - module.cache.height) / 2
+ : !canFit || $module.hasClass('top')
+ ? $(document).scrollTop() + settings.padding
+ : $(document).scrollTop() + (module.cache.contextHeight - module.cache.height - settings.padding),
+ marginLeft: -(module.cache.width / 2)
+ })
+ ;
+ } else {
+ $module
+ .css({
+ marginTop: (!$module.hasClass('aligned') && module.can.fit())
+ ? -(module.cache.height / 2)
+ : settings.padding / 2,
+ marginLeft: -(module.cache.width / 2)
+ })
+ ;
+ }
+ module.verbose('Setting modal offset for legacy mode');
+ },
+ screenHeight: function() {
+ if( module.can.fit() ) {
+ $body.css('height', '');
+ }
+ else if(!$module.hasClass('bottom')) {
+ module.debug('Modal is taller than page content, resizing page height');
+ $body
+ .css('height', module.cache.height + (settings.padding * 2) )
+ ;
+ }
+ },
+ active: function() {
+ $module.addClass(className.active + ' ' + className.front);
+ $otherModals.filter('.' + className.active).removeClass(className.front);
+ },
+ scrolling: function() {
+ $dimmable.addClass(className.scrolling);
+ $module.addClass(className.scrolling);
+ module.unbind.scrollLock();
+ },
+ legacy: function() {
+ $module.addClass(className.legacy);
+ },
+ type: function() {
+ if(module.can.fit()) {
+ module.verbose('Modal fits on screen');
+ if(!module.others.active() && !module.others.animating()) {
+ module.remove.scrolling();
+ module.bind.scrollLock();
+ }
+ }
+ else if (!$module.hasClass('bottom')){
+ module.verbose('Modal cannot fit on screen setting to scrolling');
+ module.set.scrolling();
+ } else {
+ module.verbose('Bottom aligned modal not fitting on screen is unsupported for scrolling');
+ }
+ },
+ undetached: function() {
+ $dimmable.addClass(className.undetached);
+ }
+ },
+
+ setting: function(name, value) {
+ module.debug('Changing setting', name, value);
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ if($.isPlainObject(settings[name])) {
+ $.extend(true, settings[name], value);
+ }
+ else {
+ settings[name] = value;
+ }
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+
+ if(methodInvoked) {
+ if(instance === undefined) {
+ if ($.isFunction(settings.templates[query])) {
+ settings.autoShow = true;
+ settings.className.modal = settings.className.template;
+ settings = $.extend(true, {}, settings, settings.templates[query].apply(module ,queryArguments));
+
+ // reassign shortcuts
+ className = settings.className;
+ namespace = settings.namespace;
+ fields = settings.fields;
+ error = settings.error;
+ }
+ module.initialize();
+ }
+ if (!$.isFunction(settings.templates[query])) {
+ module.invoke(query);
+ }
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ returnedValue = $module;
+ }
+ })
+ ;
+
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.fn.modal.settings = {
+
+ name : 'Modal',
+ namespace : 'modal',
+
+ useFlex : 'auto',
+ offset : 0,
+
+ silent : false,
+ debug : false,
+ verbose : false,
+ performance : true,
+
+ observeChanges : false,
+
+ allowMultiple : false,
+ detachable : true,
+ closable : true,
+ autofocus : true,
+ restoreFocus : true,
+ autoShow : false,
+
+ inverted : false,
+ blurring : false,
+
+ centered : true,
+
+ dimmerSettings : {
+ closable : false,
+ useCSS : true
+ },
+
+ // whether to use keyboard shortcuts
+ keyboardShortcuts: true,
+
+ context : 'body',
+
+ queue : false,
+ duration : 500,
+ transition : 'scale',
+
+ // padding with edge of page
+ padding : 50,
+ scrollbarWidth: 10,
+
+ //dynamic content
+ title : '',
+ content : '',
+ class : '',
+ classTitle : '',
+ classContent : '',
+ classActions : '',
+ closeIcon : false,
+ actions : false,
+ preserveHTML : true,
+
+ fields : {
+ class : 'class',
+ text : 'text',
+ icon : 'icon',
+ click : 'click'
+ },
+
+ // called before show animation
+ onShow : function(){},
+
+ // called after show animation
+ onVisible : function(){},
+
+ // called before hide animation
+ onHide : function(){ return true; },
+
+ // called after hide animation
+ onHidden : false,
+
+ // called after approve selector match
+ onApprove : function(){ return true; },
+
+ // called after deny selector match
+ onDeny : function(){ return true; },
+
+ selector : {
+ title : '> .header',
+ content : '> .content',
+ actions : '> .actions',
+ close : '> .close',
+ approve : '.actions .positive, .actions .approve, .actions .ok',
+ deny : '.actions .negative, .actions .deny, .actions .cancel',
+ modal : '.ui.modal',
+ dimmer : '> .ui.dimmer',
+ bodyFixed: '> .ui.fixed.menu, > .ui.right.toast-container, > .ui.right.sidebar, > .ui.fixed.nag, > .ui.fixed.nag > .close',
+ prompt : '.ui.input > input'
+ },
+ error : {
+ dimmer : 'UI Dimmer, a required component is not included in this page',
+ method : 'The method you called is not defined.',
+ notFound : 'The element you specified could not be found'
+ },
+ className : {
+ active : 'active',
+ animating : 'animating',
+ blurring : 'blurring',
+ inverted : 'inverted',
+ legacy : 'legacy',
+ loading : 'loading',
+ scrolling : 'scrolling',
+ undetached : 'undetached',
+ front : 'front',
+ close : 'close icon',
+ button : 'ui button',
+ modal : 'ui modal',
+ title : 'header',
+ content : 'content',
+ actions : 'actions',
+ template : 'ui tiny modal',
+ ok : 'positive',
+ cancel : 'negative',
+ prompt : 'ui fluid input'
+ },
+ text: {
+ ok : 'Ok',
+ cancel: 'Cancel'
+ }
+};
+
+$.fn.modal.settings.templates = {
+ getArguments: function(args) {
+ var queryArguments = [].slice.call(args);
+ if($.isPlainObject(queryArguments[0])){
+ return $.extend({
+ handler:function(){},
+ content:'',
+ title: ''
+ }, queryArguments[0]);
+ } else {
+ if(!$.isFunction(queryArguments[queryArguments.length-1])) {
+ queryArguments.push(function() {});
+ }
+ return {
+ handler: queryArguments.pop(),
+ content: queryArguments.pop() || '',
+ title: queryArguments.pop() || ''
+ };
+ }
+ },
+ alert: function () {
+ var settings = this.get.settings(),
+ args = settings.templates.getArguments(arguments)
+ ;
+ return {
+ title : args.title,
+ content: args.content,
+ actions: [{
+ text : settings.text.ok,
+ class: settings.className.ok,
+ click: args.handler
+ }]
+ }
+ },
+ confirm: function () {
+ var settings = this.get.settings(),
+ args = settings.templates.getArguments(arguments)
+ ;
+ return {
+ title : args.title,
+ content: args.content,
+ actions: [{
+ text : settings.text.ok,
+ class: settings.className.ok,
+ click: function(){args.handler(true)}
+ },{
+ text: settings.text.cancel,
+ class: settings.className.cancel,
+ click: function(){args.handler(false)}
+ }]
+ }
+ },
+ prompt: function () {
+ var $this = this,
+ settings = this.get.settings(),
+ args = settings.templates.getArguments(arguments),
+ input = $($.parseHTML(args.content)).filter('.ui.input')
+ ;
+ if (input.length === 0) {
+ args.content += '
';
+ }
+ return {
+ title : args.title,
+ content: args.content,
+ actions: [{
+ text: settings.text.ok,
+ class: settings.className.ok,
+ click: function(){
+ var settings = $this.get.settings(),
+ inputField = $this.get.element().find(settings.selector.prompt)[0]
+ ;
+ args.handler($(inputField).val());
+ }
+ },{
+ text: settings.text.cancel,
+ class: settings.className.cancel,
+ click: function(){args.handler(null)}
+ }]
+ }
+ }
+}
+
+})( jQuery, window, document );
+
+/*!
+ * # Fomantic-UI 2.8.8 - Nag
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+'use strict';
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.nag = function(parameters) {
+ var
+ $allModules = $(this),
+ moduleSelector = $allModules.selector || '',
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+ returnedValue
+ ;
+ $allModules
+ .each(function() {
+ var
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.fn.nag.settings, parameters)
+ : $.extend({}, $.fn.nag.settings),
+
+ selector = settings.selector,
+ error = settings.error,
+ namespace = settings.namespace,
+
+ eventNamespace = '.' + namespace,
+ moduleNamespace = namespace + '-module',
+
+ $module = $(this),
+
+ $context = (settings.context)
+ ? $(settings.context)
+ : $('body'),
+
+ element = this,
+ instance = $module.data(moduleNamespace),
+ storage,
+ module
+ ;
+ module = {
+
+ initialize: function() {
+ module.verbose('Initializing element');
+ storage = module.get.storage();
+ $module
+ .on('click' + eventNamespace, selector.close, module.dismiss)
+ .data(moduleNamespace, module)
+ ;
+
+ if(settings.detachable && $module.parent()[0] !== $context[0]) {
+ $module
+ .detach()
+ .prependTo($context)
+ ;
+ }
+
+ if(settings.displayTime > 0) {
+ setTimeout(module.hide, settings.displayTime);
+ }
+ module.show();
+ },
+
+ destroy: function() {
+ module.verbose('Destroying instance');
+ $module
+ .removeData(moduleNamespace)
+ .off(eventNamespace)
+ ;
+ },
+
+ show: function() {
+ if( module.should.show() && !$module.is(':visible') ) {
+ if(settings.onShow.call(element) === false) {
+ module.debug('onShow callback returned false, cancelling nag animation');
+ return false;
+ }
+ module.debug('Showing nag', settings.animation.show);
+ if(settings.animation.show === 'fade') {
+ $module
+ .fadeIn(settings.duration, settings.easing, settings.onVisible)
+ ;
+ }
+ else {
+ $module
+ .slideDown(settings.duration, settings.easing, settings.onVisible)
+ ;
+ }
+ }
+ },
+
+ hide: function() {
+ if(settings.onHide.call(element) === false) {
+ module.debug('onHide callback returned false, cancelling nag animation');
+ return false;
+ }
+ module.debug('Hiding nag', settings.animation.hide);
+ if(settings.animation.hide === 'fade') {
+ $module
+ .fadeOut(settings.duration, settings.easing, settings.onHidden)
+ ;
+ }
+ else {
+ $module
+ .slideUp(settings.duration, settings.easing, settings.onHidden)
+ ;
+ }
+ },
+
+ dismiss: function(event) {
+ if(module.hide() !== false && settings.storageMethod) {
+ module.debug('Dismissing nag', settings.storageMethod, settings.key, settings.value, settings.expires);
+ module.storage.set(settings.key, settings.value);
+ }
+ event.stopImmediatePropagation();
+ event.preventDefault();
+ },
+
+ should: {
+ show: function() {
+ if(settings.persist) {
+ module.debug('Persistent nag is set, can show nag');
+ return true;
+ }
+ if( module.storage.get(settings.key) != settings.value.toString() ) {
+ module.debug('Stored value is not set, can show nag', module.storage.get(settings.key));
+ return true;
+ }
+ module.debug('Stored value is set, cannot show nag', module.storage.get(settings.key));
+ return false;
+ }
+ },
+
+ get: {
+ expirationDate: function(expires) {
+ if (typeof expires === 'number') {
+ expires = new Date(Date.now() + expires * 864e5);
+ }
+ if(expires instanceof Date && expires.getTime() ){
+ return expires.toUTCString();
+ } else {
+ module.error(error.expiresFormat);
+ }
+ },
+ storage: function(){
+ if(settings.storageMethod === 'localstorage' && window.localStorage !== undefined) {
+ module.debug('Using local storage');
+ return window.localStorage;
+ }
+ else if(settings.storageMethod === 'sessionstorage' && window.sessionStorage !== undefined) {
+ module.debug('Using session storage');
+ return window.sessionStorage;
+ }
+ else if("cookie" in document) {
+ module.debug('Using cookie');
+ return {
+ setItem: function(key, value, options) {
+ // RFC6265 compliant encoding
+ key = encodeURIComponent(key)
+ .replace(/%(2[346B]|5E|60|7C)/g, decodeURIComponent)
+ .replace(/[()]/g, escape);
+ value = encodeURIComponent(value)
+ .replace(/%(2[346BF]|3[AC-F]|40|5[BDE]|60|7[BCD])/g, decodeURIComponent);
+
+ var cookieOptions = '';
+ for (var option in options) {
+ if (options.hasOwnProperty(option)) {
+ cookieOptions += '; ' + option;
+ if (typeof options[option] === 'string') {
+ cookieOptions += '=' + options[option].split(';')[0];
+ }
+ }
+ }
+ document.cookie = key + '=' + value + cookieOptions;
+ },
+ getItem: function(key) {
+ var cookies = document.cookie.split('; ');
+ for (var i = 0, il = cookies.length; i < il; i++) {
+ var parts = cookies[i].split('='),
+ foundKey = parts[0].replace(/(%[\dA-F]{2})+/gi, decodeURIComponent);
+ if (key === foundKey) {
+ return parts[1] || '';
+ }
+ }
+ },
+ removeItem: function(key, options) {
+ storage.setItem(key,'',options);
+ }
+ };
+ } else {
+ module.error(error.noStorage);
+ }
+ },
+ storageOptions: function() {
+ var
+ options = {}
+ ;
+ if(settings.expires) {
+ options.expires = module.get.expirationDate(settings.expires);
+ }
+ if(settings.domain) {
+ options.domain = settings.domain;
+ }
+ if(settings.path) {
+ options.path = settings.path;
+ }
+ if(settings.secure) {
+ options.secure = settings.secure;
+ }
+ if(settings.samesite) {
+ options.samesite = settings.samesite;
+ }
+ return options;
+ }
+ },
+
+ clear: function() {
+ module.storage.remove(settings.key);
+ },
+
+ storage: {
+ set: function(key, value) {
+ var
+ options = module.get.storageOptions()
+ ;
+ if(storage === window.localStorage && options.expires) {
+ module.debug('Storing expiration value in localStorage', key, options.expires);
+ storage.setItem(key + settings.expirationKey, options.expires );
+ }
+ module.debug('Value stored', key, value);
+ try {
+ storage.setItem(key, value, options);
+ }
+ catch(e) {
+ module.error(error.setItem, e);
+ }
+ },
+ get: function(key) {
+ var
+ storedValue
+ ;
+ storedValue = storage.getItem(key);
+ if(storage === window.localStorage) {
+ var expiration = storage.getItem(key + settings.expirationKey);
+ if(expiration !== null && expiration !== undefined && new Date(expiration) < new Date()) {
+ module.debug('Value in localStorage has expired. Deleting key', key);
+ module.storage.remove(key);
+ storedValue = null;
+ }
+ }
+ if(storedValue == 'undefined' || storedValue == 'null' || storedValue === undefined || storedValue === null) {
+ storedValue = undefined;
+ }
+ return storedValue;
+ },
+ remove: function(key) {
+ var
+ options = module.get.storageOptions()
+ ;
+ options.expires = module.get.expirationDate(-1);
+ if(storage === window.localStorage) {
+ storage.removeItem(key + settings.expirationKey);
+ }
+ storage.removeItem(key, options);
+ }
+ },
+
+ setting: function(name, value) {
+ module.debug('Changing setting', name, value);
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ if($.isPlainObject(settings[name])) {
+ $.extend(true, settings[name], value);
+ }
+ else {
+ settings[name] = value;
+ }
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ module.error(error.method, query);
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ }
+ })
+ ;
+
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.fn.nag.settings = {
+
+ name : 'Nag',
+
+ silent : false,
+ debug : false,
+ verbose : false,
+ performance : true,
+
+ namespace : 'Nag',
+
+ // allows cookie to be overridden
+ persist : false,
+
+ // set to zero to require manually dismissal, otherwise hides on its own
+ displayTime : 0,
+
+ animation : {
+ show : 'slide',
+ hide : 'slide'
+ },
+
+ context : false,
+ detachable : false,
+
+ expires : 30,
+
+// cookie storage only options
+ domain : false,
+ path : '/',
+ secure : false,
+ samesite : false,
+
+ // type of storage to use
+ storageMethod : 'cookie',
+
+ // value to store in dismissed localstorage/cookie
+ key : 'nag',
+ value : 'dismiss',
+
+// Key suffix to support expiration in localstorage
+ expirationKey : 'ExpirationDate',
+
+ error: {
+ noStorage : 'Unsupported storage method',
+ method : 'The method you called is not defined.',
+ setItem : 'Unexpected error while setting value',
+ expiresFormat : '"expires" must be a number of days or a Date Object'
+ },
+
+ className : {
+ bottom : 'bottom',
+ fixed : 'fixed'
+ },
+
+ selector : {
+ close : '> .close.icon'
+ },
+
+ duration : 500,
+ easing : 'easeOutQuad',
+
+ // callback before show animation, return false to prevent show
+ onShow : function() {},
+
+ // called after show animation
+ onVisible : function() {},
+
+ // callback before hide animation, return false to prevent hide
+ onHide : function() {},
+
+ // callback after hide animation
+ onHidden : function() {}
+
+};
+
+// Adds easing
+$.extend( $.easing, {
+ easeOutQuad: function (x, t, b, c, d) {
+ return -c *(t/=d)*(t-2) + b;
+ }
+});
+
+})( jQuery, window, document );
+
+/*!
+ * # Fomantic-UI 2.8.8 - Popup
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+'use strict';
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.popup = function(parameters) {
+ var
+ $allModules = $(this),
+ $document = $(document),
+ $window = $(window),
+ $body = $('body'),
+
+ moduleSelector = $allModules.selector || '',
+
+ clickEvent = ('ontouchstart' in document.documentElement)
+ ? 'touchstart'
+ : 'click',
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+
+ returnedValue
+ ;
+ $allModules
+ .each(function() {
+ var
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.fn.popup.settings, parameters)
+ : $.extend({}, $.fn.popup.settings),
+
+ selector = settings.selector,
+ className = settings.className,
+ error = settings.error,
+ metadata = settings.metadata,
+ namespace = settings.namespace,
+
+ eventNamespace = '.' + settings.namespace,
+ moduleNamespace = 'module-' + namespace,
+
+ $module = $(this),
+ $context = $(settings.context),
+ $scrollContext = $(settings.scrollContext),
+ $boundary = $(settings.boundary),
+ $target = (settings.target)
+ ? $(settings.target)
+ : $module,
+
+ $popup,
+ $offsetParent,
+
+ searchDepth = 0,
+ triedPositions = false,
+ openedWithTouch = false,
+
+ element = this,
+ instance = $module.data(moduleNamespace),
+
+ documentObserver,
+ elementNamespace,
+ id,
+ module
+ ;
+
+ module = {
+
+ // binds events
+ initialize: function() {
+ module.debug('Initializing', $module);
+ module.createID();
+ module.bind.events();
+ if(!module.exists() && settings.preserve) {
+ module.create();
+ }
+ if(settings.observeChanges) {
+ module.observeChanges();
+ }
+ module.instantiate();
+ },
+
+ instantiate: function() {
+ module.verbose('Storing instance', module);
+ instance = module;
+ $module
+ .data(moduleNamespace, instance)
+ ;
+ },
+
+ observeChanges: function() {
+ if('MutationObserver' in window) {
+ documentObserver = new MutationObserver(module.event.documentChanged);
+ documentObserver.observe(document, {
+ childList : true,
+ subtree : true
+ });
+ module.debug('Setting up mutation observer', documentObserver);
+ }
+ },
+
+ refresh: function() {
+ if(settings.popup) {
+ $popup = $(settings.popup).eq(0);
+ }
+ else {
+ if(settings.inline) {
+ $popup = $target.nextAll(selector.popup).eq(0);
+ settings.popup = $popup;
+ }
+ }
+ if(settings.popup) {
+ $popup.addClass(className.loading);
+ $offsetParent = module.get.offsetParent();
+ $popup.removeClass(className.loading);
+ if(settings.movePopup && module.has.popup() && module.get.offsetParent($popup)[0] !== $offsetParent[0]) {
+ module.debug('Moving popup to the same offset parent as target');
+ $popup
+ .detach()
+ .appendTo($offsetParent)
+ ;
+ }
+ }
+ else {
+ $offsetParent = (settings.inline)
+ ? module.get.offsetParent($target)
+ : module.has.popup()
+ ? module.get.offsetParent($popup)
+ : $body
+ ;
+ }
+ if( $offsetParent.is('html') && $offsetParent[0] !== $body[0] ) {
+ module.debug('Setting page as offset parent');
+ $offsetParent = $body;
+ }
+ if( module.get.variation() ) {
+ module.set.variation();
+ }
+ },
+
+ reposition: function() {
+ module.refresh();
+ module.set.position();
+ },
+
+ destroy: function() {
+ module.debug('Destroying previous module');
+ if(documentObserver) {
+ documentObserver.disconnect();
+ }
+ // remove element only if was created dynamically
+ if($popup && !settings.preserve) {
+ module.removePopup();
+ }
+ // clear all timeouts
+ clearTimeout(module.hideTimer);
+ clearTimeout(module.showTimer);
+ // remove events
+ module.unbind.close();
+ module.unbind.events();
+ $module
+ .removeData(moduleNamespace)
+ ;
+ },
+
+ event: {
+ start: function(event) {
+ var
+ delay = ($.isPlainObject(settings.delay))
+ ? settings.delay.show
+ : settings.delay
+ ;
+ clearTimeout(module.hideTimer);
+ if(!openedWithTouch || (openedWithTouch && settings.addTouchEvents) ) {
+ module.showTimer = setTimeout(module.show, delay);
+ }
+ },
+ end: function() {
+ var
+ delay = ($.isPlainObject(settings.delay))
+ ? settings.delay.hide
+ : settings.delay
+ ;
+ clearTimeout(module.showTimer);
+ module.hideTimer = setTimeout(module.hide, delay);
+ },
+ touchstart: function(event) {
+ openedWithTouch = true;
+ if(settings.addTouchEvents) {
+ module.show();
+ }
+ },
+ resize: function() {
+ if( module.is.visible() ) {
+ module.set.position();
+ }
+ },
+ documentChanged: function(mutations) {
+ [].forEach.call(mutations, function(mutation) {
+ if(mutation.removedNodes) {
+ [].forEach.call(mutation.removedNodes, function(node) {
+ if(node == element || $(node).find(element).length > 0) {
+ module.debug('Element removed from DOM, tearing down events');
+ module.destroy();
+ }
+ });
+ }
+ });
+ },
+ hideGracefully: function(event) {
+ var
+ $target = $(event.target),
+ isInDOM = $.contains(document.documentElement, event.target),
+ inPopup = ($target.closest(selector.popup).length > 0)
+ ;
+ // don't close on clicks inside popup
+ if(event && !inPopup && isInDOM) {
+ module.debug('Click occurred outside popup hiding popup');
+ module.hide();
+ }
+ else {
+ module.debug('Click was inside popup, keeping popup open');
+ }
+ }
+ },
+
+ // generates popup html from metadata
+ create: function() {
+ var
+ html = module.get.html(),
+ title = module.get.title(),
+ content = module.get.content()
+ ;
+
+ if(html || content || title) {
+ module.debug('Creating pop-up html');
+ if(!html) {
+ html = settings.templates.popup({
+ title : title,
+ content : content
+ });
+ }
+ $popup = $('
')
+ .addClass(className.popup)
+ .data(metadata.activator, $module)
+ .html(html)
+ ;
+ if(settings.inline) {
+ module.verbose('Inserting popup element inline', $popup);
+ $popup
+ .insertAfter($module)
+ ;
+ }
+ else {
+ module.verbose('Appending popup element to body', $popup);
+ $popup
+ .appendTo( $context )
+ ;
+ }
+ module.refresh();
+ module.set.variation();
+
+ if(settings.hoverable) {
+ module.bind.popup();
+ }
+ settings.onCreate.call($popup, element);
+ }
+ else if(settings.popup) {
+ $(settings.popup).data(metadata.activator, $module);
+ module.verbose('Used popup specified in settings');
+ module.refresh();
+ if(settings.hoverable) {
+ module.bind.popup();
+ }
+ }
+ else if($target.next(selector.popup).length !== 0) {
+ module.verbose('Pre-existing popup found');
+ settings.inline = true;
+ settings.popup = $target.next(selector.popup).data(metadata.activator, $module);
+ module.refresh();
+ if(settings.hoverable) {
+ module.bind.popup();
+ }
+ }
+ else {
+ module.debug('No content specified skipping display', element);
+ }
+ },
+
+ createID: function() {
+ id = (Math.random().toString(16) + '000000000').substr(2, 8);
+ elementNamespace = '.' + id;
+ module.verbose('Creating unique id for element', id);
+ },
+
+ // determines popup state
+ toggle: function() {
+ module.debug('Toggling pop-up');
+ if( module.is.hidden() ) {
+ module.debug('Popup is hidden, showing pop-up');
+ module.unbind.close();
+ module.show();
+ }
+ else {
+ module.debug('Popup is visible, hiding pop-up');
+ module.hide();
+ }
+ },
+
+ show: function(callback) {
+ callback = callback || function(){};
+ module.debug('Showing pop-up', settings.transition);
+ if(module.is.hidden() && !( module.is.active() && module.is.dropdown()) ) {
+ if( !module.exists() ) {
+ module.create();
+ }
+ if(settings.onShow.call($popup, element) === false) {
+ module.debug('onShow callback returned false, cancelling popup animation');
+ return;
+ }
+ else if(!settings.preserve && !settings.popup) {
+ module.refresh();
+ }
+ if( $popup && module.set.position() ) {
+ module.save.conditions();
+ if(settings.exclusive) {
+ module.hideAll();
+ }
+ module.animate.show(callback);
+ }
+ }
+ },
+
+
+ hide: function(callback) {
+ callback = callback || function(){};
+ if( module.is.visible() || module.is.animating() ) {
+ if(settings.onHide.call($popup, element) === false) {
+ module.debug('onHide callback returned false, cancelling popup animation');
+ return;
+ }
+ module.remove.visible();
+ module.unbind.close();
+ module.restore.conditions();
+ module.animate.hide(callback);
+ }
+ },
+
+ hideAll: function() {
+ $(selector.popup)
+ .filter('.' + className.popupVisible)
+ .each(function() {
+ $(this)
+ .data(metadata.activator)
+ .popup('hide')
+ ;
+ })
+ ;
+ },
+ exists: function() {
+ if(!$popup) {
+ return false;
+ }
+ if(settings.inline || settings.popup) {
+ return ( module.has.popup() );
+ }
+ else {
+ return ( $popup.closest($context).length >= 1 )
+ ? true
+ : false
+ ;
+ }
+ },
+
+ removePopup: function() {
+ if( module.has.popup() && !settings.popup) {
+ module.debug('Removing popup', $popup);
+ $popup.remove();
+ $popup = undefined;
+ settings.onRemove.call($popup, element);
+ }
+ },
+
+ save: {
+ conditions: function() {
+ module.cache = {
+ title: $module.attr('title')
+ };
+ if (module.cache.title) {
+ $module.removeAttr('title');
+ }
+ module.verbose('Saving original attributes', module.cache.title);
+ }
+ },
+ restore: {
+ conditions: function() {
+ if(module.cache && module.cache.title) {
+ $module.attr('title', module.cache.title);
+ module.verbose('Restoring original attributes', module.cache.title);
+ }
+ return true;
+ }
+ },
+ supports: {
+ svg: function() {
+ return (typeof SVGGraphicsElement !== 'undefined');
+ }
+ },
+ animate: {
+ show: function(callback) {
+ callback = $.isFunction(callback) ? callback : function(){};
+ if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
+ module.set.visible();
+ $popup
+ .transition({
+ animation : (settings.transition.showMethod || settings.transition) + ' in',
+ queue : false,
+ debug : settings.debug,
+ verbose : settings.verbose,
+ duration : settings.transition.showDuration || settings.duration,
+ onComplete : function() {
+ module.bind.close();
+ callback.call($popup, element);
+ settings.onVisible.call($popup, element);
+ }
+ })
+ ;
+ }
+ else {
+ module.error(error.noTransition);
+ }
+ },
+ hide: function(callback) {
+ callback = $.isFunction(callback) ? callback : function(){};
+ module.debug('Hiding pop-up');
+ if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
+ $popup
+ .transition({
+ animation : (settings.transition.hideMethod || settings.transition) + ' out',
+ queue : false,
+ duration : settings.transition.hideDuration || settings.duration,
+ debug : settings.debug,
+ verbose : settings.verbose,
+ onComplete : function() {
+ module.reset();
+ callback.call($popup, element);
+ settings.onHidden.call($popup, element);
+ }
+ })
+ ;
+ }
+ else {
+ module.error(error.noTransition);
+ }
+ }
+ },
+
+ change: {
+ content: function(html) {
+ $popup.html(html);
+ }
+ },
+
+ get: {
+ html: function() {
+ $module.removeData(metadata.html);
+ return $module.data(metadata.html) || settings.html;
+ },
+ title: function() {
+ $module.removeData(metadata.title);
+ return $module.data(metadata.title) || settings.title;
+ },
+ content: function() {
+ $module.removeData(metadata.content);
+ return $module.data(metadata.content) || settings.content || $module.attr('title');
+ },
+ variation: function() {
+ $module.removeData(metadata.variation);
+ return $module.data(metadata.variation) || settings.variation;
+ },
+ popup: function() {
+ return $popup;
+ },
+ popupOffset: function() {
+ return $popup.offset();
+ },
+ calculations: function() {
+ var
+ $popupOffsetParent = module.get.offsetParent($popup),
+ targetElement = $target[0],
+ isWindow = ($boundary[0] == window),
+ targetOffset = $target.offset(),
+ parentOffset = settings.inline || (settings.popup && settings.movePopup)
+ ? $target.offsetParent().offset()
+ : { top: 0, left: 0 },
+ screenPosition = (isWindow)
+ ? { top: 0, left: 0 }
+ : $boundary.offset(),
+ calculations = {},
+ scroll = (isWindow)
+ ? { top: $window.scrollTop(), left: $window.scrollLeft() }
+ : { top: 0, left: 0},
+ screen
+ ;
+ calculations = {
+ // element which is launching popup
+ target : {
+ element : $target[0],
+ width : $target.outerWidth(),
+ height : $target.outerHeight(),
+ top : targetOffset.top - parentOffset.top,
+ left : targetOffset.left - parentOffset.left,
+ margin : {}
+ },
+ // popup itself
+ popup : {
+ width : $popup.outerWidth(),
+ height : $popup.outerHeight()
+ },
+ // offset container (or 3d context)
+ parent : {
+ width : $offsetParent.outerWidth(),
+ height : $offsetParent.outerHeight()
+ },
+ // screen boundaries
+ screen : {
+ top : screenPosition.top,
+ left : screenPosition.left,
+ scroll: {
+ top : scroll.top,
+ left : scroll.left
+ },
+ width : $boundary.width(),
+ height : $boundary.height()
+ }
+ };
+
+ // if popup offset context is not same as target, then adjust calculations
+ if($popupOffsetParent.get(0) !== $offsetParent.get(0)) {
+ var
+ popupOffset = $popupOffsetParent.offset()
+ ;
+ calculations.target.top -= popupOffset.top;
+ calculations.target.left -= popupOffset.left;
+ calculations.parent.width = $popupOffsetParent.outerWidth();
+ calculations.parent.height = $popupOffsetParent.outerHeight();
+ }
+
+ // add in container calcs if fluid
+ if( settings.setFluidWidth && module.is.fluid() ) {
+ calculations.container = {
+ width: $popup.parent().outerWidth()
+ };
+ calculations.popup.width = calculations.container.width;
+ }
+
+ // add in margins if inline
+ calculations.target.margin.top = (settings.inline)
+ ? parseInt( window.getComputedStyle(targetElement).getPropertyValue('margin-top'), 10)
+ : 0
+ ;
+ calculations.target.margin.left = (settings.inline)
+ ? module.is.rtl()
+ ? parseInt( window.getComputedStyle(targetElement).getPropertyValue('margin-right'), 10)
+ : parseInt( window.getComputedStyle(targetElement).getPropertyValue('margin-left'), 10)
+ : 0
+ ;
+ // calculate screen boundaries
+ screen = calculations.screen;
+ calculations.boundary = {
+ top : screen.top + screen.scroll.top,
+ bottom : screen.top + screen.scroll.top + screen.height,
+ left : screen.left + screen.scroll.left,
+ right : screen.left + screen.scroll.left + screen.width
+ };
+ return calculations;
+ },
+ id: function() {
+ return id;
+ },
+ startEvent: function() {
+ if(settings.on == 'hover') {
+ return 'mouseenter';
+ }
+ else if(settings.on == 'focus') {
+ return 'focus';
+ }
+ return false;
+ },
+ scrollEvent: function() {
+ return 'scroll';
+ },
+ endEvent: function() {
+ if(settings.on == 'hover') {
+ return 'mouseleave';
+ }
+ else if(settings.on == 'focus') {
+ return 'blur';
+ }
+ return false;
+ },
+ distanceFromBoundary: function(offset, calculations) {
+ var
+ distanceFromBoundary = {},
+ popup,
+ boundary
+ ;
+ calculations = calculations || module.get.calculations();
+
+ // shorthand
+ popup = calculations.popup;
+ boundary = calculations.boundary;
+
+ if(offset) {
+ distanceFromBoundary = {
+ top : (offset.top - boundary.top),
+ left : (offset.left - boundary.left),
+ right : (boundary.right - (offset.left + popup.width) ),
+ bottom : (boundary.bottom - (offset.top + popup.height) )
+ };
+ module.verbose('Distance from boundaries determined', offset, distanceFromBoundary);
+ }
+ return distanceFromBoundary;
+ },
+ offsetParent: function($element) {
+ var
+ element = ($element !== undefined)
+ ? $element[0]
+ : $target[0],
+ parentNode = element.parentNode,
+ $node = $(parentNode)
+ ;
+ if(parentNode) {
+ var
+ is2D = ($node.css('transform') === 'none'),
+ isStatic = ($node.css('position') === 'static'),
+ isBody = $node.is('body')
+ ;
+ while(parentNode && !isBody && isStatic && is2D) {
+ parentNode = parentNode.parentNode;
+ $node = $(parentNode);
+ is2D = ($node.css('transform') === 'none');
+ isStatic = ($node.css('position') === 'static');
+ isBody = $node.is('body');
+ }
+ }
+ return ($node && $node.length > 0)
+ ? $node
+ : $()
+ ;
+ },
+ positions: function() {
+ return {
+ 'top left' : false,
+ 'top center' : false,
+ 'top right' : false,
+ 'bottom left' : false,
+ 'bottom center' : false,
+ 'bottom right' : false,
+ 'left center' : false,
+ 'right center' : false
+ };
+ },
+ nextPosition: function(position) {
+ var
+ positions = position.split(' '),
+ verticalPosition = positions[0],
+ horizontalPosition = positions[1],
+ opposite = {
+ top : 'bottom',
+ bottom : 'top',
+ left : 'right',
+ right : 'left'
+ },
+ adjacent = {
+ left : 'center',
+ center : 'right',
+ right : 'left'
+ },
+ backup = {
+ 'top left' : 'top center',
+ 'top center' : 'top right',
+ 'top right' : 'right center',
+ 'right center' : 'bottom right',
+ 'bottom right' : 'bottom center',
+ 'bottom center' : 'bottom left',
+ 'bottom left' : 'left center',
+ 'left center' : 'top left'
+ },
+ adjacentsAvailable = (verticalPosition == 'top' || verticalPosition == 'bottom'),
+ oppositeTried = false,
+ adjacentTried = false,
+ nextPosition = false
+ ;
+ if(!triedPositions) {
+ module.verbose('All available positions available');
+ triedPositions = module.get.positions();
+ }
+
+ module.debug('Recording last position tried', position);
+ triedPositions[position] = true;
+
+ if(settings.prefer === 'opposite') {
+ nextPosition = [opposite[verticalPosition], horizontalPosition];
+ nextPosition = nextPosition.join(' ');
+ oppositeTried = (triedPositions[nextPosition] === true);
+ module.debug('Trying opposite strategy', nextPosition);
+ }
+ if((settings.prefer === 'adjacent') && adjacentsAvailable ) {
+ nextPosition = [verticalPosition, adjacent[horizontalPosition]];
+ nextPosition = nextPosition.join(' ');
+ adjacentTried = (triedPositions[nextPosition] === true);
+ module.debug('Trying adjacent strategy', nextPosition);
+ }
+ if(adjacentTried || oppositeTried) {
+ module.debug('Using backup position', nextPosition);
+ nextPosition = backup[position];
+ }
+ return nextPosition;
+ }
+ },
+
+ set: {
+ position: function(position, calculations) {
+
+ // exit conditions
+ if($target.length === 0 || $popup.length === 0) {
+ module.error(error.notFound);
+ return;
+ }
+ var
+ offset,
+ distanceAway,
+ target,
+ popup,
+ parent,
+ positioning,
+ popupOffset,
+ distanceFromBoundary
+ ;
+
+ calculations = calculations || module.get.calculations();
+ position = position || $module.data(metadata.position) || settings.position;
+
+ offset = $module.data(metadata.offset) || settings.offset;
+ distanceAway = settings.distanceAway;
+
+ // shorthand
+ target = calculations.target;
+ popup = calculations.popup;
+ parent = calculations.parent;
+
+ if(module.should.centerArrow(calculations)) {
+ module.verbose('Adjusting offset to center arrow on small target element');
+ if(position == 'top left' || position == 'bottom left') {
+ offset += (target.width / 2);
+ offset -= settings.arrowPixelsFromEdge;
+ }
+ if(position == 'top right' || position == 'bottom right') {
+ offset -= (target.width / 2);
+ offset += settings.arrowPixelsFromEdge;
+ }
+ }
+
+ if(target.width === 0 && target.height === 0 && !module.is.svg(target.element)) {
+ module.debug('Popup target is hidden, no action taken');
+ return false;
+ }
+
+ if(settings.inline) {
+ module.debug('Adding margin to calculation', target.margin);
+ if(position == 'left center' || position == 'right center') {
+ offset += target.margin.top;
+ distanceAway += -target.margin.left;
+ }
+ else if (position == 'top left' || position == 'top center' || position == 'top right') {
+ offset += target.margin.left;
+ distanceAway -= target.margin.top;
+ }
+ else {
+ offset += target.margin.left;
+ distanceAway += target.margin.top;
+ }
+ }
+
+ module.debug('Determining popup position from calculations', position, calculations);
+
+ if (module.is.rtl()) {
+ position = position.replace(/left|right/g, function (match) {
+ return (match == 'left')
+ ? 'right'
+ : 'left'
+ ;
+ });
+ module.debug('RTL: Popup position updated', position);
+ }
+
+ // if last attempt use specified last resort position
+ if(searchDepth == settings.maxSearchDepth && typeof settings.lastResort === 'string') {
+ position = settings.lastResort;
+ }
+
+ switch (position) {
+ case 'top left':
+ positioning = {
+ top : 'auto',
+ bottom : parent.height - target.top + distanceAway,
+ left : target.left + offset,
+ right : 'auto'
+ };
+ break;
+ case 'top center':
+ positioning = {
+ bottom : parent.height - target.top + distanceAway,
+ left : target.left + (target.width / 2) - (popup.width / 2) + offset,
+ top : 'auto',
+ right : 'auto'
+ };
+ break;
+ case 'top right':
+ positioning = {
+ bottom : parent.height - target.top + distanceAway,
+ right : parent.width - target.left - target.width - offset,
+ top : 'auto',
+ left : 'auto'
+ };
+ break;
+ case 'left center':
+ positioning = {
+ top : target.top + (target.height / 2) - (popup.height / 2) + offset,
+ right : parent.width - target.left + distanceAway,
+ left : 'auto',
+ bottom : 'auto'
+ };
+ break;
+ case 'right center':
+ positioning = {
+ top : target.top + (target.height / 2) - (popup.height / 2) + offset,
+ left : target.left + target.width + distanceAway,
+ bottom : 'auto',
+ right : 'auto'
+ };
+ break;
+ case 'bottom left':
+ positioning = {
+ top : target.top + target.height + distanceAway,
+ left : target.left + offset,
+ bottom : 'auto',
+ right : 'auto'
+ };
+ break;
+ case 'bottom center':
+ positioning = {
+ top : target.top + target.height + distanceAway,
+ left : target.left + (target.width / 2) - (popup.width / 2) + offset,
+ bottom : 'auto',
+ right : 'auto'
+ };
+ break;
+ case 'bottom right':
+ positioning = {
+ top : target.top + target.height + distanceAway,
+ right : parent.width - target.left - target.width - offset,
+ left : 'auto',
+ bottom : 'auto'
+ };
+ break;
+ }
+ if(positioning === undefined) {
+ module.error(error.invalidPosition, position);
+ }
+
+ module.debug('Calculated popup positioning values', positioning);
+
+ // tentatively place on stage
+ $popup
+ .css(positioning)
+ .removeClass(className.position)
+ .addClass(position)
+ .addClass(className.loading)
+ ;
+
+ popupOffset = module.get.popupOffset();
+
+ // see if any boundaries are surpassed with this tentative position
+ distanceFromBoundary = module.get.distanceFromBoundary(popupOffset, calculations);
+
+ if(!settings.forcePosition && module.is.offstage(distanceFromBoundary, position) ) {
+ module.debug('Position is outside viewport', position);
+ if(searchDepth < settings.maxSearchDepth) {
+ searchDepth++;
+ position = module.get.nextPosition(position);
+ module.debug('Trying new position', position);
+ return ($popup)
+ ? module.set.position(position, calculations)
+ : false
+ ;
+ }
+ else {
+ if(settings.lastResort) {
+ module.debug('No position found, showing with last position');
+ }
+ else {
+ module.debug('Popup could not find a position to display', $popup);
+ module.error(error.cannotPlace, element);
+ module.remove.attempts();
+ module.remove.loading();
+ module.reset();
+ settings.onUnplaceable.call($popup, element);
+ return false;
+ }
+ }
+ }
+ module.debug('Position is on stage', position);
+ module.remove.attempts();
+ module.remove.loading();
+ if( settings.setFluidWidth && module.is.fluid() ) {
+ module.set.fluidWidth(calculations);
+ }
+ return true;
+ },
+
+ fluidWidth: function(calculations) {
+ calculations = calculations || module.get.calculations();
+ module.debug('Automatically setting element width to parent width', calculations.parent.width);
+ $popup.css('width', calculations.container.width);
+ },
+
+ variation: function(variation) {
+ variation = variation || module.get.variation();
+ if(variation && module.has.popup() ) {
+ module.verbose('Adding variation to popup', variation);
+ $popup.addClass(variation);
+ }
+ },
+
+ visible: function() {
+ $module.addClass(className.visible);
+ }
+ },
+
+ remove: {
+ loading: function() {
+ $popup.removeClass(className.loading);
+ },
+ variation: function(variation) {
+ variation = variation || module.get.variation();
+ if(variation) {
+ module.verbose('Removing variation', variation);
+ $popup.removeClass(variation);
+ }
+ },
+ visible: function() {
+ $module.removeClass(className.visible);
+ },
+ attempts: function() {
+ module.verbose('Resetting all searched positions');
+ searchDepth = 0;
+ triedPositions = false;
+ }
+ },
+
+ bind: {
+ events: function() {
+ module.debug('Binding popup events to module');
+ if(settings.on == 'click') {
+ $module
+ .on(clickEvent + eventNamespace, module.toggle)
+ ;
+ }
+ if(settings.on == 'hover') {
+ $module
+ .on('touchstart' + eventNamespace, module.event.touchstart)
+ ;
+ }
+ if( module.get.startEvent() ) {
+ $module
+ .on(module.get.startEvent() + eventNamespace, module.event.start)
+ .on(module.get.endEvent() + eventNamespace, module.event.end)
+ ;
+ }
+ if(settings.target) {
+ module.debug('Target set to element', $target);
+ }
+ $window.on('resize' + elementNamespace, module.event.resize);
+ },
+ popup: function() {
+ module.verbose('Allowing hover events on popup to prevent closing');
+ if( $popup && module.has.popup() ) {
+ $popup
+ .on('mouseenter' + eventNamespace, module.event.start)
+ .on('mouseleave' + eventNamespace, module.event.end)
+ ;
+ }
+ },
+ close: function() {
+ if(settings.hideOnScroll === true || (settings.hideOnScroll == 'auto' && settings.on != 'click')) {
+ module.bind.closeOnScroll();
+ }
+ if(module.is.closable()) {
+ module.bind.clickaway();
+ }
+ else if(settings.on == 'hover' && openedWithTouch) {
+ module.bind.touchClose();
+ }
+ },
+ closeOnScroll: function() {
+ module.verbose('Binding scroll close event to document');
+ $scrollContext
+ .one(module.get.scrollEvent() + elementNamespace, module.event.hideGracefully)
+ ;
+ },
+ touchClose: function() {
+ module.verbose('Binding popup touchclose event to document');
+ $document
+ .on('touchstart' + elementNamespace, function(event) {
+ module.verbose('Touched away from popup');
+ module.event.hideGracefully.call(element, event);
+ })
+ ;
+ },
+ clickaway: function() {
+ module.verbose('Binding popup close event to document');
+ $document
+ .on(clickEvent + elementNamespace, function(event) {
+ module.verbose('Clicked away from popup');
+ module.event.hideGracefully.call(element, event);
+ })
+ ;
+ }
+ },
+
+ unbind: {
+ events: function() {
+ $window
+ .off(elementNamespace)
+ ;
+ $module
+ .off(eventNamespace)
+ ;
+ },
+ close: function() {
+ $document
+ .off(elementNamespace)
+ ;
+ $scrollContext
+ .off(elementNamespace)
+ ;
+ },
+ },
+
+ has: {
+ popup: function() {
+ return ($popup && $popup.length > 0);
+ }
+ },
+
+ should: {
+ centerArrow: function(calculations) {
+ return !module.is.basic() && calculations.target.width <= (settings.arrowPixelsFromEdge * 2);
+ },
+ },
+
+ is: {
+ closable: function() {
+ if(settings.closable == 'auto') {
+ if(settings.on == 'hover') {
+ return false;
+ }
+ return true;
+ }
+ return settings.closable;
+ },
+ offstage: function(distanceFromBoundary, position) {
+ var
+ offstage = []
+ ;
+ // return boundaries that have been surpassed
+ $.each(distanceFromBoundary, function(direction, distance) {
+ if(distance < -settings.jitter) {
+ module.debug('Position exceeds allowable distance from edge', direction, distance, position);
+ offstage.push(direction);
+ }
+ });
+ if(offstage.length > 0) {
+ return true;
+ }
+ else {
+ return false;
+ }
+ },
+ svg: function(element) {
+ return module.supports.svg() && (element instanceof SVGGraphicsElement);
+ },
+ basic: function() {
+ return $module.hasClass(className.basic);
+ },
+ active: function() {
+ return $module.hasClass(className.active);
+ },
+ animating: function() {
+ return ($popup !== undefined && $popup.hasClass(className.animating) );
+ },
+ fluid: function() {
+ return ($popup !== undefined && $popup.hasClass(className.fluid));
+ },
+ visible: function() {
+ return ($popup !== undefined && $popup.hasClass(className.popupVisible));
+ },
+ dropdown: function() {
+ return $module.hasClass(className.dropdown);
+ },
+ hidden: function() {
+ return !module.is.visible();
+ },
+ rtl: function () {
+ return $module.attr('dir') === 'rtl' || $module.css('direction') === 'rtl';
+ }
+ },
+
+ reset: function() {
+ module.remove.visible();
+ if(settings.preserve) {
+ if($.fn.transition !== undefined) {
+ $popup
+ .transition('remove transition')
+ ;
+ }
+ }
+ else {
+ module.removePopup();
+ }
+ },
+
+ setting: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ settings[name] = value;
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ }
+ })
+ ;
+
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.fn.popup.settings = {
+
+ name : 'Popup',
+
+ // module settings
+ silent : false,
+ debug : false,
+ verbose : false,
+ performance : true,
+ namespace : 'popup',
+
+ // whether it should use dom mutation observers
+ observeChanges : true,
+
+ // callback only when element added to dom
+ onCreate : function(){},
+
+ // callback before element removed from dom
+ onRemove : function(){},
+
+ // callback before show animation
+ onShow : function(){},
+
+ // callback after show animation
+ onVisible : function(){},
+
+ // callback before hide animation
+ onHide : function(){},
+
+ // callback when popup cannot be positioned in visible screen
+ onUnplaceable : function(){},
+
+ // callback after hide animation
+ onHidden : function(){},
+
+ // when to show popup
+ on : 'hover',
+
+ // element to use to determine if popup is out of boundary
+ boundary : window,
+
+ // whether to add touchstart events when using hover
+ addTouchEvents : true,
+
+ // default position relative to element
+ position : 'top left',
+
+ // if given position should be used regardless if popup fits
+ forcePosition : false,
+
+ // name of variation to use
+ variation : '',
+
+ // whether popup should be moved to context
+ movePopup : true,
+
+ // element which popup should be relative to
+ target : false,
+
+ // jq selector or element that should be used as popup
+ popup : false,
+
+ // popup should remain inline next to activator
+ inline : false,
+
+ // popup should be removed from page on hide
+ preserve : false,
+
+ // popup should not close when being hovered on
+ hoverable : false,
+
+ // explicitly set content
+ content : false,
+
+ // explicitly set html
+ html : false,
+
+ // explicitly set title
+ title : false,
+
+ // whether automatically close on clickaway when on click
+ closable : true,
+
+ // automatically hide on scroll
+ hideOnScroll : 'auto',
+
+ // hide other popups on show
+ exclusive : false,
+
+ // context to attach popups
+ context : 'body',
+
+ // context for binding scroll events
+ scrollContext : window,
+
+ // position to prefer when calculating new position
+ prefer : 'opposite',
+
+ // specify position to appear even if it doesn't fit
+ lastResort : false,
+
+ // number of pixels from edge of popup to pointing arrow center (used from centering)
+ arrowPixelsFromEdge: 20,
+
+ // delay used to prevent accidental refiring of animations due to user error
+ delay : {
+ show : 50,
+ hide : 70
+ },
+
+ // whether fluid variation should assign width explicitly
+ setFluidWidth : true,
+
+ // transition settings
+ duration : 200,
+ transition : 'scale',
+
+ // distance away from activating element in px
+ distanceAway : 0,
+
+ // number of pixels an element is allowed to be "offstage" for a position to be chosen (allows for rounding)
+ jitter : 2,
+
+ // offset on aligning axis from calculated position
+ offset : 0,
+
+ // maximum times to look for a position before failing (9 positions total)
+ maxSearchDepth : 15,
+
+ error: {
+ invalidPosition : 'The position you specified is not a valid position',
+ cannotPlace : 'Popup does not fit within the boundaries of the viewport',
+ method : 'The method you called is not defined.',
+ noTransition : 'This module requires ui transitions ',
+ notFound : 'The target or popup you specified does not exist on the page'
+ },
+
+ metadata: {
+ activator : 'activator',
+ content : 'content',
+ html : 'html',
+ offset : 'offset',
+ position : 'position',
+ title : 'title',
+ variation : 'variation'
+ },
+
+ className : {
+ active : 'active',
+ basic : 'basic',
+ animating : 'animating',
+ dropdown : 'dropdown',
+ fluid : 'fluid',
+ loading : 'loading',
+ popup : 'ui popup',
+ position : 'top left center bottom right',
+ visible : 'visible',
+ popupVisible : 'visible'
+ },
+
+ selector : {
+ popup : '.ui.popup'
+ },
+
+ templates: {
+ escape: function(string) {
+ var
+ badChars = /[<>"'`]/g,
+ shouldEscape = /[&<>"'`]/,
+ escape = {
+ "<": "<",
+ ">": ">",
+ '"': """,
+ "'": "'",
+ "`": "`"
+ },
+ escapedChar = function(chr) {
+ return escape[chr];
+ }
+ ;
+ if(shouldEscape.test(string)) {
+ string = string.replace(/&(?![a-z0-9#]{1,6};)/, "&");
+ return string.replace(badChars, escapedChar);
+ }
+ return string;
+ },
+ popup: function(text) {
+ var
+ html = '',
+ escape = $.fn.popup.settings.templates.escape
+ ;
+ if(typeof text !== undefined) {
+ if(typeof text.title !== undefined && text.title) {
+ text.title = escape(text.title);
+ html += '';
+ }
+ if(typeof text.content !== undefined && text.content) {
+ text.content = escape(text.content);
+ html += '' + text.content + '
';
+ }
+ }
+ return html;
+ }
+ }
+
+};
+
+
+})( jQuery, window, document );
+
+/*!
+ * # Fomantic-UI 2.8.8 - Progress
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+'use strict';
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.progress = function(parameters) {
+ var
+ $allModules = $(this),
+
+ moduleSelector = $allModules.selector || '',
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+
+ returnedValue
+ ;
+
+ $allModules
+ .each(function() {
+ var
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.fn.progress.settings, parameters)
+ : $.extend({}, $.fn.progress.settings),
+
+ className = settings.className,
+ metadata = settings.metadata,
+ namespace = settings.namespace,
+ selector = settings.selector,
+ error = settings.error,
+
+ eventNamespace = '.' + namespace,
+ moduleNamespace = 'module-' + namespace,
+
+ $module = $(this),
+ $bars = $(this).find(selector.bar),
+ $progresses = $(this).find(selector.progress),
+ $label = $(this).find(selector.label),
+
+ element = this,
+ instance = $module.data(moduleNamespace),
+
+ animating = false,
+ transitionEnd,
+ module
+ ;
+ module = {
+ helper: {
+ sum: function (nums) {
+ return Array.isArray(nums) ? nums.reduce(function (left, right) {
+ return left + Number(right);
+ }, 0) : 0;
+ },
+ /**
+ * Derive precision for multiple progress with total and values.
+ *
+ * This helper dervices a precision that is sufficiently large to show minimum value of multiple progress.
+ *
+ * Example1
+ * - total: 1122
+ * - values: [325, 111, 74, 612]
+ * - min ratio: 74/1122 = 0.0659...
+ * - required precision: 100
+ *
+ * Example2
+ * - total: 10541
+ * - values: [3235, 1111, 74, 6121]
+ * - min ratio: 74/10541 = 0.0070...
+ * - required precision: 1000
+ *
+ * @param min A minimum value within multiple values
+ * @param total A total amount of multiple values
+ * @returns {number} A precison. Could be 1, 10, 100, ... 1e+10.
+ */
+ derivePrecision: function(min, total) {
+ var precisionPower = 0
+ var precision = 1;
+ var ratio = min / total;
+ while (precisionPower < 10) {
+ ratio = ratio * precision;
+ if (ratio > 1) {
+ break;
+ }
+ precision = Math.pow(10, precisionPower++);
+ }
+ return precision;
+ },
+ forceArray: function (element) {
+ return Array.isArray(element)
+ ? element
+ : !isNaN(element)
+ ? [element]
+ : typeof element == 'string'
+ ? element.split(',')
+ : []
+ ;
+ }
+ },
+
+ initialize: function() {
+ module.set.duration();
+ module.set.transitionEvent();
+ module.debug(element);
+
+ module.read.metadata();
+ module.read.settings();
+
+ module.instantiate();
+ },
+
+ instantiate: function() {
+ module.verbose('Storing instance of progress', module);
+ instance = module;
+ $module
+ .data(moduleNamespace, module)
+ ;
+ },
+ destroy: function() {
+ module.verbose('Destroying previous progress for', $module);
+ clearInterval(instance.interval);
+ module.remove.state();
+ $module.removeData(moduleNamespace);
+ instance = undefined;
+ },
+
+ reset: function() {
+ module.remove.nextValue();
+ module.update.progress(0);
+ },
+
+ complete: function(keepState) {
+ if(module.percent === undefined || module.percent < 100) {
+ module.remove.progressPoll();
+ if(keepState !== true){
+ module.set.percent(100);
+ }
+ }
+ },
+
+ read: {
+ metadata: function() {
+ var
+ data = {
+ percent : module.helper.forceArray($module.data(metadata.percent)),
+ total : $module.data(metadata.total),
+ value : module.helper.forceArray($module.data(metadata.value))
+ }
+ ;
+ if(data.total !== undefined) {
+ module.debug('Total value set from metadata', data.total);
+ module.set.total(data.total);
+ }
+ if(data.value.length > 0) {
+ module.debug('Current value set from metadata', data.value);
+ module.set.value(data.value);
+ module.set.progress(data.value);
+ }
+ if(data.percent.length > 0) {
+ module.debug('Current percent value set from metadata', data.percent);
+ module.set.percent(data.percent);
+ }
+ },
+ settings: function() {
+ if(settings.total !== false) {
+ module.debug('Current total set in settings', settings.total);
+ module.set.total(settings.total);
+ }
+ if(settings.value !== false) {
+ module.debug('Current value set in settings', settings.value);
+ module.set.value(settings.value);
+ module.set.progress(module.value);
+ }
+ if(settings.percent !== false) {
+ module.debug('Current percent set in settings', settings.percent);
+ module.set.percent(settings.percent);
+ }
+ }
+ },
+
+ bind: {
+ transitionEnd: function(callback) {
+ var
+ transitionEnd = module.get.transitionEnd()
+ ;
+ $bars
+ .one(transitionEnd + eventNamespace, function(event) {
+ clearTimeout(module.failSafeTimer);
+ callback.call(this, event);
+ })
+ ;
+ module.failSafeTimer = setTimeout(function() {
+ $bars.triggerHandler(transitionEnd);
+ }, settings.duration + settings.failSafeDelay);
+ module.verbose('Adding fail safe timer', module.timer);
+ }
+ },
+
+ increment: function(incrementValue) {
+ var
+ startValue,
+ newValue
+ ;
+ if( module.has.total() ) {
+ startValue = module.get.value();
+ incrementValue = incrementValue || 1;
+ }
+ else {
+ startValue = module.get.percent();
+ incrementValue = incrementValue || module.get.randomValue();
+ }
+ newValue = startValue + incrementValue;
+ module.debug('Incrementing percentage by', startValue, newValue, incrementValue);
+ newValue = module.get.normalizedValue(newValue);
+ module.set.progress(newValue);
+ },
+ decrement: function(decrementValue) {
+ var
+ total = module.get.total(),
+ startValue,
+ newValue
+ ;
+ if(total) {
+ startValue = module.get.value();
+ decrementValue = decrementValue || 1;
+ newValue = startValue - decrementValue;
+ module.debug('Decrementing value by', decrementValue, startValue);
+ }
+ else {
+ startValue = module.get.percent();
+ decrementValue = decrementValue || module.get.randomValue();
+ newValue = startValue - decrementValue;
+ module.debug('Decrementing percentage by', decrementValue, startValue);
+ }
+ newValue = module.get.normalizedValue(newValue);
+ module.set.progress(newValue);
+ },
+
+ has: {
+ progressPoll: function() {
+ return module.progressPoll;
+ },
+ total: function() {
+ return (module.get.total() !== false);
+ }
+ },
+
+ get: {
+ text: function(templateText, index) {
+ var
+ index_ = index || 0,
+ value = module.get.value(index_),
+ total = module.get.total(),
+ percent = (animating)
+ ? module.get.displayPercent(index_)
+ : module.get.percent(index_),
+ left = (total !== false)
+ ? Math.max(0,total - value)
+ : (100 - percent)
+ ;
+ templateText = templateText || '';
+ templateText = templateText
+ .replace('{value}', value)
+ .replace('{total}', total || 0)
+ .replace('{left}', left)
+ .replace('{percent}', percent)
+ .replace('{bar}', settings.text.bars[index_] || '')
+ ;
+ module.verbose('Adding variables to progress bar text', templateText);
+ return templateText;
+ },
+
+ normalizedValue: function(value) {
+ if(value < 0) {
+ module.debug('Value cannot decrement below 0');
+ return 0;
+ }
+ if(module.has.total()) {
+ if(value > module.total) {
+ module.debug('Value cannot increment above total', module.total);
+ return module.total;
+ }
+ }
+ else if(value > 100 ) {
+ module.debug('Value cannot increment above 100 percent');
+ return 100;
+ }
+ return value;
+ },
+
+ updateInterval: function() {
+ if(settings.updateInterval == 'auto') {
+ return settings.duration;
+ }
+ return settings.updateInterval;
+ },
+
+ randomValue: function() {
+ module.debug('Generating random increment percentage');
+ return Math.floor((Math.random() * settings.random.max) + settings.random.min);
+ },
+
+ numericValue: function(value) {
+ return (typeof value === 'string')
+ ? (value.replace(/[^\d.]/g, '') !== '')
+ ? +(value.replace(/[^\d.]/g, ''))
+ : false
+ : value
+ ;
+ },
+
+ transitionEnd: function() {
+ var
+ element = document.createElement('element'),
+ transitions = {
+ 'transition' :'transitionend',
+ 'OTransition' :'oTransitionEnd',
+ 'MozTransition' :'transitionend',
+ 'WebkitTransition' :'webkitTransitionEnd'
+ },
+ transition
+ ;
+ for(transition in transitions){
+ if( element.style[transition] !== undefined ){
+ return transitions[transition];
+ }
+ }
+ },
+
+ // gets current displayed percentage (if animating values this is the intermediary value)
+ displayPercent: function(index) {
+ var
+ $bar = $($bars[index]),
+ barWidth = $bar.width(),
+ totalWidth = $module.width(),
+ minDisplay = parseInt($bar.css('min-width'), 10),
+ displayPercent = (barWidth > minDisplay)
+ ? (barWidth / totalWidth * 100)
+ : module.percent
+ ;
+ return (settings.precision > 0)
+ ? Math.round(displayPercent * (10 * settings.precision)) / (10 * settings.precision)
+ : Math.round(displayPercent)
+ ;
+ },
+
+ percent: function(index) {
+ return module.percent && module.percent[index || 0] || 0;
+ },
+ value: function(index) {
+ return module.nextValue || module.value && module.value[index || 0] || 0;
+ },
+ total: function() {
+ return module.total !== undefined ? module.total : false;
+ }
+ },
+
+ create: {
+ progressPoll: function() {
+ module.progressPoll = setTimeout(function() {
+ module.update.toNextValue();
+ module.remove.progressPoll();
+ }, module.get.updateInterval());
+ },
+ },
+
+ is: {
+ complete: function() {
+ return module.is.success() || module.is.warning() || module.is.error();
+ },
+ success: function() {
+ return $module.hasClass(className.success);
+ },
+ warning: function() {
+ return $module.hasClass(className.warning);
+ },
+ error: function() {
+ return $module.hasClass(className.error);
+ },
+ active: function() {
+ return $module.hasClass(className.active);
+ },
+ visible: function() {
+ return $module.is(':visible');
+ }
+ },
+
+ remove: {
+ progressPoll: function() {
+ module.verbose('Removing progress poll timer');
+ if(module.progressPoll) {
+ clearTimeout(module.progressPoll);
+ delete module.progressPoll;
+ }
+ },
+ nextValue: function() {
+ module.verbose('Removing progress value stored for next update');
+ delete module.nextValue;
+ },
+ state: function() {
+ module.verbose('Removing stored state');
+ delete module.total;
+ delete module.percent;
+ delete module.value;
+ },
+ active: function() {
+ module.verbose('Removing active state');
+ $module.removeClass(className.active);
+ },
+ success: function() {
+ module.verbose('Removing success state');
+ $module.removeClass(className.success);
+ },
+ warning: function() {
+ module.verbose('Removing warning state');
+ $module.removeClass(className.warning);
+ },
+ error: function() {
+ module.verbose('Removing error state');
+ $module.removeClass(className.error);
+ }
+ },
+
+ set: {
+ barWidth: function(values) {
+ module.debug("set bar width with ", values);
+ values = module.helper.forceArray(values);
+ var firstNonZeroIndex = -1;
+ var lastNonZeroIndex = -1;
+ var valuesSum = module.helper.sum(values);
+ var barCounts = $bars.length;
+ var isMultiple = barCounts > 1;
+ var percents = values.map(function(value, index) {
+ var allZero = (index === barCounts - 1 && valuesSum === 0);
+ var $bar = $($bars[index]);
+ if (value === 0 && isMultiple && !allZero) {
+ $bar.css('display', 'none');
+ } else {
+ if (isMultiple && allZero) {
+ $bar.css('background', 'transparent');
+ }
+ if (firstNonZeroIndex == -1) {
+ firstNonZeroIndex = index;
+ }
+ lastNonZeroIndex = index;
+ $bar.css({
+ display: 'block',
+ width: value + '%'
+ });
+ }
+ return parseFloat(value);
+ });
+ values.forEach(function(_, index) {
+ var $bar = $($bars[index]);
+ $bar.css({
+ borderTopLeftRadius: index == firstNonZeroIndex ? '' : 0,
+ borderBottomLeftRadius: index == firstNonZeroIndex ? '' : 0,
+ borderTopRightRadius: index == lastNonZeroIndex ? '' : 0,
+ borderBottomRightRadius: index == lastNonZeroIndex ? '' : 0
+ });
+ });
+ $module
+ .attr('data-percent', percents)
+ ;
+ },
+ duration: function(duration) {
+ duration = duration || settings.duration;
+ duration = (typeof duration == 'number')
+ ? duration + 'ms'
+ : duration
+ ;
+ module.verbose('Setting progress bar transition duration', duration);
+ $bars
+ .css({
+ 'transition-duration': duration
+ })
+ ;
+ },
+ percent: function(percents) {
+ percents = module.helper.forceArray(percents).map(function(percent) {
+ percent = (typeof percent == 'string')
+ ? +(percent.replace('%', ''))
+ : percent
+ ;
+ return (settings.limitValues)
+ ? Math.max(0, Math.min(100, percent))
+ : percent
+ ;
+ });
+ var hasTotal = module.has.total();
+ var totalPercent = module.helper.sum(percents);
+ var isMultipleValues = percents.length > 1 && hasTotal;
+ var sumTotal = module.helper.sum(module.helper.forceArray(module.value));
+ if (isMultipleValues && sumTotal > module.total) {
+ // Sum values instead of pecents to avoid precision issues when summing floats
+ module.error(error.sumExceedsTotal, sumTotal, module.total);
+ } else if (!isMultipleValues && totalPercent > 100) {
+ // Sum before rounding since sum of rounded may have error though sum of actual is fine
+ module.error(error.tooHigh, totalPercent);
+ } else if (totalPercent < 0) {
+ module.error(error.tooLow, totalPercent);
+ } else {
+ var autoPrecision = settings.precision > 0
+ ? settings.precision
+ : isMultipleValues
+ ? module.helper.derivePrecision(Math.min.apply(null, module.value), module.total)
+ : 0;
+
+ // round display percentage
+ var roundedPercents = percents.map(function (percent) {
+ return (autoPrecision > 0)
+ ? Math.round(percent * (10 * autoPrecision)) / (10 * autoPrecision)
+ : Math.round(percent)
+ ;
+ });
+ module.percent = roundedPercents;
+ if (hasTotal) {
+ module.value = percents.map(function (percent) {
+ return (autoPrecision > 0)
+ ? Math.round((percent / 100) * module.total * (10 * autoPrecision)) / (10 * autoPrecision)
+ : Math.round((percent / 100) * module.total * 10) / 10
+ ;
+ });
+ }
+ module.set.barWidth(percents);
+ module.set.labelInterval();
+ }
+ settings.onChange.call(element, percents, module.value, module.total);
+ },
+ labelInterval: function() {
+ var
+ animationCallback = function() {
+ module.verbose('Bar finished animating, removing continuous label updates');
+ clearInterval(module.interval);
+ animating = false;
+ module.set.labels();
+ }
+ ;
+ clearInterval(module.interval);
+ module.bind.transitionEnd(animationCallback);
+ animating = true;
+ module.interval = setInterval(function() {
+ var
+ isInDOM = $.contains(document.documentElement, element)
+ ;
+ if(!isInDOM) {
+ clearInterval(module.interval);
+ animating = false;
+ }
+ module.set.labels();
+ }, settings.framerate);
+ },
+ labels: function() {
+ module.verbose('Setting both bar progress and outer label text');
+ module.set.barLabel();
+ module.set.state();
+ },
+ label: function(text) {
+ text = text || '';
+ if(text) {
+ text = module.get.text(text);
+ module.verbose('Setting label to text', text);
+ $label.text(text);
+ }
+ },
+ state: function(percent) {
+ percent = (percent !== undefined)
+ ? percent
+ : module.helper.sum(module.percent)
+ ;
+ if(percent === 100) {
+ if(settings.autoSuccess && $bars.length === 1 && !(module.is.warning() || module.is.error() || module.is.success())) {
+ module.set.success();
+ module.debug('Automatically triggering success at 100%');
+ }
+ else {
+ module.verbose('Reached 100% removing active state');
+ module.remove.active();
+ module.remove.progressPoll();
+ }
+ }
+ else if(percent > 0) {
+ module.verbose('Adjusting active progress bar label', percent);
+ module.set.active();
+ }
+ else {
+ module.remove.active();
+ module.set.label(settings.text.active);
+ }
+ },
+ barLabel: function(text) {
+ $progresses.map(function(index, element){
+ var $progress = $(element);
+ if (text !== undefined) {
+ $progress.text( module.get.text(text, index) );
+ }
+ else if (settings.label == 'ratio' && module.has.total()) {
+ module.verbose('Adding ratio to bar label');
+ $progress.text( module.get.text(settings.text.ratio, index) );
+ }
+ else if (settings.label == 'percent') {
+ module.verbose('Adding percentage to bar label');
+ $progress.text( module.get.text(settings.text.percent, index) );
+ }
+ });
+ },
+ active: function(text) {
+ text = text || settings.text.active;
+ module.debug('Setting active state');
+ if(settings.showActivity && !module.is.active() ) {
+ $module.addClass(className.active);
+ }
+ module.remove.warning();
+ module.remove.error();
+ module.remove.success();
+ text = settings.onLabelUpdate('active', text, module.value, module.total);
+ if(text) {
+ module.set.label(text);
+ }
+ module.bind.transitionEnd(function() {
+ settings.onActive.call(element, module.value, module.total);
+ });
+ },
+ success : function(text, keepState) {
+ text = text || settings.text.success || settings.text.active;
+ module.debug('Setting success state');
+ $module.addClass(className.success);
+ module.remove.active();
+ module.remove.warning();
+ module.remove.error();
+ module.complete(keepState);
+ if(settings.text.success) {
+ text = settings.onLabelUpdate('success', text, module.value, module.total);
+ module.set.label(text);
+ }
+ else {
+ text = settings.onLabelUpdate('active', text, module.value, module.total);
+ module.set.label(text);
+ }
+ module.bind.transitionEnd(function() {
+ settings.onSuccess.call(element, module.total);
+ });
+ },
+ warning : function(text, keepState) {
+ text = text || settings.text.warning;
+ module.debug('Setting warning state');
+ $module.addClass(className.warning);
+ module.remove.active();
+ module.remove.success();
+ module.remove.error();
+ module.complete(keepState);
+ text = settings.onLabelUpdate('warning', text, module.value, module.total);
+ if(text) {
+ module.set.label(text);
+ }
+ module.bind.transitionEnd(function() {
+ settings.onWarning.call(element, module.value, module.total);
+ });
+ },
+ error : function(text, keepState) {
+ text = text || settings.text.error;
+ module.debug('Setting error state');
+ $module.addClass(className.error);
+ module.remove.active();
+ module.remove.success();
+ module.remove.warning();
+ module.complete(keepState);
+ text = settings.onLabelUpdate('error', text, module.value, module.total);
+ if(text) {
+ module.set.label(text);
+ }
+ module.bind.transitionEnd(function() {
+ settings.onError.call(element, module.value, module.total);
+ });
+ },
+ transitionEvent: function() {
+ transitionEnd = module.get.transitionEnd();
+ },
+ total: function(totalValue) {
+ module.total = totalValue;
+ },
+ value: function(value) {
+ module.value = module.helper.forceArray(value);
+ },
+ progress: function(value) {
+ if(!module.has.progressPoll()) {
+ module.debug('First update in progress update interval, immediately updating', value);
+ module.update.progress(value);
+ module.create.progressPoll();
+ }
+ else {
+ module.debug('Updated within interval, setting next update to use new value', value);
+ module.set.nextValue(value);
+ }
+ },
+ nextValue: function(value) {
+ module.nextValue = value;
+ }
+ },
+
+ update: {
+ toNextValue: function() {
+ var
+ nextValue = module.nextValue
+ ;
+ if(nextValue) {
+ module.debug('Update interval complete using last updated value', nextValue);
+ module.update.progress(nextValue);
+ module.remove.nextValue();
+ }
+ },
+ progress: function(values) {
+ var hasTotal = module.has.total();
+ if (hasTotal) {
+ module.set.value(values);
+ }
+ var percentCompletes = module.helper.forceArray(values).map(function(value) {
+ var
+ percentComplete
+ ;
+ value = module.get.numericValue(value);
+ if (value === false) {
+ module.error(error.nonNumeric, value);
+ }
+ value = module.get.normalizedValue(value);
+ if (hasTotal) {
+ percentComplete = module.total > 0 ? (value / module.total) * 100 : 100;
+ module.debug('Calculating percent complete from total', percentComplete);
+ }
+ else {
+ percentComplete = value;
+ module.debug('Setting value to exact percentage value', percentComplete);
+ }
+ return percentComplete;
+ });
+ module.set.percent( percentCompletes );
+ }
+ },
+
+ setting: function(name, value) {
+ module.debug('Changing setting', name, value);
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ if($.isPlainObject(settings[name])) {
+ $.extend(true, settings[name], value);
+ }
+ else {
+ settings[name] = value;
+ }
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ module.error(error.method, query);
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ }
+ })
+ ;
+
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.fn.progress.settings = {
+
+ name : 'Progress',
+ namespace : 'progress',
+
+ silent : false,
+ debug : false,
+ verbose : false,
+ performance : true,
+
+ random : {
+ min : 2,
+ max : 5
+ },
+
+ duration : 300,
+
+ updateInterval : 'auto',
+
+ autoSuccess : true,
+ showActivity : true,
+ limitValues : true,
+
+ label : 'percent',
+ precision : 0,
+ framerate : (1000 / 30), /// 30 fps
+
+ percent : false,
+ total : false,
+ value : false,
+
+ // delay in ms for fail safe animation callback
+ failSafeDelay : 100,
+
+ onLabelUpdate : function(state, text, value, total){
+ return text;
+ },
+ onChange : function(percent, value, total){},
+ onSuccess : function(total){},
+ onActive : function(value, total){},
+ onError : function(value, total){},
+ onWarning : function(value, total){},
+
+ error : {
+ method : 'The method you called is not defined.',
+ nonNumeric : 'Progress value is non numeric',
+ tooHigh : 'Value specified is above 100%',
+ tooLow : 'Value specified is below 0%',
+ sumExceedsTotal : 'Sum of multple values exceed total',
+ },
+
+ regExp: {
+ variable: /\{\$*[A-z0-9]+\}/g
+ },
+
+ metadata: {
+ percent : 'percent',
+ total : 'total',
+ value : 'value'
+ },
+
+ selector : {
+ bar : '> .bar',
+ label : '> .label',
+ progress : '.bar > .progress'
+ },
+
+ text : {
+ active : false,
+ error : false,
+ success : false,
+ warning : false,
+ percent : '{percent}%',
+ ratio : '{value} of {total}',
+ bars : ['']
+ },
+
+ className : {
+ active : 'active',
+ error : 'error',
+ success : 'success',
+ warning : 'warning'
+ }
+
+};
+
+
+})( jQuery, window, document );
+
+/*!
+ * # Fomantic-UI 2.8.8 - Slider
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ( $, window, document, undefined ) {
+
+"use strict";
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.slider = function(parameters) {
+
+ var
+ $allModules = $(this),
+ $window = $(window),
+
+ moduleSelector = $allModules.selector || '',
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+
+ alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'],
+
+ SINGLE_STEP = 1,
+ BIG_STEP = 2,
+ NO_STEP = 0,
+ SINGLE_BACKSTEP = -1,
+ BIG_BACKSTEP = -2,
+
+ // Used to manage document bound events.
+ // Use this so that we can distinguish between which document events are bound to which range.
+ currentRange = 0,
+
+ returnedValue
+ ;
+
+ $allModules
+ .each(function() {
+
+ var
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.fn.slider.settings, parameters)
+ : $.extend({}, $.fn.slider.settings),
+
+ className = settings.className,
+ metadata = settings.metadata,
+ namespace = settings.namespace,
+ error = settings.error,
+ keys = settings.keys,
+ interpretLabel = settings.interpretLabel,
+
+ isHover = false,
+ eventNamespace = '.' + namespace,
+ moduleNamespace = 'module-' + namespace,
+
+ $module = $(this),
+ $currThumb,
+ $thumb,
+ $secondThumb,
+ $track,
+ $trackFill,
+ $labels,
+
+ element = this,
+ instance = $module.data(moduleNamespace),
+
+ documentEventID,
+
+ value,
+ position,
+ secondPos,
+ offset,
+ precision,
+ isTouch,
+ gapRatio = 1,
+ previousValue,
+
+ initialPosition,
+ initialLoad,
+ module
+ ;
+
+ module = {
+
+ initialize: function() {
+ module.debug('Initializing slider', settings);
+ initialLoad = true;
+
+ currentRange += 1;
+ documentEventID = currentRange;
+
+ isTouch = module.setup.testOutTouch();
+ module.setup.layout();
+ module.setup.labels();
+
+ if(!module.is.disabled()) {
+ module.bind.events();
+ }
+
+ module.read.metadata();
+ module.read.settings();
+
+ initialLoad = false;
+ module.instantiate();
+ },
+
+ instantiate: function() {
+ module.verbose('Storing instance of slider', module);
+ instance = module;
+ $module
+ .data(moduleNamespace, module)
+ ;
+ },
+
+ destroy: function() {
+ module.verbose('Destroying previous slider for', $module);
+ clearInterval(instance.interval);
+ module.unbind.events();
+ module.unbind.slidingEvents();
+ $module.removeData(moduleNamespace);
+ instance = undefined;
+ },
+
+ setup: {
+ layout: function() {
+ if( $module.attr('tabindex') === undefined) {
+ $module.attr('tabindex', 0);
+ }
+ if($module.find('.inner').length == 0) {
+ $module.append(""
+ + "
"
+ + "
"
+ + "
"
+ + "
");
+ }
+ precision = module.get.precision();
+ $thumb = $module.find('.thumb:not(.second)');
+ $currThumb = $thumb;
+ if(module.is.range()) {
+ if($module.find('.thumb.second').length == 0) {
+ $module.find('.inner').append("
");
+ }
+ $secondThumb = $module.find('.thumb.second');
+ }
+ $track = $module.find('.track');
+ $trackFill = $module.find('.track-fill');
+ offset = $thumb.width() / 2;
+ },
+ labels: function() {
+ if(module.is.labeled()) {
+ $labels = $module.find('.labels:not(.auto)');
+ if($labels.length != 0) {
+ module.setup.customLabel();
+ } else {
+ module.setup.autoLabel();
+ }
+
+ if (settings.showLabelTicks) {
+ $module.addClass(className.ticked)
+ }
+ }
+ },
+ testOutTouch: function() {
+ try {
+ document.createEvent('TouchEvent');
+ return true;
+ } catch (e) {
+ return false;
+ }
+ },
+ customLabel: function() {
+ var
+ $children = $labels.find('.label'),
+ numChildren = $children.length,
+ min = module.get.min(),
+ max = module.get.max(),
+ ratio
+ ;
+ $children.each(function(index) {
+ var
+ $child = $(this),
+ attrValue = $child.attr('data-value')
+ ;
+ if(attrValue) {
+ attrValue = attrValue > max ? max : attrValue < min ? min : attrValue;
+ ratio = (attrValue - min) / (max - min);
+ } else {
+ ratio = (index + 1) / (numChildren + 1);
+ }
+ module.update.labelPosition(ratio, $(this));
+ });
+ },
+ autoLabel: function() {
+ $labels = $module.find('.labels');
+ if($labels.length != 0) {
+ $labels.empty();
+ }
+ else {
+ $labels = $module.append('').find('.labels');
+ }
+ for(var i = 0, len = module.get.numLabels(); i <= len; i++) {
+ var
+ labelText = module.get.label(i),
+ $label = (labelText !== "")
+ ? !(i % module.get.gapRatio())
+ ? $('' + labelText + ' ')
+ : $(' ')
+ : null,
+ ratio = i / len
+ ;
+ if($label) {
+ module.update.labelPosition(ratio, $label);
+ $labels.append($label);
+ }
+ }
+ }
+ },
+
+ bind: {
+ events: function() {
+ module.bind.globalKeyboardEvents();
+ module.bind.keyboardEvents();
+ module.bind.mouseEvents();
+ if(module.is.touch()) {
+ module.bind.touchEvents();
+ }
+ if (settings.autoAdjustLabels) {
+ module.bind.windowEvents();
+ }
+ },
+ keyboardEvents: function() {
+ module.verbose('Binding keyboard events');
+ $module.on('keydown' + eventNamespace, module.event.keydown);
+ },
+ globalKeyboardEvents: function() {
+ $(document).on('keydown' + eventNamespace + documentEventID, module.event.activateFocus);
+ },
+ mouseEvents: function() {
+ module.verbose('Binding mouse events');
+ $module.find('.track, .thumb, .inner').on('mousedown' + eventNamespace, function(event) {
+ event.stopImmediatePropagation();
+ event.preventDefault();
+ module.event.down(event);
+ });
+ $module.on('mousedown' + eventNamespace, module.event.down);
+ $module.on('mouseenter' + eventNamespace, function(event) {
+ isHover = true;
+ });
+ $module.on('mouseleave' + eventNamespace, function(event) {
+ isHover = false;
+ });
+ },
+ touchEvents: function() {
+ module.verbose('Binding touch events');
+ $module.find('.track, .thumb, .inner').on('touchstart' + eventNamespace, function(event) {
+ event.stopImmediatePropagation();
+ event.preventDefault();
+ module.event.down(event);
+ });
+ $module.on('touchstart' + eventNamespace, module.event.down);
+ },
+ slidingEvents: function() {
+ // these don't need the identifier because we only ever want one of them to be registered with document
+ module.verbose('Binding page wide events while handle is being draged');
+ if(module.is.touch()) {
+ $(document).on('touchmove' + eventNamespace, module.event.move);
+ $(document).on('touchend' + eventNamespace, module.event.up);
+ }
+ else {
+ $(document).on('mousemove' + eventNamespace, module.event.move);
+ $(document).on('mouseup' + eventNamespace, module.event.up);
+ }
+ },
+ windowEvents: function() {
+ $window.on('resize' + eventNamespace, module.event.resize);
+ }
+ },
+
+ unbind: {
+ events: function() {
+ $module.find('.track, .thumb, .inner').off('mousedown' + eventNamespace);
+ $module.find('.track, .thumb, .inner').off('touchstart' + eventNamespace);
+ $module.off('mousedown' + eventNamespace);
+ $module.off('mouseenter' + eventNamespace);
+ $module.off('mouseleave' + eventNamespace);
+ $module.off('touchstart' + eventNamespace);
+ $module.off('keydown' + eventNamespace);
+ $module.off('focusout' + eventNamespace);
+ $(document).off('keydown' + eventNamespace + documentEventID, module.event.activateFocus);
+ $window.off('resize' + eventNamespace);
+ },
+ slidingEvents: function() {
+ if(module.is.touch()) {
+ $(document).off('touchmove' + eventNamespace);
+ $(document).off('touchend' + eventNamespace);
+ } else {
+ $(document).off('mousemove' + eventNamespace);
+ $(document).off('mouseup' + eventNamespace);
+ }
+ },
+ },
+
+ event: {
+ down: function(event) {
+ event.preventDefault();
+ if(module.is.range()) {
+ var
+ eventPos = module.determine.eventPos(event),
+ newPos = module.determine.pos(eventPos)
+ ;
+ // Special handling if range mode and both thumbs have the same value
+ if(settings.preventCrossover && module.is.range() && module.thumbVal === module.secondThumbVal) {
+ initialPosition = newPos;
+ $currThumb = undefined;
+ } else {
+ $currThumb = module.determine.closestThumb(newPos);
+ }
+ if (previousValue === undefined) {
+ previousValue = module.get.currentThumbValue();
+ }
+ } else if (previousValue === undefined) {
+ previousValue = module.get.value();
+ }
+
+ if(!module.is.disabled()) {
+ module.bind.slidingEvents();
+ }
+ },
+ move: function(event) {
+ event.preventDefault();
+ var value = module.determine.valueFromEvent(event);
+ if($currThumb === undefined) {
+ var
+ eventPos = module.determine.eventPos(event),
+ newPos = module.determine.pos(eventPos)
+ ;
+ $currThumb = initialPosition > newPos ? $thumb : $secondThumb;
+ }
+ if(module.get.step() == 0 || module.is.smooth()) {
+ var
+ thumbVal = module.thumbVal,
+ secondThumbVal = module.secondThumbVal,
+ thumbSmoothVal = module.determine.smoothValueFromEvent(event)
+ ;
+ if(!$currThumb.hasClass('second')) {
+ if(settings.preventCrossover && module.is.range()) {
+ value = Math.min(secondThumbVal, value);
+ thumbSmoothVal = Math.min(secondThumbVal, thumbSmoothVal);
+ }
+ thumbVal = value;
+ } else {
+ if(settings.preventCrossover && module.is.range()) {
+ value = Math.max(thumbVal, value);
+ thumbSmoothVal = Math.max(thumbVal, thumbSmoothVal);
+ }
+ secondThumbVal = value;
+ }
+ value = Math.abs(thumbVal - (secondThumbVal || 0));
+ module.update.position(thumbSmoothVal);
+ settings.onMove.call(element, value, thumbVal, secondThumbVal);
+ } else {
+ module.update.value(value, function(value, thumbVal, secondThumbVal) {
+ settings.onMove.call(element, value, thumbVal, secondThumbVal);
+ });
+ }
+ },
+ up: function(event) {
+ event.preventDefault();
+ var value = module.determine.valueFromEvent(event);
+ module.set.value(value);
+ module.unbind.slidingEvents();
+ if (previousValue !== undefined) {
+ previousValue = undefined;
+ }
+ },
+ keydown: function(event, first) {
+ if(settings.preventCrossover && module.is.range() && module.thumbVal === module.secondThumbVal) {
+ $currThumb = undefined;
+ }
+ if(module.is.focused()) {
+ $(document).trigger(event);
+ }
+ if(first || module.is.focused()) {
+ var step = module.determine.keyMovement(event);
+ if(step != NO_STEP) {
+ event.preventDefault();
+ switch(step) {
+ case SINGLE_STEP:
+ module.takeStep();
+ break;
+ case BIG_STEP:
+ module.takeStep(module.get.multiplier());
+ break;
+ case SINGLE_BACKSTEP:
+ module.backStep();
+ break;
+ case BIG_BACKSTEP:
+ module.backStep(module.get.multiplier());
+ break;
+ }
+ }
+ }
+ },
+ activateFocus: function(event) {
+ if(!module.is.focused() && module.is.hover() && module.determine.keyMovement(event) != NO_STEP) {
+ event.preventDefault();
+ module.event.keydown(event, true);
+ $module.focus();
+ }
+ },
+ resize: function(_event) {
+ // To avoid a useless performance cost, we only call the label refresh when its necessary
+ if (gapRatio != module.get.gapRatio()) {
+ module.setup.labels();
+ gapRatio = module.get.gapRatio();
+ }
+ }
+ },
+
+ resync: function() {
+ module.verbose('Resyncing thumb position based on value');
+ if(module.is.range()) {
+ module.update.position(module.secondThumbVal, $secondThumb);
+ }
+ module.update.position(module.thumbVal, $thumb);
+ module.setup.labels();
+ },
+ takeStep: function(multiplier) {
+ var
+ multiplier = multiplier != undefined ? multiplier : 1,
+ step = module.get.step(),
+ currValue = module.get.currentThumbValue()
+ ;
+ module.verbose('Taking a step');
+ if(step > 0) {
+ module.set.value(currValue + step * multiplier);
+ } else if (step == 0){
+ var
+ precision = module.get.precision(),
+ newValue = currValue + (multiplier/precision)
+ ;
+ module.set.value(Math.round(newValue * precision) / precision);
+ }
+ },
+
+ backStep: function(multiplier) {
+ var
+ multiplier = multiplier != undefined ? multiplier : 1,
+ step = module.get.step(),
+ currValue = module.get.currentThumbValue()
+ ;
+ module.verbose('Going back a step');
+ if(step > 0) {
+ module.set.value(currValue - step * multiplier);
+ } else if (step == 0) {
+ var
+ precision = module.get.precision(),
+ newValue = currValue - (multiplier/precision)
+ ;
+ module.set.value(Math.round(newValue * precision) / precision);
+ }
+ },
+
+ is: {
+ range: function() {
+ return $module.hasClass(settings.className.range);
+ },
+ hover: function() {
+ return isHover;
+ },
+ focused: function() {
+ return $module.is(':focus');
+ },
+ disabled: function() {
+ return $module.hasClass(settings.className.disabled);
+ },
+ labeled: function() {
+ return $module.hasClass(settings.className.labeled);
+ },
+ reversed: function() {
+ return $module.hasClass(settings.className.reversed);
+ },
+ vertical: function() {
+ return $module.hasClass(settings.className.vertical);
+ },
+ smooth: function() {
+ return settings.smooth || $module.hasClass(settings.className.smooth);
+ },
+ touch: function() {
+ return isTouch;
+ }
+ },
+
+ get: {
+ trackOffset: function() {
+ if (module.is.vertical()) {
+ return $track.offset().top;
+ } else {
+ return $track.offset().left;
+ }
+ },
+ trackLength: function() {
+ if (module.is.vertical()) {
+ return $track.height();
+ } else {
+ return $track.width();
+ }
+ },
+ trackLeft: function() {
+ if (module.is.vertical()) {
+ return $track.position().top;
+ } else {
+ return $track.position().left;
+ }
+ },
+ trackStartPos: function() {
+ return module.is.reversed() ? module.get.trackLeft() + module.get.trackLength() : module.get.trackLeft();
+ },
+ trackEndPos: function() {
+ return module.is.reversed() ? module.get.trackLeft() : module.get.trackLeft() + module.get.trackLength();
+ },
+ trackStartMargin: function () {
+ var margin;
+ if (module.is.vertical()) {
+ margin = module.is.reversed() ? $module.css('padding-bottom') : $module.css('padding-top');
+ } else {
+ margin = module.is.reversed() ? $module.css('padding-right') : $module.css('padding-left');
+ }
+ return margin || '0px';
+ },
+ trackEndMargin: function () {
+ var margin;
+ if (module.is.vertical()) {
+ margin = module.is.reversed() ? $module.css('padding-top') : $module.css('padding-bottom');
+ } else {
+ margin = module.is.reversed() ? $module.css('padding-left') : $module.css('padding-right');
+ }
+ return margin || '0px';
+ },
+ precision: function() {
+ var
+ decimalPlaces,
+ step = module.get.step()
+ ;
+ if(step != 0) {
+ var split = String(step).split('.');
+ if(split.length == 2) {
+ decimalPlaces = split[1].length;
+ } else {
+ decimalPlaces = 0;
+ }
+ } else {
+ decimalPlaces = settings.decimalPlaces;
+ }
+ var precision = Math.pow(10, decimalPlaces);
+ module.debug('Precision determined', precision);
+ return precision;
+ },
+ min: function() {
+ return settings.min;
+ },
+ max: function() {
+ var step = module.get.step(),
+ min = module.get.min(),
+ quotient = step === 0 ? 0 : Math.floor((settings.max - min) / step),
+ remainder = step === 0 ? 0 : (settings.max - min) % step;
+ return remainder === 0 ? settings.max : min + quotient * step;
+ },
+ step: function() {
+ return settings.step;
+ },
+ numLabels: function() {
+ var value = Math.round((module.get.max() - module.get.min()) / (module.get.step() === 0 ? 1 : module.get.step()));
+ module.debug('Determined that there should be ' + value + ' labels');
+ return value;
+ },
+ labelType: function() {
+ return settings.labelType;
+ },
+ label: function(value) {
+ if(interpretLabel) {
+ return interpretLabel(value);
+ }
+
+ switch (settings.labelType) {
+ case settings.labelTypes.number:
+ return Math.round(((value * (module.get.step() === 0 ? 1 : module.get.step())) + module.get.min()) * precision ) / precision;
+ case settings.labelTypes.letter:
+ return alphabet[(value) % 26];
+ default:
+ return value;
+ }
+ },
+ value: function() {
+ return value;
+ },
+ currentThumbValue: function() {
+ return $currThumb !== undefined && $currThumb.hasClass('second') ? module.secondThumbVal : module.thumbVal;
+ },
+ thumbValue: function(which) {
+ switch(which) {
+ case 'second':
+ if(module.is.range()) {
+ return module.secondThumbVal;
+ }
+ else {
+ module.error(error.notrange);
+ break;
+ }
+ case 'first':
+ default:
+ return module.thumbVal;
+ }
+ },
+ multiplier: function() {
+ return settings.pageMultiplier;
+ },
+ thumbPosition: function(which) {
+ switch(which) {
+ case 'second':
+ if(module.is.range()) {
+ return secondPos;
+ }
+ else {
+ module.error(error.notrange);
+ break;
+ }
+ case 'first':
+ default:
+ return position;
+ }
+ },
+ gapRatio: function() {
+ var gapRatio = 1;
+
+ if( settings.autoAdjustLabels ) {
+ var
+ numLabels = module.get.numLabels(),
+ trackLength = module.get.trackLength(),
+ gapCounter = 1
+ ;
+
+ // While the distance between two labels is too short,
+ // we divide the number of labels at each iteration
+ // and apply only if the modulo of the operation is an odd number.
+ if(trackLength>0){
+ while ((trackLength / numLabels) * gapCounter < settings.labelDistance) {
+ if( !(numLabels % gapCounter) ) {
+ gapRatio = gapCounter;
+ }
+ gapCounter += 1;
+ }
+ }
+ }
+ return gapRatio;
+ }
+ },
+
+ determine: {
+ pos: function(pagePos) {
+ return module.is.reversed()
+ ?
+ module.get.trackStartPos() - pagePos + module.get.trackOffset()
+ :
+ pagePos - module.get.trackOffset() - module.get.trackStartPos()
+ ;
+ },
+ closestThumb: function(eventPos) {
+ var
+ thumbPos = parseFloat(module.determine.thumbPos($thumb)),
+ thumbDelta = Math.abs(eventPos - thumbPos),
+ secondThumbPos = parseFloat(module.determine.thumbPos($secondThumb)),
+ secondThumbDelta = Math.abs(eventPos - secondThumbPos)
+ ;
+ if(thumbDelta === secondThumbDelta && module.get.thumbValue() === module.get.min()) {
+ return $secondThumb;
+ }
+ return thumbDelta <= secondThumbDelta ? $thumb : $secondThumb;
+ },
+ closestThumbPos: function(eventPos) {
+ var
+ thumbPos = parseFloat(module.determine.thumbPos($thumb)),
+ thumbDelta = Math.abs(eventPos - thumbPos),
+ secondThumbPos = parseFloat(module.determine.thumbPos($secondThumb)),
+ secondThumbDelta = Math.abs(eventPos - secondThumbPos)
+ ;
+ return thumbDelta <= secondThumbDelta ? thumbPos : secondThumbPos;
+ },
+ thumbPos: function($element) {
+ var pos =
+ module.is.vertical()
+ ?
+ module.is.reversed() ? $element.css('bottom') : $element.css('top')
+ :
+ module.is.reversed() ? $element.css('right') : $element.css('left')
+ ;
+ return pos;
+ },
+ positionFromValue: function(value) {
+ var
+ min = module.get.min(),
+ max = module.get.max(),
+ value = value > max ? max : value < min ? min : value,
+ trackLength = module.get.trackLength(),
+ ratio = (value - min) / (max - min),
+ position = Math.round(ratio * trackLength)
+ ;
+ module.verbose('Determined position: ' + position + ' from value: ' + value);
+ return position;
+ },
+ positionFromRatio: function(ratio) {
+ var
+ trackLength = module.get.trackLength(),
+ step = module.get.step(),
+ position = Math.round(ratio * trackLength),
+ adjustedPos = (step == 0) ? position : Math.round(position / step) * step
+ ;
+ return adjustedPos;
+ },
+ valueFromEvent: function(event) {
+ var
+ eventPos = module.determine.eventPos(event),
+ newPos = module.determine.pos(eventPos),
+ value
+ ;
+ if(eventPos < module.get.trackOffset()) {
+ value = module.is.reversed() ? module.get.max() : module.get.min();
+ } else if(eventPos > module.get.trackOffset() + module.get.trackLength()) {
+ value = module.is.reversed() ? module.get.min() : module.get.max();
+ } else {
+ value = module.determine.value(newPos);
+ }
+ return value;
+ },
+ smoothValueFromEvent: function(event) {
+ var
+ min = module.get.min(),
+ max = module.get.max(),
+ trackLength = module.get.trackLength(),
+ eventPos = module.determine.eventPos(event),
+ newPos = eventPos - module.get.trackOffset(),
+ ratio,
+ value
+ ;
+ newPos = newPos < 0 ? 0 : newPos > trackLength ? trackLength : newPos;
+ ratio = newPos / trackLength;
+ if (module.is.reversed()) {
+ ratio = 1 - ratio;
+ }
+ value = ratio * (max - min) + min;
+ return value;
+ },
+ eventPos: function(event) {
+ if(module.is.touch()) {
+ var
+ touchEvent = event.changedTouches ? event : event.originalEvent,
+ touches = touchEvent.changedTouches[0] ? touchEvent.changedTouches : touchEvent.touches,
+ touchY = touches[0].pageY,
+ touchX = touches[0].pageX
+ ;
+ return module.is.vertical() ? touchY : touchX;
+ }
+ var
+ clickY = event.pageY || event.originalEvent.pageY,
+ clickX = event.pageX || event.originalEvent.pageX
+ ;
+ return module.is.vertical() ? clickY : clickX;
+ },
+ value: function(position) {
+ var
+ startPos = module.is.reversed() ? module.get.trackEndPos() : module.get.trackStartPos(),
+ endPos = module.is.reversed() ? module.get.trackStartPos() : module.get.trackEndPos(),
+ ratio = (position - startPos) / (endPos - startPos),
+ range = module.get.max() - module.get.min(),
+ step = module.get.step(),
+ value = (ratio * range),
+ difference = (step == 0) ? value : Math.round(value / step) * step
+ ;
+ module.verbose('Determined value based upon position: ' + position + ' as: ' + value);
+ if(value != difference) {
+ module.verbose('Rounding value to closest step: ' + difference);
+ }
+ // Use precision to avoid ugly Javascript floating point rounding issues
+ // (like 35 * .01 = 0.35000000000000003)
+ module.verbose('Cutting off additional decimal places');
+ return Math.round((difference + module.get.min()) * precision) / precision;
+ },
+ keyMovement: function(event) {
+ var
+ key = event.which,
+ downArrow =
+ module.is.vertical()
+ ?
+ module.is.reversed() ? keys.downArrow : keys.upArrow
+ :
+ keys.downArrow
+ ,
+ upArrow =
+ module.is.vertical()
+ ?
+ module.is.reversed() ? keys.upArrow : keys.downArrow
+ :
+ keys.upArrow
+ ,
+ leftArrow =
+ !module.is.vertical()
+ ?
+ module.is.reversed() ? keys.rightArrow : keys.leftArrow
+ :
+ keys.leftArrow
+ ,
+ rightArrow =
+ !module.is.vertical()
+ ?
+ module.is.reversed() ? keys.leftArrow : keys.rightArrow
+ :
+ keys.rightArrow
+ ;
+ if(key == downArrow || key == leftArrow) {
+ return SINGLE_BACKSTEP;
+ } else if(key == upArrow || key == rightArrow) {
+ return SINGLE_STEP;
+ } else if (key == keys.pageDown) {
+ return BIG_BACKSTEP;
+ } else if (key == keys.pageUp) {
+ return BIG_STEP;
+ } else {
+ return NO_STEP;
+ }
+ }
+ },
+
+ handleNewValuePosition: function(val) {
+ var
+ min = module.get.min(),
+ max = module.get.max(),
+ newPos
+ ;
+ if (val <= min) {
+ val = min;
+ } else if (val >= max) {
+ val = max;
+ }
+ newPos = module.determine.positionFromValue(val);
+ return newPos;
+ },
+
+ set: {
+ value: function(newValue, fireChange) {
+ fireChange = fireChange !== false;
+ var toReset = previousValue === undefined;
+ previousValue = previousValue === undefined ? module.get.value() : previousValue;
+ module.update.value(newValue, function(value, thumbVal, secondThumbVal) {
+ if ((!initialLoad || settings.fireOnInit) && fireChange){
+ if (newValue !== previousValue) {
+ settings.onChange.call(element, value, thumbVal, secondThumbVal);
+ }
+ settings.onMove.call(element, value, thumbVal, secondThumbVal);
+ }
+ if (toReset) {
+ previousValue = undefined;
+ }
+ });
+ },
+ rangeValue: function(first, second, fireChange) {
+ fireChange = fireChange !== false;
+ if(module.is.range()) {
+ var
+ min = module.get.min(),
+ max = module.get.max(),
+ toReset = previousValue === undefined
+ ;
+ previousValue = previousValue === undefined ? module.get.value() : previousValue;
+ if (first <= min) {
+ first = min;
+ } else if(first >= max){
+ first = max;
+ }
+ if (second <= min) {
+ second = min;
+ } else if(second >= max){
+ second = max;
+ }
+ module.thumbVal = first;
+ module.secondThumbVal = second;
+ value = Math.abs(module.thumbVal - module.secondThumbVal);
+ module.update.position(module.thumbVal, $thumb);
+ module.update.position(module.secondThumbVal, $secondThumb);
+ if ((!initialLoad || settings.fireOnInit) && fireChange) {
+ if (value !== previousValue) {
+ settings.onChange.call(element, value, module.thumbVal, module.secondThumbVal);
+ }
+ settings.onMove.call(element, value, module.thumbVal, module.secondThumbVal);
+ }
+ if (toReset) {
+ previousValue = undefined;
+ }
+ } else {
+ module.error(error.notrange);
+ }
+ },
+ position: function(position, which) {
+ var thumbVal = module.determine.value(position);
+ switch (which) {
+ case 'second':
+ module.secondThumbVal = thumbVal;
+ module.update.position(thumbVal, $secondThumb);
+ break;
+ default:
+ module.thumbVal = thumbVal;
+ module.update.position(thumbVal, $thumb);
+ }
+ value = Math.abs(module.thumbVal - (module.secondThumbVal || 0));
+ module.set.value(value);
+ }
+ },
+
+ update: {
+ value: function(newValue, callback) {
+ var
+ min = module.get.min(),
+ max = module.get.max()
+ ;
+ if (newValue <= min) {
+ newValue = min;
+ } else if(newValue >= max){
+ newValue = max;
+ }
+ if(!module.is.range()) {
+ value = newValue;
+ module.thumbVal = value;
+ } else {
+ if($currThumb === undefined) {
+ $currThumb = newValue <= module.get.currentThumbValue() ? $thumb : $secondThumb;
+ }
+ if(!$currThumb.hasClass('second')) {
+ if(settings.preventCrossover && module.is.range()) {
+ newValue = Math.min(module.secondThumbVal, newValue);
+ }
+ module.thumbVal = newValue;
+ } else {
+ if(settings.preventCrossover && module.is.range()) {
+ newValue = Math.max(module.thumbVal, newValue);
+ }
+ module.secondThumbVal = newValue;
+ }
+ value = Math.abs(module.thumbVal - module.secondThumbVal);
+ }
+ module.update.position(newValue);
+ module.debug('Setting slider value to ' + value);
+ if(typeof callback === 'function') {
+ callback(value, module.thumbVal, module.secondThumbVal);
+ }
+ },
+ position: function(newValue, $element) {
+ var
+ newPos = module.handleNewValuePosition(newValue),
+ $targetThumb = $element != undefined ? $element : $currThumb,
+ thumbVal = module.thumbVal || module.get.min(),
+ secondThumbVal = module.secondThumbVal || module.get.min()
+ ;
+ if(module.is.range()) {
+ if(!$targetThumb.hasClass('second')) {
+ position = newPos;
+ thumbVal = newValue;
+ } else {
+ secondPos = newPos;
+ secondThumbVal = newValue;
+ }
+ } else {
+ position = newPos;
+ thumbVal = newValue;
+ }
+ var
+ trackPosValue,
+ thumbPosValue,
+ min = module.get.min(),
+ max = module.get.max(),
+ thumbPosPercent = 100 * (newValue - min) / (max - min),
+ trackStartPosPercent = 100 * (Math.min(thumbVal, secondThumbVal) - min) / (max - min),
+ trackEndPosPercent = 100 * (1 - (Math.max(thumbVal, secondThumbVal) - min) / (max - min))
+ ;
+ if (module.is.vertical()) {
+ if (module.is.reversed()) {
+ thumbPosValue = {bottom: 'calc(' + thumbPosPercent + '% - ' + offset + 'px)', top: 'auto'};
+ trackPosValue = {bottom: trackStartPosPercent + '%', top: trackEndPosPercent + '%'};
+ }
+ else {
+ thumbPosValue = {top: 'calc(' + thumbPosPercent + '% - ' + offset + 'px)', bottom: 'auto'};
+ trackPosValue = {top: trackStartPosPercent + '%', bottom: trackEndPosPercent + '%'};
+ }
+ } else {
+ if (module.is.reversed()) {
+ thumbPosValue = {right: 'calc(' + thumbPosPercent + '% - ' + offset + 'px)', left: 'auto'};
+ trackPosValue = {right: trackStartPosPercent + '%', left: trackEndPosPercent + '%'};
+ }
+ else {
+ thumbPosValue = {left: 'calc(' + thumbPosPercent + '% - ' + offset + 'px)', right: 'auto'};
+ trackPosValue = {left: trackStartPosPercent + '%', right: trackEndPosPercent + '%'};
+ }
+ }
+ $targetThumb.css(thumbPosValue);
+ $trackFill.css(trackPosValue);
+ module.debug('Setting slider position to ' + newPos);
+ },
+ labelPosition: function (ratio, $label) {
+ var
+ startMargin = module.get.trackStartMargin(),
+ endMargin = module.get.trackEndMargin(),
+ posDir =
+ module.is.vertical()
+ ?
+ module.is.reversed() ? 'bottom' : 'top'
+ :
+ module.is.reversed() ? 'right' : 'left',
+ startMarginMod = module.is.reversed() && !module.is.vertical() ? ' - ' : ' + '
+ ;
+ var position = '(100% - ' + startMargin + ' - ' + endMargin + ') * ' + ratio;
+ $label.css(posDir, 'calc(' + position + startMarginMod + startMargin + ')');
+ }
+ },
+
+ goto: {
+ max: function() {
+ module.set.value(module.get.max());
+ },
+ min: function() {
+ module.set.value(module.get.min());
+ },
+ },
+
+ read: {
+ metadata: function() {
+ var
+ data = {
+ thumbVal : $module.data(metadata.thumbVal),
+ secondThumbVal : $module.data(metadata.secondThumbVal)
+ }
+ ;
+ if(data.thumbVal) {
+ if(module.is.range() && data.secondThumbVal) {
+ module.debug('Current value set from metadata', data.thumbVal, data.secondThumbVal);
+ module.set.rangeValue(data.thumbVal, data.secondThumbVal);
+ } else {
+ module.debug('Current value set from metadata', data.thumbVal);
+ module.set.value(data.thumbVal);
+ }
+ }
+ },
+ settings: function() {
+ if(settings.start !== false) {
+ if(module.is.range()) {
+ module.debug('Start position set from settings', settings.start, settings.end);
+ module.set.rangeValue(settings.start, settings.end);
+ } else {
+ module.debug('Start position set from settings', settings.start);
+ module.set.value(settings.start);
+ }
+ }
+ }
+ },
+
+ setting: function(name, value) {
+ module.debug('Changing setting', name, value);
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ if($.isPlainObject(settings[name])) {
+ $.extend(true, settings[name], value);
+ }
+ else {
+ settings[name] = value;
+ }
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ module.error(error.method, query);
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if($.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ }
+ })
+ ;
+
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+
+};
+
+$.fn.slider.settings = {
+
+ silent : false,
+ debug : false,
+ verbose : false,
+ performance : true,
+
+ name : 'Slider',
+ namespace : 'slider',
+
+ error : {
+ method : 'The method you called is not defined.',
+ notrange : 'This slider is not a range slider'
+ },
+
+ metadata: {
+ thumbVal : 'thumbVal',
+ secondThumbVal : 'secondThumbVal'
+ },
+
+ min : 0,
+ max : 20,
+ step : 1,
+ start : 0,
+ end : 20,
+ labelType : 'number',
+ showLabelTicks : false,
+ smooth : false,
+ autoAdjustLabels : true,
+ labelDistance : 100,
+ preventCrossover : true,
+ fireOnInit : false,
+ interpretLabel : false,
+
+ //the decimal place to round to if step is undefined
+ decimalPlaces : 2,
+
+ // page up/down multiplier. How many more times the steps to take on page up/down press
+ pageMultiplier : 2,
+
+ selector: {
+
+ },
+
+ className : {
+ reversed : 'reversed',
+ disabled : 'disabled',
+ labeled : 'labeled',
+ ticked : 'ticked',
+ vertical : 'vertical',
+ range : 'range',
+ smooth : 'smooth'
+ },
+
+ keys : {
+ pageUp : 33,
+ pageDown : 34,
+ leftArrow : 37,
+ upArrow : 38,
+ rightArrow : 39,
+ downArrow : 40
+ },
+
+ labelTypes : {
+ number : 'number',
+ letter : 'letter'
+ },
+
+ onChange : function(value, thumbVal, secondThumbVal){},
+ onMove : function(value, thumbVal, secondThumbVal){},
+};
+
+
+})( jQuery, window, document );
+
+/*!
+ * # Fomantic-UI 2.8.8 - Rating
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+'use strict';
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.rating = function(parameters) {
+ var
+ $allModules = $(this),
+ moduleSelector = $allModules.selector || '',
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+ returnedValue
+ ;
+ $allModules
+ .each(function() {
+ var
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.fn.rating.settings, parameters)
+ : $.extend({}, $.fn.rating.settings),
+
+ namespace = settings.namespace,
+ className = settings.className,
+ metadata = settings.metadata,
+ selector = settings.selector,
+ cssVars = settings.cssVars,
+
+ eventNamespace = '.' + namespace,
+ moduleNamespace = 'module-' + namespace,
+
+ element = this,
+ instance = $(this).data(moduleNamespace),
+
+ $module = $(this),
+ $icon = $module.find(selector.icon),
+
+ initialLoad,
+ module
+ ;
+
+ module = {
+
+ initialize: function() {
+ module.verbose('Initializing rating module', settings);
+
+ if($icon.length === 0) {
+ module.setup.layout();
+ }
+
+ if(settings.interactive && !module.is.disabled()) {
+ module.enable();
+ }
+ else {
+ module.disable();
+ }
+ module.set.initialLoad();
+ module.set.rating( module.get.initialRating() );
+ module.remove.initialLoad();
+ module.instantiate();
+ },
+
+ instantiate: function() {
+ module.verbose('Instantiating module', settings);
+ instance = module;
+ $module
+ .data(moduleNamespace, module)
+ ;
+ },
+
+ destroy: function() {
+ module.verbose('Destroying previous instance', instance);
+ module.remove.events();
+ $module
+ .removeData(moduleNamespace)
+ ;
+ },
+
+ refresh: function() {
+ $icon = $module.find(selector.icon);
+ },
+
+ setup: {
+ layout: function() {
+ var
+ maxRating = module.get.maxRating(),
+ icon = module.get.icon(),
+ html = $.fn.rating.settings.templates.icon(maxRating, icon)
+ ;
+ module.debug('Generating icon html dynamically');
+ $module
+ .html(html)
+ ;
+ module.refresh();
+ }
+ },
+
+ event: {
+ mouseenter: function() {
+ var
+ $activeIcon = $(this)
+ ;
+ $activeIcon
+ .nextAll()
+ .removeClass(className.selected)
+ ;
+ $module
+ .addClass(className.selected)
+ ;
+ $activeIcon
+ .addClass(className.selected)
+ .prevAll()
+ .addClass(className.selected)
+ ;
+ },
+ mouseleave: function() {
+ $module
+ .removeClass(className.selected)
+ ;
+ $icon
+ .removeClass(className.selected)
+ ;
+ },
+ click: function() {
+ var
+ $activeIcon = $(this),
+ currentRating = module.get.rating(),
+ rating = $icon.index($activeIcon) + 1,
+ canClear = (settings.clearable == 'auto')
+ ? ($icon.length === 1)
+ : settings.clearable
+ ;
+ if(canClear && currentRating == rating) {
+ module.clearRating();
+ }
+ else {
+ module.set.rating( rating );
+ }
+ }
+ },
+
+ clearRating: function() {
+ module.debug('Clearing current rating');
+ module.set.rating(0);
+ },
+
+ bind: {
+ events: function() {
+ module.verbose('Binding events');
+ $module
+ .on('mouseenter' + eventNamespace, selector.icon, module.event.mouseenter)
+ .on('mouseleave' + eventNamespace, selector.icon, module.event.mouseleave)
+ .on('click' + eventNamespace, selector.icon, module.event.click)
+ ;
+ }
+ },
+
+ remove: {
+ events: function() {
+ module.verbose('Removing events');
+ $module
+ .off(eventNamespace)
+ ;
+ },
+ initialLoad: function() {
+ initialLoad = false;
+ }
+ },
+
+ enable: function() {
+ module.debug('Setting rating to interactive mode');
+ module.bind.events();
+ $module
+ .removeClass(className.disabled)
+ ;
+ },
+
+ disable: function() {
+ module.debug('Setting rating to read-only mode');
+ module.remove.events();
+ $module
+ .addClass(className.disabled)
+ ;
+ },
+
+ is: {
+ initialLoad: function() {
+ return initialLoad;
+ },
+ disabled: function() {
+ return $module.hasClass(className.disabled);
+ }
+ },
+
+ get: {
+ icon: function(){
+ var icon = $module.data(metadata.icon);
+ if (icon) {
+ $module.removeData(metadata.icon);
+ }
+ return icon || settings.icon;
+ },
+ initialRating: function() {
+ if($module.data(metadata.rating) !== undefined) {
+ $module.removeData(metadata.rating);
+ return $module.data(metadata.rating);
+ }
+ return settings.initialRating;
+ },
+ maxRating: function() {
+ if($module.data(metadata.maxRating) !== undefined) {
+ $module.removeData(metadata.maxRating);
+ return $module.data(metadata.maxRating);
+ }
+ return settings.maxRating;
+ },
+ rating: function() {
+ var
+ currentRating = $icon.filter('.' + className.active).length
+ ;
+ module.verbose('Current rating retrieved', currentRating);
+ return currentRating;
+ }
+ },
+
+ set: {
+ rating: function(rating) {
+ var
+ ratingIndex = Math.floor(
+ (rating - 1 >= 0)
+ ? (rating - 1)
+ : 0
+ ),
+ $activeIcon = $icon.eq(ratingIndex),
+ $partialActiveIcon = rating <= 1
+ ? $activeIcon
+ : $activeIcon.next()
+ ,
+ filledPercentage = (rating % 1) * 100
+ ;
+ $module
+ .removeClass(className.selected)
+ ;
+ $icon
+ .removeClass(className.selected)
+ .removeClass(className.active)
+ .removeClass(className.partiallyActive)
+ ;
+ if(rating > 0) {
+ module.verbose('Setting current rating to', rating);
+ $activeIcon
+ .prevAll()
+ .addBack()
+ .addClass(className.active)
+ ;
+ if($activeIcon.next() && rating % 1 !== 0) {
+ $partialActiveIcon
+ .addClass(className.partiallyActive)
+ .addClass(className.active)
+ ;
+ $partialActiveIcon
+ .css(cssVars.filledCustomPropName, filledPercentage + '%')
+ ;
+ if($partialActiveIcon.css('backgroundColor') === 'transparent') {
+ $partialActiveIcon
+ .removeClass(className.partiallyActive)
+ .removeClass(className.active)
+ ;
+ }
+ }
+ }
+ if(!module.is.initialLoad()) {
+ settings.onRate.call(element, rating);
+ }
+ },
+ initialLoad: function() {
+ initialLoad = true;
+ }
+ },
+
+ setting: function(name, value) {
+ module.debug('Changing setting', name, value);
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ if($.isPlainObject(settings[name])) {
+ $.extend(true, settings[name], value);
+ }
+ else {
+ settings[name] = value;
+ }
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if($allModules.length > 1) {
+ title += ' ' + '(' + $allModules.length + ')';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ }
+ })
+ ;
+
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.fn.rating.settings = {
+
+ name : 'Rating',
+ namespace : 'rating',
+
+ icon : 'star',
+
+ silent : false,
+ debug : false,
+ verbose : false,
+ performance : true,
+
+ initialRating : 0,
+ interactive : true,
+ maxRating : 4,
+ clearable : 'auto',
+
+ fireOnInit : false,
+
+ onRate : function(rating){},
+
+ error : {
+ method : 'The method you called is not defined',
+ noMaximum : 'No maximum rating specified. Cannot generate HTML automatically'
+ },
+
+
+ metadata: {
+ rating : 'rating',
+ maxRating : 'maxRating',
+ icon : 'icon'
+ },
+
+ className : {
+ active : 'active',
+ disabled : 'disabled',
+ selected : 'selected',
+ loading : 'loading',
+ partiallyActive : 'partial'
+ },
+
+ cssVars : {
+ filledCustomPropName : '--full'
+ },
+
+ selector : {
+ icon : '.icon'
+ },
+
+ templates: {
+ icon: function(maxRating, iconClass) {
+ var
+ icon = 1,
+ html = ''
+ ;
+ while(icon <= maxRating) {
+ html += ' ';
+ icon++;
+ }
+ return html;
+ }
+ }
+
+};
+
+})( jQuery, window, document );
+
+/*!
+ * # Fomantic-UI 2.8.8 - Search
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+'use strict';
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.search = function(parameters) {
+ var
+ $allModules = $(this),
+ moduleSelector = $allModules.selector || '',
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+ returnedValue
+ ;
+ $(this)
+ .each(function() {
+ var
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.fn.search.settings, parameters)
+ : $.extend({}, $.fn.search.settings),
+
+ className = settings.className,
+ metadata = settings.metadata,
+ regExp = settings.regExp,
+ fields = settings.fields,
+ selector = settings.selector,
+ error = settings.error,
+ namespace = settings.namespace,
+
+ eventNamespace = '.' + namespace,
+ moduleNamespace = namespace + '-module',
+
+ $module = $(this),
+ $prompt = $module.find(selector.prompt),
+ $searchButton = $module.find(selector.searchButton),
+ $results = $module.find(selector.results),
+ $result = $module.find(selector.result),
+ $category = $module.find(selector.category),
+
+ element = this,
+ instance = $module.data(moduleNamespace),
+
+ disabledBubbled = false,
+ resultsDismissed = false,
+
+ module
+ ;
+
+ module = {
+
+ initialize: function() {
+ module.verbose('Initializing module');
+ module.get.settings();
+ module.determine.searchFields();
+ module.bind.events();
+ module.set.type();
+ module.create.results();
+ module.instantiate();
+ },
+ instantiate: function() {
+ module.verbose('Storing instance of module', module);
+ instance = module;
+ $module
+ .data(moduleNamespace, module)
+ ;
+ },
+ destroy: function() {
+ module.verbose('Destroying instance');
+ $module
+ .off(eventNamespace)
+ .removeData(moduleNamespace)
+ ;
+ },
+
+ refresh: function() {
+ module.debug('Refreshing selector cache');
+ $prompt = $module.find(selector.prompt);
+ $searchButton = $module.find(selector.searchButton);
+ $category = $module.find(selector.category);
+ $results = $module.find(selector.results);
+ $result = $module.find(selector.result);
+ },
+
+ refreshResults: function() {
+ $results = $module.find(selector.results);
+ $result = $module.find(selector.result);
+ },
+
+ bind: {
+ events: function() {
+ module.verbose('Binding events to search');
+ if(settings.automatic) {
+ $module
+ .on(module.get.inputEvent() + eventNamespace, selector.prompt, module.event.input)
+ ;
+ $prompt
+ .attr('autocomplete', module.is.chrome() ? 'fomantic-search' : 'off')
+ ;
+ }
+ $module
+ // prompt
+ .on('focus' + eventNamespace, selector.prompt, module.event.focus)
+ .on('blur' + eventNamespace, selector.prompt, module.event.blur)
+ .on('keydown' + eventNamespace, selector.prompt, module.handleKeyboard)
+ // search button
+ .on('click' + eventNamespace, selector.searchButton, module.query)
+ // results
+ .on('mousedown' + eventNamespace, selector.results, module.event.result.mousedown)
+ .on('mouseup' + eventNamespace, selector.results, module.event.result.mouseup)
+ .on('click' + eventNamespace, selector.result, module.event.result.click)
+ ;
+ }
+ },
+
+ determine: {
+ searchFields: function() {
+ // this makes sure $.extend does not add specified search fields to default fields
+ // this is the only setting which should not extend defaults
+ if(parameters && parameters.searchFields !== undefined) {
+ settings.searchFields = parameters.searchFields;
+ }
+ }
+ },
+
+ event: {
+ input: function() {
+ if(settings.searchDelay) {
+ clearTimeout(module.timer);
+ module.timer = setTimeout(function() {
+ if(module.is.focused()) {
+ module.query();
+ }
+ }, settings.searchDelay);
+ }
+ else {
+ module.query();
+ }
+ },
+ focus: function() {
+ module.set.focus();
+ if(settings.searchOnFocus && module.has.minimumCharacters() ) {
+ module.query(function() {
+ if(module.can.show() ) {
+ module.showResults();
+ }
+ });
+ }
+ },
+ blur: function(event) {
+ var
+ pageLostFocus = (document.activeElement === this),
+ callback = function() {
+ module.cancel.query();
+ module.remove.focus();
+ module.timer = setTimeout(module.hideResults, settings.hideDelay);
+ }
+ ;
+ if(pageLostFocus) {
+ return;
+ }
+ resultsDismissed = false;
+ if(module.resultsClicked) {
+ module.debug('Determining if user action caused search to close');
+ $module
+ .one('click.close' + eventNamespace, selector.results, function(event) {
+ if(module.is.inMessage(event) || disabledBubbled) {
+ $prompt.focus();
+ return;
+ }
+ disabledBubbled = false;
+ if( !module.is.animating() && !module.is.hidden()) {
+ callback();
+ }
+ })
+ ;
+ }
+ else {
+ module.debug('Input blurred without user action, closing results');
+ callback();
+ }
+ },
+ result: {
+ mousedown: function() {
+ module.resultsClicked = true;
+ },
+ mouseup: function() {
+ module.resultsClicked = false;
+ },
+ click: function(event) {
+ module.debug('Search result selected');
+ var
+ $result = $(this),
+ $title = $result.find(selector.title).eq(0),
+ $link = $result.is('a[href]')
+ ? $result
+ : $result.find('a[href]').eq(0),
+ href = $link.attr('href') || false,
+ target = $link.attr('target') || false,
+ // title is used for result lookup
+ value = ($title.length > 0)
+ ? $title.text()
+ : false,
+ results = module.get.results(),
+ result = $result.data(metadata.result) || module.get.result(value, results)
+ ;
+ var oldValue = module.get.value();
+ if( $.isFunction(settings.onSelect) ) {
+ if(settings.onSelect.call(element, result, results) === false) {
+ module.debug('Custom onSelect callback cancelled default select action');
+ disabledBubbled = true;
+ return;
+ }
+ }
+ module.hideResults();
+ if(value && module.get.value() === oldValue) {
+ module.set.value(value);
+ }
+ if(href) {
+ event.preventDefault();
+ module.verbose('Opening search link found in result', $link);
+ if(target == '_blank' || event.ctrlKey) {
+ window.open(href);
+ }
+ else {
+ window.location.href = (href);
+ }
+ }
+ }
+ }
+ },
+ ensureVisible: function($el) {
+ var elTop, elBottom, resultsScrollTop, resultsHeight;
+ if($el.length === 0) {
+ return;
+ }
+ elTop = $el.position().top;
+ elBottom = elTop + $el.outerHeight(true);
+
+ resultsScrollTop = $results.scrollTop();
+ resultsHeight = $results.height();
+
+ if (elTop < 0) {
+ $results.scrollTop(resultsScrollTop + elTop);
+ }
+
+ else if (resultsHeight < elBottom) {
+ $results.scrollTop(resultsScrollTop + (elBottom - resultsHeight));
+ }
+ },
+ handleKeyboard: function(event) {
+ var
+ // force selector refresh
+ $result = $module.find(selector.result),
+ $category = $module.find(selector.category),
+ $activeResult = $result.filter('.' + className.active),
+ currentIndex = $result.index( $activeResult ),
+ resultSize = $result.length,
+ hasActiveResult = $activeResult.length > 0,
+
+ keyCode = event.which,
+ keys = {
+ backspace : 8,
+ enter : 13,
+ escape : 27,
+ upArrow : 38,
+ downArrow : 40
+ },
+ newIndex
+ ;
+ // search shortcuts
+ if(keyCode == keys.escape) {
+ module.verbose('Escape key pressed, blurring search field');
+ module.hideResults();
+ resultsDismissed = true;
+ }
+ if( module.is.visible() ) {
+ if(keyCode == keys.enter) {
+ module.verbose('Enter key pressed, selecting active result');
+ if( $result.filter('.' + className.active).length > 0 ) {
+ module.event.result.click.call($result.filter('.' + className.active), event);
+ event.preventDefault();
+ return false;
+ }
+ }
+ else if(keyCode == keys.upArrow && hasActiveResult) {
+ module.verbose('Up key pressed, changing active result');
+ newIndex = (currentIndex - 1 < 0)
+ ? currentIndex
+ : currentIndex - 1
+ ;
+ $category
+ .removeClass(className.active)
+ ;
+ $result
+ .removeClass(className.active)
+ .eq(newIndex)
+ .addClass(className.active)
+ .closest($category)
+ .addClass(className.active)
+ ;
+ module.ensureVisible($result.eq(newIndex));
+ event.preventDefault();
+ }
+ else if(keyCode == keys.downArrow) {
+ module.verbose('Down key pressed, changing active result');
+ newIndex = (currentIndex + 1 >= resultSize)
+ ? currentIndex
+ : currentIndex + 1
+ ;
+ $category
+ .removeClass(className.active)
+ ;
+ $result
+ .removeClass(className.active)
+ .eq(newIndex)
+ .addClass(className.active)
+ .closest($category)
+ .addClass(className.active)
+ ;
+ module.ensureVisible($result.eq(newIndex));
+ event.preventDefault();
+ }
+ }
+ else {
+ // query shortcuts
+ if(keyCode == keys.enter) {
+ module.verbose('Enter key pressed, executing query');
+ module.query();
+ module.set.buttonPressed();
+ $prompt.one('keyup', module.remove.buttonFocus);
+ }
+ }
+ },
+
+ setup: {
+ api: function(searchTerm, callback) {
+ var
+ apiSettings = {
+ debug : settings.debug,
+ on : false,
+ cache : settings.cache,
+ action : 'search',
+ urlData : {
+ query : searchTerm
+ },
+ onSuccess : function(response) {
+ module.parse.response.call(element, response, searchTerm);
+ callback();
+ },
+ onFailure : function() {
+ module.displayMessage(error.serverError);
+ callback();
+ },
+ onAbort : function(response) {
+ },
+ onError : module.error
+ }
+ ;
+ $.extend(true, apiSettings, settings.apiSettings);
+ module.verbose('Setting up API request', apiSettings);
+ $module.api(apiSettings);
+ }
+ },
+
+ can: {
+ useAPI: function() {
+ return $.fn.api !== undefined;
+ },
+ show: function() {
+ return module.is.focused() && !module.is.visible() && !module.is.empty();
+ },
+ transition: function() {
+ return settings.transition && $.fn.transition !== undefined && $module.transition('is supported');
+ }
+ },
+
+ is: {
+ animating: function() {
+ return $results.hasClass(className.animating);
+ },
+ chrome: function() {
+ return !!window.chrome && (!!window.chrome.webstore || !!window.chrome.runtime);
+ },
+ hidden: function() {
+ return $results.hasClass(className.hidden);
+ },
+ inMessage: function(event) {
+ if(!event.target) {
+ return;
+ }
+ var
+ $target = $(event.target),
+ isInDOM = $.contains(document.documentElement, event.target)
+ ;
+ return (isInDOM && $target.closest(selector.message).length > 0);
+ },
+ empty: function() {
+ return ($results.html() === '');
+ },
+ visible: function() {
+ return ($results.filter(':visible').length > 0);
+ },
+ focused: function() {
+ return ($prompt.filter(':focus').length > 0);
+ }
+ },
+
+ get: {
+ settings: function() {
+ if($.isPlainObject(parameters) && parameters.searchFullText) {
+ settings.fullTextSearch = parameters.searchFullText;
+ module.error(settings.error.oldSearchSyntax, element);
+ }
+ if (settings.ignoreDiacritics && !String.prototype.normalize) {
+ settings.ignoreDiacritics = false;
+ module.error(error.noNormalize, element);
+ }
+ },
+ inputEvent: function() {
+ var
+ prompt = $prompt[0],
+ inputEvent = (prompt !== undefined && prompt.oninput !== undefined)
+ ? 'input'
+ : (prompt !== undefined && prompt.onpropertychange !== undefined)
+ ? 'propertychange'
+ : 'keyup'
+ ;
+ return inputEvent;
+ },
+ value: function() {
+ return $prompt.val();
+ },
+ results: function() {
+ var
+ results = $module.data(metadata.results)
+ ;
+ return results;
+ },
+ result: function(value, results) {
+ var
+ result = false
+ ;
+ value = (value !== undefined)
+ ? value
+ : module.get.value()
+ ;
+ results = (results !== undefined)
+ ? results
+ : module.get.results()
+ ;
+ if(settings.type === 'category') {
+ module.debug('Finding result that matches', value);
+ $.each(results, function(index, category) {
+ if(Array.isArray(category.results)) {
+ result = module.search.object(value, category.results)[0];
+ // don't continue searching if a result is found
+ if(result) {
+ return false;
+ }
+ }
+ });
+ }
+ else {
+ module.debug('Finding result in results object', value);
+ result = module.search.object(value, results)[0];
+ }
+ return result || false;
+ },
+ },
+
+ select: {
+ firstResult: function() {
+ module.verbose('Selecting first result');
+ $result.first().addClass(className.active);
+ }
+ },
+
+ set: {
+ focus: function() {
+ $module.addClass(className.focus);
+ },
+ loading: function() {
+ $module.addClass(className.loading);
+ },
+ value: function(value) {
+ module.verbose('Setting search input value', value);
+ $prompt
+ .val(value)
+ ;
+ },
+ type: function(type) {
+ type = type || settings.type;
+ if(settings.type == 'category') {
+ $module.addClass(settings.type);
+ }
+ },
+ buttonPressed: function() {
+ $searchButton.addClass(className.pressed);
+ }
+ },
+
+ remove: {
+ loading: function() {
+ $module.removeClass(className.loading);
+ },
+ focus: function() {
+ $module.removeClass(className.focus);
+ },
+ buttonPressed: function() {
+ $searchButton.removeClass(className.pressed);
+ },
+ diacritics: function(text) {
+ return settings.ignoreDiacritics ? text.normalize('NFD').replace(/[\u0300-\u036f]/g, '') : text;
+ }
+ },
+
+ query: function(callback) {
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ var
+ searchTerm = module.get.value(),
+ cache = module.read.cache(searchTerm)
+ ;
+ callback = callback || function() {};
+ if( module.has.minimumCharacters() ) {
+ if(cache) {
+ module.debug('Reading result from cache', searchTerm);
+ module.save.results(cache.results);
+ module.addResults(cache.html);
+ module.inject.id(cache.results);
+ callback();
+ }
+ else {
+ module.debug('Querying for', searchTerm);
+ if($.isPlainObject(settings.source) || Array.isArray(settings.source)) {
+ module.search.local(searchTerm);
+ callback();
+ }
+ else if( module.can.useAPI() ) {
+ module.search.remote(searchTerm, callback);
+ }
+ else {
+ module.error(error.source);
+ callback();
+ }
+ }
+ settings.onSearchQuery.call(element, searchTerm);
+ }
+ else {
+ module.hideResults();
+ }
+ },
+
+ search: {
+ local: function(searchTerm) {
+ var
+ results = module.search.object(searchTerm, settings.source),
+ searchHTML
+ ;
+ module.set.loading();
+ module.save.results(results);
+ module.debug('Returned full local search results', results);
+ if(settings.maxResults > 0) {
+ module.debug('Using specified max results', results);
+ results = results.slice(0, settings.maxResults);
+ }
+ if(settings.type == 'category') {
+ results = module.create.categoryResults(results);
+ }
+ searchHTML = module.generateResults({
+ results: results
+ });
+ module.remove.loading();
+ module.addResults(searchHTML);
+ module.inject.id(results);
+ module.write.cache(searchTerm, {
+ html : searchHTML,
+ results : results
+ });
+ },
+ remote: function(searchTerm, callback) {
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ if($module.api('is loading')) {
+ $module.api('abort');
+ }
+ module.setup.api(searchTerm, callback);
+ $module
+ .api('query')
+ ;
+ },
+ object: function(searchTerm, source, searchFields) {
+ searchTerm = module.remove.diacritics(String(searchTerm));
+ var
+ results = [],
+ exactResults = [],
+ fuzzyResults = [],
+ searchExp = searchTerm.replace(regExp.escape, '\\$&'),
+ matchRegExp = new RegExp(regExp.beginsWith + searchExp, 'i'),
+
+ // avoid duplicates when pushing results
+ addResult = function(array, result) {
+ var
+ notResult = ($.inArray(result, results) == -1),
+ notFuzzyResult = ($.inArray(result, fuzzyResults) == -1),
+ notExactResults = ($.inArray(result, exactResults) == -1)
+ ;
+ if(notResult && notFuzzyResult && notExactResults) {
+ array.push(result);
+ }
+ }
+ ;
+ source = source || settings.source;
+ searchFields = (searchFields !== undefined)
+ ? searchFields
+ : settings.searchFields
+ ;
+
+ // search fields should be array to loop correctly
+ if(!Array.isArray(searchFields)) {
+ searchFields = [searchFields];
+ }
+
+ // exit conditions if no source
+ if(source === undefined || source === false) {
+ module.error(error.source);
+ return [];
+ }
+ // iterate through search fields looking for matches
+ $.each(searchFields, function(index, field) {
+ $.each(source, function(label, content) {
+ var
+ fieldExists = (typeof content[field] == 'string') || (typeof content[field] == 'number')
+ ;
+ if(fieldExists) {
+ var text;
+ if (typeof content[field] === 'string'){
+ text = module.remove.diacritics(content[field]);
+ } else {
+ text = content[field].toString();
+ }
+ if( text.search(matchRegExp) !== -1) {
+ // content starts with value (first in results)
+ addResult(results, content);
+ }
+ else if(settings.fullTextSearch === 'exact' && module.exactSearch(searchTerm, text) ) {
+ // content fuzzy matches (last in results)
+ addResult(exactResults, content);
+ }
+ else if(settings.fullTextSearch == true && module.fuzzySearch(searchTerm, text) ) {
+ // content fuzzy matches (last in results)
+ addResult(fuzzyResults, content);
+ }
+ }
+ });
+ });
+ $.merge(exactResults, fuzzyResults);
+ $.merge(results, exactResults);
+ return results;
+ }
+ },
+ exactSearch: function (query, term) {
+ query = query.toLowerCase();
+ term = term.toLowerCase();
+ return term.indexOf(query) > -1;
+ },
+ fuzzySearch: function(query, term) {
+ var
+ termLength = term.length,
+ queryLength = query.length
+ ;
+ if(typeof query !== 'string') {
+ return false;
+ }
+ query = query.toLowerCase();
+ term = term.toLowerCase();
+ if(queryLength > termLength) {
+ return false;
+ }
+ if(queryLength === termLength) {
+ return (query === term);
+ }
+ search: for (var characterIndex = 0, nextCharacterIndex = 0; characterIndex < queryLength; characterIndex++) {
+ var
+ queryCharacter = query.charCodeAt(characterIndex)
+ ;
+ while(nextCharacterIndex < termLength) {
+ if(term.charCodeAt(nextCharacterIndex++) === queryCharacter) {
+ continue search;
+ }
+ }
+ return false;
+ }
+ return true;
+ },
+
+ parse: {
+ response: function(response, searchTerm) {
+ if(Array.isArray(response)){
+ var o={};
+ o[fields.results]=response;
+ response = o;
+ }
+ var
+ searchHTML = module.generateResults(response)
+ ;
+ module.verbose('Parsing server response', response);
+ if(response !== undefined) {
+ if(searchTerm !== undefined && response[fields.results] !== undefined) {
+ module.addResults(searchHTML);
+ module.inject.id(response[fields.results]);
+ module.write.cache(searchTerm, {
+ html : searchHTML,
+ results : response[fields.results]
+ });
+ module.save.results(response[fields.results]);
+ }
+ }
+ }
+ },
+
+ cancel: {
+ query: function() {
+ if( module.can.useAPI() ) {
+ $module.api('abort');
+ }
+ }
+ },
+
+ has: {
+ minimumCharacters: function() {
+ var
+ searchTerm = module.get.value(),
+ numCharacters = searchTerm.length
+ ;
+ return (numCharacters >= settings.minCharacters);
+ },
+ results: function() {
+ if($results.length === 0) {
+ return false;
+ }
+ var
+ html = $results.html()
+ ;
+ return html != '';
+ }
+ },
+
+ clear: {
+ cache: function(value) {
+ var
+ cache = $module.data(metadata.cache)
+ ;
+ if(!value) {
+ module.debug('Clearing cache', value);
+ $module.removeData(metadata.cache);
+ }
+ else if(value && cache && cache[value]) {
+ module.debug('Removing value from cache', value);
+ delete cache[value];
+ $module.data(metadata.cache, cache);
+ }
+ }
+ },
+
+ read: {
+ cache: function(name) {
+ var
+ cache = $module.data(metadata.cache)
+ ;
+ if(settings.cache) {
+ module.verbose('Checking cache for generated html for query', name);
+ return (typeof cache == 'object') && (cache[name] !== undefined)
+ ? cache[name]
+ : false
+ ;
+ }
+ return false;
+ }
+ },
+
+ create: {
+ categoryResults: function(results) {
+ var
+ categoryResults = {}
+ ;
+ $.each(results, function(index, result) {
+ if(!result.category) {
+ return;
+ }
+ if(categoryResults[result.category] === undefined) {
+ module.verbose('Creating new category of results', result.category);
+ categoryResults[result.category] = {
+ name : result.category,
+ results : [result]
+ };
+ }
+ else {
+ categoryResults[result.category].results.push(result);
+ }
+ });
+ return categoryResults;
+ },
+ id: function(resultIndex, categoryIndex) {
+ var
+ resultID = (resultIndex + 1), // not zero indexed
+ letterID,
+ id
+ ;
+ if(categoryIndex !== undefined) {
+ // start char code for "A"
+ letterID = String.fromCharCode(97 + categoryIndex);
+ id = letterID + resultID;
+ module.verbose('Creating category result id', id);
+ }
+ else {
+ id = resultID;
+ module.verbose('Creating result id', id);
+ }
+ return id;
+ },
+ results: function() {
+ if($results.length === 0) {
+ $results = $('
')
+ .addClass(className.results)
+ .appendTo($module)
+ ;
+ }
+ }
+ },
+
+ inject: {
+ result: function(result, resultIndex, categoryIndex) {
+ module.verbose('Injecting result into results');
+ var
+ $selectedResult = (categoryIndex !== undefined)
+ ? $results
+ .children().eq(categoryIndex)
+ .children(selector.results)
+ .first()
+ .children(selector.result)
+ .eq(resultIndex)
+ : $results
+ .children(selector.result).eq(resultIndex)
+ ;
+ module.verbose('Injecting results metadata', $selectedResult);
+ $selectedResult
+ .data(metadata.result, result)
+ ;
+ },
+ id: function(results) {
+ module.debug('Injecting unique ids into results');
+ var
+ // since results may be object, we must use counters
+ categoryIndex = 0,
+ resultIndex = 0
+ ;
+ if(settings.type === 'category') {
+ // iterate through each category result
+ $.each(results, function(index, category) {
+ if(category.results.length > 0){
+ resultIndex = 0;
+ $.each(category.results, function(index, result) {
+ if(result.id === undefined) {
+ result.id = module.create.id(resultIndex, categoryIndex);
+ }
+ module.inject.result(result, resultIndex, categoryIndex);
+ resultIndex++;
+ });
+ categoryIndex++;
+ }
+ });
+ }
+ else {
+ // top level
+ $.each(results, function(index, result) {
+ if(result.id === undefined) {
+ result.id = module.create.id(resultIndex);
+ }
+ module.inject.result(result, resultIndex);
+ resultIndex++;
+ });
+ }
+ return results;
+ }
+ },
+
+ save: {
+ results: function(results) {
+ module.verbose('Saving current search results to metadata', results);
+ $module.data(metadata.results, results);
+ }
+ },
+
+ write: {
+ cache: function(name, value) {
+ var
+ cache = ($module.data(metadata.cache) !== undefined)
+ ? $module.data(metadata.cache)
+ : {}
+ ;
+ if(settings.cache) {
+ module.verbose('Writing generated html to cache', name, value);
+ cache[name] = value;
+ $module
+ .data(metadata.cache, cache)
+ ;
+ }
+ }
+ },
+
+ addResults: function(html) {
+ if( $.isFunction(settings.onResultsAdd) ) {
+ if( settings.onResultsAdd.call($results, html) === false ) {
+ module.debug('onResultsAdd callback cancelled default action');
+ return false;
+ }
+ }
+ if(html) {
+ $results
+ .html(html)
+ ;
+ module.refreshResults();
+ if(settings.selectFirstResult) {
+ module.select.firstResult();
+ }
+ module.showResults();
+ }
+ else {
+ module.hideResults(function() {
+ $results.empty();
+ });
+ }
+ },
+
+ showResults: function(callback) {
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ if(resultsDismissed) {
+ return;
+ }
+ if(!module.is.visible() && module.has.results()) {
+ if( module.can.transition() ) {
+ module.debug('Showing results with css animations');
+ $results
+ .transition({
+ animation : settings.transition + ' in',
+ debug : settings.debug,
+ verbose : settings.verbose,
+ duration : settings.duration,
+ onShow : function() {
+ var $firstResult = $module.find(selector.result).eq(0);
+ module.ensureVisible($firstResult);
+ },
+ onComplete : function() {
+ callback();
+ },
+ queue : true
+ })
+ ;
+ }
+ else {
+ module.debug('Showing results with javascript');
+ $results
+ .stop()
+ .fadeIn(settings.duration, settings.easing)
+ ;
+ }
+ settings.onResultsOpen.call($results);
+ }
+ },
+ hideResults: function(callback) {
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ if( module.is.visible() ) {
+ if( module.can.transition() ) {
+ module.debug('Hiding results with css animations');
+ $results
+ .transition({
+ animation : settings.transition + ' out',
+ debug : settings.debug,
+ verbose : settings.verbose,
+ duration : settings.duration,
+ onComplete : function() {
+ callback();
+ },
+ queue : true
+ })
+ ;
+ }
+ else {
+ module.debug('Hiding results with javascript');
+ $results
+ .stop()
+ .fadeOut(settings.duration, settings.easing)
+ ;
+ }
+ settings.onResultsClose.call($results);
+ }
+ },
+
+ generateResults: function(response) {
+ module.debug('Generating html from response', response);
+ var
+ template = settings.templates[settings.type],
+ isProperObject = ($.isPlainObject(response[fields.results]) && !$.isEmptyObject(response[fields.results])),
+ isProperArray = (Array.isArray(response[fields.results]) && response[fields.results].length > 0),
+ html = ''
+ ;
+ if(isProperObject || isProperArray ) {
+ if(settings.maxResults > 0) {
+ if(isProperObject) {
+ if(settings.type == 'standard') {
+ module.error(error.maxResults);
+ }
+ }
+ else {
+ response[fields.results] = response[fields.results].slice(0, settings.maxResults);
+ }
+ }
+ if($.isFunction(template)) {
+ html = template(response, fields, settings.preserveHTML);
+ }
+ else {
+ module.error(error.noTemplate, false);
+ }
+ }
+ else if(settings.showNoResults) {
+ html = module.displayMessage(error.noResults, 'empty', error.noResultsHeader);
+ }
+ settings.onResults.call(element, response);
+ return html;
+ },
+
+ displayMessage: function(text, type, header) {
+ type = type || 'standard';
+ module.debug('Displaying message', text, type, header);
+ module.addResults( settings.templates.message(text, type, header) );
+ return settings.templates.message(text, type, header);
+ },
+
+ setting: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ settings[name] = value;
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if($allModules.length > 1) {
+ title += ' ' + '(' + $allModules.length + ')';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ return false;
+ }
+ });
+ }
+ if( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ }
+
+ })
+ ;
+
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.fn.search.settings = {
+
+ name : 'Search',
+ namespace : 'search',
+
+ silent : false,
+ debug : false,
+ verbose : false,
+ performance : true,
+
+ // template to use (specified in settings.templates)
+ type : 'standard',
+
+ // minimum characters required to search
+ minCharacters : 1,
+
+ // whether to select first result after searching automatically
+ selectFirstResult : false,
+
+ // API config
+ apiSettings : false,
+
+ // object to search
+ source : false,
+
+ // Whether search should query current term on focus
+ searchOnFocus : true,
+
+ // fields to search
+ searchFields : [
+ 'id',
+ 'title',
+ 'description'
+ ],
+
+ // field to display in standard results template
+ displayField : '',
+
+ // search anywhere in value (set to 'exact' to require exact matches
+ fullTextSearch : 'exact',
+
+ // match results also if they contain diacritics of the same base character (for example searching for "a" will also match "á" or "â" or "à ", etc...)
+ ignoreDiacritics : false,
+
+ // whether to add events to prompt automatically
+ automatic : true,
+
+ // delay before hiding menu after blur
+ hideDelay : 0,
+
+ // delay before searching
+ searchDelay : 200,
+
+ // maximum results returned from search
+ maxResults : 7,
+
+ // whether to store lookups in local cache
+ cache : true,
+
+ // whether no results errors should be shown
+ showNoResults : true,
+
+ // preserve possible html of resultset values
+ preserveHTML : true,
+
+ // transition settings
+ transition : 'scale',
+ duration : 200,
+ easing : 'easeOutExpo',
+
+ // callbacks
+ onSelect : false,
+ onResultsAdd : false,
+
+ onSearchQuery : function(query){},
+ onResults : function(response){},
+
+ onResultsOpen : function(){},
+ onResultsClose : function(){},
+
+ className: {
+ animating : 'animating',
+ active : 'active',
+ empty : 'empty',
+ focus : 'focus',
+ hidden : 'hidden',
+ loading : 'loading',
+ results : 'results',
+ pressed : 'down'
+ },
+
+ error : {
+ source : 'Cannot search. No source used, and Semantic API module was not included',
+ noResultsHeader : 'No Results',
+ noResults : 'Your search returned no results',
+ logging : 'Error in debug logging, exiting.',
+ noEndpoint : 'No search endpoint was specified',
+ noTemplate : 'A valid template name was not specified.',
+ oldSearchSyntax : 'searchFullText setting has been renamed fullTextSearch for consistency, please adjust your settings.',
+ serverError : 'There was an issue querying the server.',
+ maxResults : 'Results must be an array to use maxResults setting',
+ method : 'The method you called is not defined.',
+ noNormalize : '"ignoreDiacritics" setting will be ignored. Browser does not support String().normalize(). You may consider including as a polyfill.'
+ },
+
+ metadata: {
+ cache : 'cache',
+ results : 'results',
+ result : 'result'
+ },
+
+ regExp: {
+ escape : /[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,
+ beginsWith : '(?:\s|^)'
+ },
+
+ // maps api response attributes to internal representation
+ fields: {
+ categories : 'results', // array of categories (category view)
+ categoryName : 'name', // name of category (category view)
+ categoryResults : 'results', // array of results (category view)
+ description : 'description', // result description
+ image : 'image', // result image
+ price : 'price', // result price
+ results : 'results', // array of results (standard)
+ title : 'title', // result title
+ url : 'url', // result url
+ action : 'action', // "view more" object name
+ actionText : 'text', // "view more" text
+ actionURL : 'url' // "view more" url
+ },
+
+ selector : {
+ prompt : '.prompt',
+ searchButton : '.search.button',
+ results : '.results',
+ message : '.results > .message',
+ category : '.category',
+ result : '.result',
+ title : '.title, .name'
+ },
+
+ templates: {
+ escape: function(string, preserveHTML) {
+ if (preserveHTML){
+ return string;
+ }
+ var
+ badChars = /[<>"'`]/g,
+ shouldEscape = /[&<>"'`]/,
+ escape = {
+ "<": "<",
+ ">": ">",
+ '"': """,
+ "'": "'",
+ "`": "`"
+ },
+ escapedChar = function(chr) {
+ return escape[chr];
+ }
+ ;
+ if(shouldEscape.test(string)) {
+ string = string.replace(/&(?![a-z0-9#]{1,6};)/, "&");
+ return string.replace(badChars, escapedChar);
+ }
+ return string;
+ },
+ message: function(message, type, header) {
+ var
+ html = ''
+ ;
+ if(message !== undefined && type !== undefined) {
+ html += ''
+ + ''
+ ;
+ if(header) {
+ html += ''
+ + ''
+ ;
+ }
+ html += '
' + message + '
';
+ html += '
';
+ }
+ return html;
+ },
+ category: function(response, fields, preserveHTML) {
+ var
+ html = '',
+ escape = $.fn.search.settings.templates.escape
+ ;
+ if(response[fields.categoryResults] !== undefined) {
+
+ // each category
+ $.each(response[fields.categoryResults], function(index, category) {
+ if(category[fields.results] !== undefined && category.results.length > 0) {
+
+ html += '';
+
+ if(category[fields.categoryName] !== undefined) {
+ html += '
' + escape(category[fields.categoryName], preserveHTML) + '
';
+ }
+
+ // each item inside category
+ html += '
';
+ html += ''
+ + '
'
+ ;
+ }
+ });
+ if(response[fields.action]) {
+ if(fields.actionURL === false) {
+ html += ''
+ + ''
+ + escape(response[fields.action][fields.actionText], preserveHTML)
+ + '
';
+ } else {
+ html += ''
+ + ''
+ + escape(response[fields.action][fields.actionText], preserveHTML)
+ + ' ';
+ }
+ }
+ return html;
+ }
+ return false;
+ },
+ standard: function(response, fields, preserveHTML) {
+ var
+ html = '',
+ escape = $.fn.search.settings.templates.escape
+ ;
+ if(response[fields.results] !== undefined) {
+
+ // each result
+ $.each(response[fields.results], function(index, result) {
+ if(result[fields.url]) {
+ html += '';
+ }
+ else {
+ html += ' ';
+ }
+ if(result[fields.image] !== undefined) {
+ html += ''
+ + ''
+ + '
'
+ + '
'
+ ;
+ }
+ html += '';
+ if(result[fields.price] !== undefined) {
+ html += '
' + escape(result[fields.price], preserveHTML) + '
';
+ }
+ if(result[fields.title] !== undefined) {
+ html += '
' + escape(result[fields.title], preserveHTML) + '
';
+ }
+ if(result[fields.description] !== undefined) {
+ html += '
' + escape(result[fields.description], preserveHTML) + '
';
+ }
+ html += ''
+ + '
'
+ ;
+ html += ' ';
+ });
+ if(response[fields.action]) {
+ if(fields.actionURL === false) {
+ html += ''
+ + ''
+ + escape(response[fields.action][fields.actionText], preserveHTML)
+ + '
';
+ } else {
+ html += ''
+ + ''
+ + escape(response[fields.action][fields.actionText], preserveHTML)
+ + ' ';
+ }
+ }
+ return html;
+ }
+ return false;
+ }
+ }
+};
+
+})( jQuery, window, document );
+
+/*!
+ * # Fomantic-UI 2.8.8 - Shape
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+'use strict';
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.shape = function(parameters) {
+ var
+ $allModules = $(this),
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+
+ requestAnimationFrame = window.requestAnimationFrame
+ || window.mozRequestAnimationFrame
+ || window.webkitRequestAnimationFrame
+ || window.msRequestAnimationFrame
+ || function(callback) { setTimeout(callback, 0); },
+
+ returnedValue
+ ;
+
+ $allModules
+ .each(function() {
+ var
+ moduleSelector = $allModules.selector || '',
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.fn.shape.settings, parameters)
+ : $.extend({}, $.fn.shape.settings),
+
+ // internal aliases
+ namespace = settings.namespace,
+ selector = settings.selector,
+ error = settings.error,
+ className = settings.className,
+
+ // define namespaces for modules
+ eventNamespace = '.' + namespace,
+ moduleNamespace = 'module-' + namespace,
+
+ // selector cache
+ $module = $(this),
+ $sides = $module.find('>' + selector.sides),
+ $side = $sides.find('>' + selector.side),
+
+ // private variables
+ nextIndex = false,
+ $activeSide,
+ $nextSide,
+
+ // standard module
+ element = this,
+ instance = $module.data(moduleNamespace),
+ module
+ ;
+
+ module = {
+
+ initialize: function() {
+ module.verbose('Initializing module for', element);
+ module.set.defaultSide();
+ module.instantiate();
+ },
+
+ instantiate: function() {
+ module.verbose('Storing instance of module', module);
+ instance = module;
+ $module
+ .data(moduleNamespace, instance)
+ ;
+ },
+
+ destroy: function() {
+ module.verbose('Destroying previous module for', element);
+ $module
+ .removeData(moduleNamespace)
+ .off(eventNamespace)
+ ;
+ },
+
+ refresh: function() {
+ module.verbose('Refreshing selector cache for', element);
+ $module = $(element);
+ $sides = $(this).find(selector.sides);
+ $side = $(this).find(selector.side);
+ },
+
+ repaint: function() {
+ module.verbose('Forcing repaint event');
+ var
+ shape = $sides[0] || document.createElement('div'),
+ fakeAssignment = shape.offsetWidth
+ ;
+ },
+
+ animate: function(propertyObject, callback) {
+ module.verbose('Animating box with properties', propertyObject);
+ callback = callback || function(event) {
+ module.verbose('Executing animation callback');
+ if(event !== undefined) {
+ event.stopPropagation();
+ }
+ module.reset();
+ module.set.active();
+ };
+ settings.beforeChange.call($nextSide[0]);
+ if(module.get.transitionEvent()) {
+ module.verbose('Starting CSS animation');
+ $module
+ .addClass(className.animating)
+ ;
+ $sides
+ .css(propertyObject)
+ .one(module.get.transitionEvent(), callback)
+ ;
+ module.set.duration(settings.duration);
+ requestAnimationFrame(function() {
+ $module
+ .addClass(className.animating)
+ ;
+ $activeSide
+ .addClass(className.hidden)
+ ;
+ });
+ }
+ else {
+ callback();
+ }
+ },
+
+ queue: function(method) {
+ module.debug('Queueing animation of', method);
+ $sides
+ .one(module.get.transitionEvent(), function() {
+ module.debug('Executing queued animation');
+ setTimeout(function(){
+ $module.shape(method);
+ }, 0);
+ })
+ ;
+ },
+
+ reset: function() {
+ module.verbose('Animating states reset');
+ $module
+ .removeClass(className.animating)
+ .attr('style', '')
+ .removeAttr('style')
+ ;
+ // removeAttr style does not consistently work in safari
+ $sides
+ .attr('style', '')
+ .removeAttr('style')
+ ;
+ $side
+ .attr('style', '')
+ .removeAttr('style')
+ .removeClass(className.hidden)
+ ;
+ $nextSide
+ .removeClass(className.animating)
+ .attr('style', '')
+ .removeAttr('style')
+ ;
+ },
+
+ is: {
+ complete: function() {
+ return ($side.filter('.' + className.active)[0] == $nextSide[0]);
+ },
+ animating: function() {
+ return $module.hasClass(className.animating);
+ },
+ hidden: function() {
+ return $module.closest(':hidden').length > 0;
+ }
+ },
+
+ set: {
+
+ defaultSide: function() {
+ $activeSide = $side.filter('.' + settings.className.active);
+ $nextSide = ( $activeSide.next(selector.side).length > 0 )
+ ? $activeSide.next(selector.side)
+ : $side.first()
+ ;
+ nextIndex = false;
+ module.verbose('Active side set to', $activeSide);
+ module.verbose('Next side set to', $nextSide);
+ },
+
+ duration: function(duration) {
+ duration = duration || settings.duration;
+ duration = (typeof duration == 'number')
+ ? duration + 'ms'
+ : duration
+ ;
+ module.verbose('Setting animation duration', duration);
+ if(settings.duration || settings.duration === 0) {
+ $sides.add($side)
+ .css({
+ '-webkit-transition-duration': duration,
+ '-moz-transition-duration': duration,
+ '-ms-transition-duration': duration,
+ '-o-transition-duration': duration,
+ 'transition-duration': duration
+ })
+ ;
+ }
+ },
+
+ currentStageSize: function() {
+ var
+ $activeSide = $side.filter('.' + settings.className.active),
+ width = $activeSide.outerWidth(true),
+ height = $activeSide.outerHeight(true)
+ ;
+ $module
+ .css({
+ width: width,
+ height: height
+ })
+ ;
+ },
+
+ stageSize: function() {
+ var
+ $clone = $module.clone().addClass(className.loading),
+ $side = $clone.find('>' + selector.sides + '>' + selector.side),
+ $activeSide = $side.filter('.' + settings.className.active),
+ $nextSide = (nextIndex)
+ ? $side.eq(nextIndex)
+ : ( $activeSide.next(selector.side).length > 0 )
+ ? $activeSide.next(selector.side)
+ : $side.first(),
+ newWidth = (settings.width === 'next')
+ ? $nextSide.outerWidth(true)
+ : (settings.width === 'initial')
+ ? $module.width()
+ : settings.width,
+ newHeight = (settings.height === 'next')
+ ? $nextSide.outerHeight(true)
+ : (settings.height === 'initial')
+ ? $module.height()
+ : settings.height
+ ;
+ $activeSide.removeClass(className.active);
+ $nextSide.addClass(className.active);
+ $clone.insertAfter($module);
+ $clone.remove();
+ if(settings.width !== 'auto') {
+ $module.css('width', newWidth + settings.jitter);
+ module.verbose('Specifying width during animation', newWidth);
+ }
+ if(settings.height !== 'auto') {
+ $module.css('height', newHeight + settings.jitter);
+ module.verbose('Specifying height during animation', newHeight);
+ }
+ },
+
+ nextSide: function(selector) {
+ nextIndex = selector;
+ $nextSide = $side.filter(selector);
+ nextIndex = $side.index($nextSide);
+ if($nextSide.length === 0) {
+ module.set.defaultSide();
+ module.error(error.side);
+ }
+ module.verbose('Next side manually set to', $nextSide);
+ },
+
+ active: function() {
+ module.verbose('Setting new side to active', $nextSide);
+ $side
+ .removeClass(className.active)
+ ;
+ $nextSide
+ .addClass(className.active)
+ ;
+ settings.onChange.call($nextSide[0]);
+ module.set.defaultSide();
+ }
+ },
+
+ flip: {
+ to: function(type,stage){
+ if(module.is.hidden()) {
+ module.debug('Module not visible', $nextSide);
+ return;
+ }
+ if(module.is.complete() && !module.is.animating() && !settings.allowRepeats) {
+ module.debug('Side already visible', $nextSide);
+ return;
+ }
+ var
+ transform = module.get.transform[type]()
+ ;
+ if( !module.is.animating()) {
+ module.debug('Flipping '+type, $nextSide);
+ module.set.stageSize();
+ module.stage[stage]();
+ module.animate(transform);
+ }
+ else {
+ module.queue('flip '+type);
+ }
+ },
+
+ up: function() {
+ module.flip.to('up','above');
+ },
+
+ down: function() {
+ module.flip.to('down','below');
+ },
+
+ left: function() {
+ module.flip.to('left','left');
+ },
+
+ right: function() {
+ module.flip.to('right','right');
+ },
+
+ over: function() {
+ module.flip.to('over','behind');
+ },
+
+ back: function() {
+ module.flip.to('back','behind');
+ }
+
+ },
+
+ get: {
+
+ transform: {
+ up: function() {
+ var
+ translateZ = $activeSide.outerHeight(true) / 2,
+ translateY = $nextSide.outerHeight(true) - translateZ
+ ;
+ return {
+ transform: 'translateY(' + translateY + 'px) translateZ(-'+ translateZ + 'px) rotateX(-90deg)'
+ };
+ },
+
+ down: function() {
+ var
+ translate = {
+ z: $activeSide.outerHeight(true) / 2
+ }
+ ;
+ return {
+ transform: 'translateY(-' + translate.z + 'px) translateZ(-'+ translate.z + 'px) rotateX(90deg)'
+ };
+ },
+
+ left: function() {
+ var
+ translateZ = $activeSide.outerWidth(true) / 2,
+ translateX = $nextSide.outerWidth(true) - translateZ
+ ;
+ return {
+ transform: 'translateX(' + translateX + 'px) translateZ(-' + translateZ + 'px) rotateY(90deg)'
+ };
+ },
+
+ right: function() {
+ var
+ translate = {
+ z : $activeSide.outerWidth(true) / 2
+ }
+ ;
+ return {
+ transform: 'translateX(-' + translate.z + 'px) translateZ(-' + translate.z + 'px) rotateY(-90deg)'
+ };
+ },
+
+ over: function() {
+ var
+ translate = {
+ x : -(($activeSide.outerWidth(true) - $nextSide.outerWidth(true)) / 2)
+ }
+ ;
+ return {
+ transform: 'translateX(' + translate.x + 'px) rotateY(180deg)'
+ };
+ },
+
+ back: function() {
+ var
+ translate = {
+ x : -(($activeSide.outerWidth(true) - $nextSide.outerWidth(true)) / 2)
+ }
+ ;
+ return {
+ transform: 'translateX(' + translate.x + 'px) rotateY(-180deg)'
+ };
+ }
+ },
+
+ transitionEvent: function() {
+ var
+ element = document.createElement('element'),
+ transitions = {
+ 'transition' :'transitionend',
+ 'OTransition' :'oTransitionEnd',
+ 'MozTransition' :'transitionend',
+ 'WebkitTransition' :'webkitTransitionEnd'
+ },
+ transition
+ ;
+ for(transition in transitions){
+ if( element.style[transition] !== undefined ){
+ return transitions[transition];
+ }
+ }
+ },
+
+ nextSide: function() {
+ return ( $activeSide.next(selector.side).length > 0 )
+ ? $activeSide.next(selector.side)
+ : $side.first()
+ ;
+ }
+
+ },
+
+ stage: {
+
+ above: function() {
+ var
+ box = {
+ origin : (($activeSide.outerHeight(true) - $nextSide.outerHeight(true)) / 2),
+ depth : {
+ active : ($nextSide.outerHeight(true) / 2),
+ next : ($activeSide.outerHeight(true) / 2)
+ }
+ }
+ ;
+ module.verbose('Setting the initial animation position as above', $nextSide, box);
+ $activeSide
+ .css({
+ 'transform' : 'rotateX(0deg)'
+ })
+ ;
+ $nextSide
+ .addClass(className.animating)
+ .css({
+ 'top' : box.origin + 'px',
+ 'transform' : 'rotateX(90deg) translateZ(' + box.depth.next + 'px) translateY(-' + box.depth.active + 'px)'
+ })
+ ;
+ },
+
+ below: function() {
+ var
+ box = {
+ origin : (($activeSide.outerHeight(true) - $nextSide.outerHeight(true)) / 2),
+ depth : {
+ active : ($nextSide.outerHeight(true) / 2),
+ next : ($activeSide.outerHeight(true) / 2)
+ }
+ }
+ ;
+ module.verbose('Setting the initial animation position as below', $nextSide, box);
+ $activeSide
+ .css({
+ 'transform' : 'rotateX(0deg)'
+ })
+ ;
+ $nextSide
+ .addClass(className.animating)
+ .css({
+ 'top' : box.origin + 'px',
+ 'transform' : 'rotateX(-90deg) translateZ(' + box.depth.next + 'px) translateY(' + box.depth.active + 'px)'
+ })
+ ;
+ },
+
+ left: function() {
+ var
+ height = {
+ active : $activeSide.outerWidth(true),
+ next : $nextSide.outerWidth(true)
+ },
+ box = {
+ origin : ( ( height.active - height.next ) / 2),
+ depth : {
+ active : (height.next / 2),
+ next : (height.active / 2)
+ }
+ }
+ ;
+ module.verbose('Setting the initial animation position as left', $nextSide, box);
+ $activeSide
+ .css({
+ 'transform' : 'rotateY(0deg)'
+ })
+ ;
+ $nextSide
+ .addClass(className.animating)
+ .css({
+ 'left' : box.origin + 'px',
+ 'transform' : 'rotateY(-90deg) translateZ(' + box.depth.next + 'px) translateX(-' + box.depth.active + 'px)'
+ })
+ ;
+ },
+
+ right: function() {
+ var
+ height = {
+ active : $activeSide.outerWidth(true),
+ next : $nextSide.outerWidth(true)
+ },
+ box = {
+ origin : ( ( height.active - height.next ) / 2),
+ depth : {
+ active : (height.next / 2),
+ next : (height.active / 2)
+ }
+ }
+ ;
+ module.verbose('Setting the initial animation position as right', $nextSide, box);
+ $activeSide
+ .css({
+ 'transform' : 'rotateY(0deg)'
+ })
+ ;
+ $nextSide
+ .addClass(className.animating)
+ .css({
+ 'left' : box.origin + 'px',
+ 'transform' : 'rotateY(90deg) translateZ(' + box.depth.next + 'px) translateX(' + box.depth.active + 'px)'
+ })
+ ;
+ },
+
+ behind: function() {
+ var
+ height = {
+ active : $activeSide.outerWidth(true),
+ next : $nextSide.outerWidth(true)
+ },
+ box = {
+ origin : ( ( height.active - height.next ) / 2),
+ depth : {
+ active : (height.next / 2),
+ next : (height.active / 2)
+ }
+ }
+ ;
+ module.verbose('Setting the initial animation position as behind', $nextSide, box);
+ $activeSide
+ .css({
+ 'transform' : 'rotateY(0deg)'
+ })
+ ;
+ $nextSide
+ .addClass(className.animating)
+ .css({
+ 'left' : box.origin + 'px',
+ 'transform' : 'rotateY(-180deg)'
+ })
+ ;
+ }
+ },
+ setting: function(name, value) {
+ module.debug('Changing setting', name, value);
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ if($.isPlainObject(settings[name])) {
+ $.extend(true, settings[name], value);
+ }
+ else {
+ settings[name] = value;
+ }
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if($allModules.length > 1) {
+ title += ' ' + '(' + $allModules.length + ')';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ var $inputs = $module.find('input');
+ if( $inputs.length > 0) {
+ $inputs.blur();
+ setTimeout(function(){
+ module.invoke(query);
+ }, 150);
+ } else {
+ module.invoke(query);
+ }
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ }
+ })
+ ;
+
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.fn.shape.settings = {
+
+ // module info
+ name : 'Shape',
+
+ // hide all debug content
+ silent : false,
+
+ // debug content outputted to console
+ debug : false,
+
+ // verbose debug output
+ verbose : false,
+
+ // fudge factor in pixels when swapping from 2d to 3d (can be useful to correct rounding errors)
+ jitter : 0,
+
+ // performance data output
+ performance: true,
+
+ // event namespace
+ namespace : 'shape',
+
+ // width during animation, can be set to 'auto', initial', 'next' or pixel amount
+ width: 'initial',
+
+ // height during animation, can be set to 'auto', 'initial', 'next' or pixel amount
+ height: 'initial',
+
+ // callback occurs on side change
+ beforeChange : function() {},
+ onChange : function() {},
+
+ // allow animation to same side
+ allowRepeats: false,
+
+ // animation duration
+ duration : false,
+
+ // possible errors
+ error: {
+ side : 'You tried to switch to a side that does not exist.',
+ method : 'The method you called is not defined'
+ },
+
+ // classnames used
+ className : {
+ animating : 'animating',
+ hidden : 'hidden',
+ loading : 'loading',
+ active : 'active'
+ },
+
+ // selectors used
+ selector : {
+ sides : '.sides',
+ side : '.side'
+ }
+
+};
+
+
+})( jQuery, window, document );
+
+/*!
+ * # Fomantic-UI 2.8.8 - Sidebar
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+'use strict';
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.sidebar = function(parameters) {
+ var
+ $allModules = $(this),
+ $window = $(window),
+ $document = $(document),
+ $html = $('html'),
+ $head = $('head'),
+
+ moduleSelector = $allModules.selector || '',
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+
+ requestAnimationFrame = window.requestAnimationFrame
+ || window.mozRequestAnimationFrame
+ || window.webkitRequestAnimationFrame
+ || window.msRequestAnimationFrame
+ || function(callback) { setTimeout(callback, 0); },
+
+ returnedValue
+ ;
+
+ $allModules
+ .each(function() {
+ var
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.fn.sidebar.settings, parameters)
+ : $.extend({}, $.fn.sidebar.settings),
+
+ selector = settings.selector,
+ className = settings.className,
+ namespace = settings.namespace,
+ regExp = settings.regExp,
+ error = settings.error,
+
+ eventNamespace = '.' + namespace,
+ moduleNamespace = 'module-' + namespace,
+
+ $module = $(this),
+ $context = $(settings.context),
+
+ $sidebars = $module.children(selector.sidebar),
+ $fixed = $context.children(selector.fixed),
+ $pusher = $context.children(selector.pusher),
+ $style,
+
+ element = this,
+ instance = $module.data(moduleNamespace),
+
+ elementNamespace,
+ id,
+ currentScroll,
+ transitionEvent,
+
+ module
+ ;
+
+ module = {
+
+ initialize: function() {
+ module.debug('Initializing sidebar', parameters);
+
+ module.create.id();
+
+ transitionEvent = module.get.transitionEvent();
+
+ // avoids locking rendering if initialized in onReady
+ if(settings.delaySetup) {
+ requestAnimationFrame(module.setup.layout);
+ }
+ else {
+ module.setup.layout();
+ }
+
+ requestAnimationFrame(function() {
+ module.setup.cache();
+ });
+
+ module.instantiate();
+ },
+
+ instantiate: function() {
+ module.verbose('Storing instance of module', module);
+ instance = module;
+ $module
+ .data(moduleNamespace, module)
+ ;
+ },
+
+ create: {
+ id: function() {
+ id = (Math.random().toString(16) + '000000000').substr(2,8);
+ elementNamespace = '.' + id;
+ module.verbose('Creating unique id for element', id);
+ }
+ },
+
+ destroy: function() {
+ module.verbose('Destroying previous module for', $module);
+ $module
+ .off(eventNamespace)
+ .removeData(moduleNamespace)
+ ;
+ if(module.is.ios()) {
+ module.remove.ios();
+ }
+ // bound by uuid
+ $context.off(elementNamespace);
+ $window.off(elementNamespace);
+ $document.off(elementNamespace);
+ },
+
+ event: {
+ clickaway: function(event) {
+ if(settings.closable){
+ var
+ clickedInPusher = ($pusher.find(event.target).length > 0 || $pusher.is(event.target)),
+ clickedContext = ($context.is(event.target))
+ ;
+ if(clickedInPusher) {
+ module.verbose('User clicked on dimmed page');
+ module.hide();
+ }
+ if(clickedContext) {
+ module.verbose('User clicked on dimmable context (scaled out page)');
+ module.hide();
+ }
+ }
+ },
+ touch: function(event) {
+ //event.stopPropagation();
+ },
+ containScroll: function(event) {
+ if(element.scrollTop <= 0) {
+ element.scrollTop = 1;
+ }
+ if((element.scrollTop + element.offsetHeight) >= element.scrollHeight) {
+ element.scrollTop = element.scrollHeight - element.offsetHeight - 1;
+ }
+ },
+ scroll: function(event) {
+ if( $(event.target).closest(selector.sidebar).length === 0 ) {
+ event.preventDefault();
+ }
+ }
+ },
+
+ bind: {
+ clickaway: function() {
+ module.verbose('Adding clickaway events to context', $context);
+ $context
+ .on('click' + elementNamespace, module.event.clickaway)
+ .on('touchend' + elementNamespace, module.event.clickaway)
+ ;
+ },
+ scrollLock: function() {
+ if(settings.scrollLock) {
+ module.debug('Disabling page scroll');
+ $window
+ .on('DOMMouseScroll' + elementNamespace, module.event.scroll)
+ ;
+ }
+ module.verbose('Adding events to contain sidebar scroll');
+ $document
+ .on('touchmove' + elementNamespace, module.event.touch)
+ ;
+ $module
+ .on('scroll' + eventNamespace, module.event.containScroll)
+ ;
+ }
+ },
+ unbind: {
+ clickaway: function() {
+ module.verbose('Removing clickaway events from context', $context);
+ $context.off(elementNamespace);
+ },
+ scrollLock: function() {
+ module.verbose('Removing scroll lock from page');
+ $document.off(elementNamespace);
+ $window.off(elementNamespace);
+ $module.off('scroll' + eventNamespace);
+ }
+ },
+
+ add: {
+ inlineCSS: function() {
+ var
+ width = module.cache.width || $module.outerWidth(),
+ height = module.cache.height || $module.outerHeight(),
+ isRTL = module.is.rtl(),
+ direction = module.get.direction(),
+ distance = {
+ left : width,
+ right : -width,
+ top : height,
+ bottom : -height
+ },
+ style
+ ;
+
+ if(isRTL){
+ module.verbose('RTL detected, flipping widths');
+ distance.left = -width;
+ distance.right = width;
+ }
+
+ style = '';
+ $style = $(style)
+ .appendTo($head)
+ ;
+ module.debug('Adding sizing css to head', $style);
+ }
+ },
+
+ refresh: function() {
+ module.verbose('Refreshing selector cache');
+ $context = $(settings.context);
+ $sidebars = $context.children(selector.sidebar);
+ $pusher = $context.children(selector.pusher);
+ $fixed = $context.children(selector.fixed);
+ module.clear.cache();
+ },
+
+ refreshSidebars: function() {
+ module.verbose('Refreshing other sidebars');
+ $sidebars = $context.children(selector.sidebar);
+ },
+
+ repaint: function() {
+ module.verbose('Forcing repaint event');
+ element.style.display = 'none';
+ var ignored = element.offsetHeight;
+ element.scrollTop = element.scrollTop;
+ element.style.display = '';
+ },
+
+ setup: {
+ cache: function() {
+ module.cache = {
+ width : $module.outerWidth(),
+ height : $module.outerHeight()
+ };
+ },
+ layout: function() {
+ if( $context.children(selector.pusher).length === 0 ) {
+ module.debug('Adding wrapper element for sidebar');
+ module.error(error.pusher);
+ $pusher = $('
');
+ $context
+ .children()
+ .not(selector.omitted)
+ .not($sidebars)
+ .wrapAll($pusher)
+ ;
+ module.refresh();
+ }
+ if($module.nextAll(selector.pusher).length === 0 || $module.nextAll(selector.pusher)[0] !== $pusher[0]) {
+ module.debug('Moved sidebar to correct parent element');
+ module.error(error.movedSidebar, element);
+ $module.detach().prependTo($context);
+ module.refresh();
+ }
+ module.clear.cache();
+ module.set.pushable();
+ module.set.direction();
+ }
+ },
+
+ attachEvents: function(selector, event) {
+ var
+ $toggle = $(selector)
+ ;
+ event = $.isFunction(module[event])
+ ? module[event]
+ : module.toggle
+ ;
+ if($toggle.length > 0) {
+ module.debug('Attaching sidebar events to element', selector, event);
+ $toggle
+ .on('click' + eventNamespace, event)
+ ;
+ }
+ else {
+ module.error(error.notFound, selector);
+ }
+ },
+
+ show: function(callback) {
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ if(module.is.hidden()) {
+ module.refreshSidebars();
+ if(settings.overlay) {
+ module.error(error.overlay);
+ settings.transition = 'overlay';
+ }
+ module.refresh();
+ if(module.othersActive()) {
+ module.debug('Other sidebars currently visible');
+ if(settings.exclusive) {
+ // if not overlay queue animation after hide
+ if(settings.transition != 'overlay') {
+ module.hideOthers(module.show);
+ return;
+ }
+ else {
+ module.hideOthers();
+ }
+ }
+ else {
+ settings.transition = 'overlay';
+ }
+ }
+ module.pushPage(function() {
+ callback.call(element);
+ settings.onShow.call(element);
+ });
+ settings.onChange.call(element);
+ settings.onVisible.call(element);
+ }
+ else {
+ module.debug('Sidebar is already visible');
+ }
+ },
+
+ hide: function(callback) {
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ if(module.is.visible() || module.is.animating()) {
+ module.debug('Hiding sidebar', callback);
+ module.refreshSidebars();
+ module.pullPage(function() {
+ callback.call(element);
+ settings.onHidden.call(element);
+ });
+ settings.onChange.call(element);
+ settings.onHide.call(element);
+ }
+ },
+
+ othersAnimating: function() {
+ return ($sidebars.not($module).filter('.' + className.animating).length > 0);
+ },
+ othersVisible: function() {
+ return ($sidebars.not($module).filter('.' + className.visible).length > 0);
+ },
+ othersActive: function() {
+ return(module.othersVisible() || module.othersAnimating());
+ },
+
+ hideOthers: function(callback) {
+ var
+ $otherSidebars = $sidebars.not($module).filter('.' + className.visible),
+ sidebarCount = $otherSidebars.length,
+ callbackCount = 0
+ ;
+ callback = callback || function(){};
+ $otherSidebars
+ .sidebar('hide', function() {
+ callbackCount++;
+ if(callbackCount == sidebarCount) {
+ callback();
+ }
+ })
+ ;
+ },
+
+ toggle: function() {
+ module.verbose('Determining toggled direction');
+ if(module.is.hidden()) {
+ module.show();
+ }
+ else {
+ module.hide();
+ }
+ },
+
+ pushPage: function(callback) {
+ var
+ transition = module.get.transition(),
+ $transition = (transition === 'overlay' || module.othersActive())
+ ? $module
+ : $pusher,
+ animate,
+ dim,
+ transitionEnd
+ ;
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ if(settings.transition == 'scale down') {
+ module.scrollToTop();
+ }
+ module.set.transition(transition);
+ module.repaint();
+ animate = function() {
+ module.bind.clickaway();
+ module.add.inlineCSS();
+ module.set.animating();
+ module.set.visible();
+ };
+ dim = function() {
+ module.set.dimmed();
+ };
+ transitionEnd = function(event) {
+ if( event.target == $transition[0] ) {
+ $transition.off(transitionEvent + elementNamespace, transitionEnd);
+ module.remove.animating();
+ module.bind.scrollLock();
+ callback.call(element);
+ }
+ };
+ $transition.off(transitionEvent + elementNamespace);
+ $transition.on(transitionEvent + elementNamespace, transitionEnd);
+ requestAnimationFrame(animate);
+ if(settings.dimPage && !module.othersVisible()) {
+ requestAnimationFrame(dim);
+ }
+ },
+
+ pullPage: function(callback) {
+ var
+ transition = module.get.transition(),
+ $transition = (transition == 'overlay' || module.othersActive())
+ ? $module
+ : $pusher,
+ animate,
+ transitionEnd
+ ;
+ callback = $.isFunction(callback)
+ ? callback
+ : function(){}
+ ;
+ module.verbose('Removing context push state', module.get.direction());
+
+ module.unbind.clickaway();
+ module.unbind.scrollLock();
+
+ animate = function() {
+ module.set.transition(transition);
+ module.set.animating();
+ module.remove.visible();
+ if(settings.dimPage && !module.othersVisible()) {
+ $pusher.removeClass(className.dimmed);
+ }
+ };
+ transitionEnd = function(event) {
+ if( event.target == $transition[0] ) {
+ $transition.off(transitionEvent + elementNamespace, transitionEnd);
+ module.remove.animating();
+ module.remove.transition();
+ module.remove.inlineCSS();
+ if(transition == 'scale down' || (settings.returnScroll && module.is.mobile()) ) {
+ module.scrollBack();
+ }
+ callback.call(element);
+ }
+ };
+ $transition.off(transitionEvent + elementNamespace);
+ $transition.on(transitionEvent + elementNamespace, transitionEnd);
+ requestAnimationFrame(animate);
+ },
+
+ scrollToTop: function() {
+ module.verbose('Scrolling to top of page to avoid animation issues');
+ currentScroll = $(window).scrollTop();
+ $module.scrollTop(0);
+ window.scrollTo(0, 0);
+ },
+
+ scrollBack: function() {
+ module.verbose('Scrolling back to original page position');
+ window.scrollTo(0, currentScroll);
+ },
+
+ clear: {
+ cache: function() {
+ module.verbose('Clearing cached dimensions');
+ module.cache = {};
+ }
+ },
+
+ set: {
+
+ // ios only (scroll on html not document). This prevent auto-resize canvas/scroll in ios
+ // (This is no longer necessary in latest iOS)
+ ios: function() {
+ $html.addClass(className.ios);
+ },
+
+ // container
+ pushed: function() {
+ $context.addClass(className.pushed);
+ },
+ pushable: function() {
+ $context.addClass(className.pushable);
+ },
+
+ // pusher
+ dimmed: function() {
+ $pusher.addClass(className.dimmed);
+ },
+
+ // sidebar
+ active: function() {
+ $module.addClass(className.active);
+ },
+ animating: function() {
+ $module.addClass(className.animating);
+ },
+ transition: function(transition) {
+ transition = transition || module.get.transition();
+ $module.addClass(transition);
+ },
+ direction: function(direction) {
+ direction = direction || module.get.direction();
+ $module.addClass(className[direction]);
+ },
+ visible: function() {
+ $module.addClass(className.visible);
+ },
+ overlay: function() {
+ $module.addClass(className.overlay);
+ }
+ },
+ remove: {
+
+ inlineCSS: function() {
+ module.debug('Removing inline css styles', $style);
+ if($style && $style.length > 0) {
+ $style.remove();
+ }
+ },
+
+ // ios scroll on html not document
+ ios: function() {
+ $html.removeClass(className.ios);
+ },
+
+ // context
+ pushed: function() {
+ $context.removeClass(className.pushed);
+ },
+ pushable: function() {
+ $context.removeClass(className.pushable);
+ },
+
+ // sidebar
+ active: function() {
+ $module.removeClass(className.active);
+ },
+ animating: function() {
+ $module.removeClass(className.animating);
+ },
+ transition: function(transition) {
+ transition = transition || module.get.transition();
+ $module.removeClass(transition);
+ },
+ direction: function(direction) {
+ direction = direction || module.get.direction();
+ $module.removeClass(className[direction]);
+ },
+ visible: function() {
+ $module.removeClass(className.visible);
+ },
+ overlay: function() {
+ $module.removeClass(className.overlay);
+ }
+ },
+
+ get: {
+ direction: function() {
+ if($module.hasClass(className.top)) {
+ return className.top;
+ }
+ else if($module.hasClass(className.right)) {
+ return className.right;
+ }
+ else if($module.hasClass(className.bottom)) {
+ return className.bottom;
+ }
+ return className.left;
+ },
+ transition: function() {
+ var
+ direction = module.get.direction(),
+ transition
+ ;
+ transition = ( module.is.mobile() )
+ ? (settings.mobileTransition == 'auto')
+ ? settings.defaultTransition.mobile[direction]
+ : settings.mobileTransition
+ : (settings.transition == 'auto')
+ ? settings.defaultTransition.computer[direction]
+ : settings.transition
+ ;
+ module.verbose('Determined transition', transition);
+ return transition;
+ },
+ transitionEvent: function() {
+ var
+ element = document.createElement('element'),
+ transitions = {
+ 'transition' :'transitionend',
+ 'OTransition' :'oTransitionEnd',
+ 'MozTransition' :'transitionend',
+ 'WebkitTransition' :'webkitTransitionEnd'
+ },
+ transition
+ ;
+ for(transition in transitions){
+ if( element.style[transition] !== undefined ){
+ return transitions[transition];
+ }
+ }
+ }
+ },
+
+ is: {
+
+ ie: function() {
+ var
+ isIE11 = (!(window.ActiveXObject) && 'ActiveXObject' in window),
+ isIE = ('ActiveXObject' in window)
+ ;
+ return (isIE11 || isIE);
+ },
+
+ ios: function() {
+ var
+ userAgent = navigator.userAgent,
+ isIOS = userAgent.match(regExp.ios),
+ isMobileChrome = userAgent.match(regExp.mobileChrome)
+ ;
+ if(isIOS && !isMobileChrome) {
+ module.verbose('Browser was found to be iOS', userAgent);
+ return true;
+ }
+ else {
+ return false;
+ }
+ },
+ mobile: function() {
+ var
+ userAgent = navigator.userAgent,
+ isMobile = userAgent.match(regExp.mobile)
+ ;
+ if(isMobile) {
+ module.verbose('Browser was found to be mobile', userAgent);
+ return true;
+ }
+ else {
+ module.verbose('Browser is not mobile, using regular transition', userAgent);
+ return false;
+ }
+ },
+ hidden: function() {
+ return !module.is.visible();
+ },
+ visible: function() {
+ return $module.hasClass(className.visible);
+ },
+ // alias
+ open: function() {
+ return module.is.visible();
+ },
+ closed: function() {
+ return module.is.hidden();
+ },
+ vertical: function() {
+ return $module.hasClass(className.top);
+ },
+ animating: function() {
+ return $context.hasClass(className.animating);
+ },
+ rtl: function () {
+ if(module.cache.rtl === undefined) {
+ module.cache.rtl = $module.attr('dir') === 'rtl' || $module.css('direction') === 'rtl';
+ }
+ return module.cache.rtl;
+ }
+ },
+
+ setting: function(name, value) {
+ module.debug('Changing setting', name, value);
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ if($.isPlainObject(settings[name])) {
+ $.extend(true, settings[name], value);
+ }
+ else {
+ settings[name] = value;
+ }
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ module.error(error.method, query);
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ }
+ ;
+
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ module.invoke('destroy');
+ }
+ module.initialize();
+ }
+ });
+
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.fn.sidebar.settings = {
+
+ name : 'Sidebar',
+ namespace : 'sidebar',
+
+ silent : false,
+ debug : false,
+ verbose : false,
+ performance : true,
+
+ transition : 'auto',
+ mobileTransition : 'auto',
+
+ defaultTransition : {
+ computer: {
+ left : 'uncover',
+ right : 'uncover',
+ top : 'overlay',
+ bottom : 'overlay'
+ },
+ mobile: {
+ left : 'uncover',
+ right : 'uncover',
+ top : 'overlay',
+ bottom : 'overlay'
+ }
+ },
+
+ context : 'body',
+ exclusive : false,
+ closable : true,
+ dimPage : true,
+ scrollLock : false,
+ returnScroll : false,
+ delaySetup : false,
+
+ duration : 500,
+
+ onChange : function(){},
+ onShow : function(){},
+ onHide : function(){},
+
+ onHidden : function(){},
+ onVisible : function(){},
+
+ className : {
+ active : 'active',
+ animating : 'animating',
+ dimmed : 'dimmed',
+ ios : 'ios',
+ pushable : 'pushable',
+ pushed : 'pushed',
+ right : 'right',
+ top : 'top',
+ left : 'left',
+ bottom : 'bottom',
+ visible : 'visible'
+ },
+
+ selector: {
+ fixed : '.fixed',
+ omitted : 'script, link, style, .ui.modal, .ui.dimmer, .ui.nag, .ui.fixed',
+ pusher : '.pusher',
+ sidebar : '.ui.sidebar'
+ },
+
+ regExp: {
+ ios : /(iPad|iPhone|iPod)/g,
+ mobileChrome : /(CriOS)/g,
+ mobile : /Mobile|iP(hone|od|ad)|Android|BlackBerry|IEMobile|Kindle|NetFront|Silk-Accelerated|(hpw|web)OS|Fennec|Minimo|Opera M(obi|ini)|Blazer|Dolfin|Dolphin|Skyfire|Zune/g
+ },
+
+ error : {
+ method : 'The method you called is not defined.',
+ pusher : 'Had to add pusher element. For optimal performance make sure body content is inside a pusher element',
+ movedSidebar : 'Had to move sidebar. For optimal performance make sure sidebar and pusher are direct children of your body tag',
+ overlay : 'The overlay setting is no longer supported, use animation: overlay',
+ notFound : 'There were no elements that matched the specified selector'
+ }
+
+};
+
+
+})( jQuery, window, document );
+
+/*!
+ * # Fomantic-UI 2.8.8 - Sticky
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+'use strict';
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.sticky = function(parameters) {
+ var
+ $allModules = $(this),
+ moduleSelector = $allModules.selector || '',
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+ returnedValue
+ ;
+
+ $allModules
+ .each(function() {
+ var
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.fn.sticky.settings, parameters)
+ : $.extend({}, $.fn.sticky.settings),
+
+ className = settings.className,
+ namespace = settings.namespace,
+ error = settings.error,
+
+ eventNamespace = '.' + namespace,
+ moduleNamespace = 'module-' + namespace,
+
+ $module = $(this),
+ $window = $(window),
+ $scroll = $(settings.scrollContext),
+ $container,
+ $context,
+
+ instance = $module.data(moduleNamespace),
+
+ requestAnimationFrame = window.requestAnimationFrame
+ || window.mozRequestAnimationFrame
+ || window.webkitRequestAnimationFrame
+ || window.msRequestAnimationFrame
+ || function(callback) { setTimeout(callback, 0); },
+
+ element = this,
+
+ documentObserver,
+ observer,
+ module
+ ;
+
+ module = {
+
+ initialize: function() {
+
+ module.determineContainer();
+ module.determineContext();
+ module.verbose('Initializing sticky', settings, $container);
+
+ module.save.positions();
+ module.checkErrors();
+ module.bind.events();
+
+ if(settings.observeChanges) {
+ module.observeChanges();
+ }
+ module.instantiate();
+ },
+
+ instantiate: function() {
+ module.verbose('Storing instance of module', module);
+ instance = module;
+ $module
+ .data(moduleNamespace, module)
+ ;
+ },
+
+ destroy: function() {
+ module.verbose('Destroying previous instance');
+ module.reset();
+ if(documentObserver) {
+ documentObserver.disconnect();
+ }
+ if(observer) {
+ observer.disconnect();
+ }
+ $window
+ .off('load' + eventNamespace, module.event.load)
+ .off('resize' + eventNamespace, module.event.resize)
+ ;
+ $scroll
+ .off('scrollchange' + eventNamespace, module.event.scrollchange)
+ ;
+ $module.removeData(moduleNamespace);
+ },
+
+ observeChanges: function() {
+ if('MutationObserver' in window) {
+ documentObserver = new MutationObserver(module.event.documentChanged);
+ observer = new MutationObserver(module.event.changed);
+ documentObserver.observe(document, {
+ childList : true,
+ subtree : true
+ });
+ observer.observe(element, {
+ childList : true,
+ subtree : true
+ });
+ observer.observe($context[0], {
+ childList : true,
+ subtree : true
+ });
+ module.debug('Setting up mutation observer', observer);
+ }
+ },
+
+ determineContainer: function() {
+ if(settings.container) {
+ $container = $(settings.container);
+ }
+ else {
+ $container = $module.offsetParent();
+ }
+ },
+
+ determineContext: function() {
+ if(settings.context) {
+ $context = $(settings.context);
+ }
+ else {
+ $context = $container;
+ }
+ if($context.length === 0) {
+ module.error(error.invalidContext, settings.context, $module);
+ return;
+ }
+ },
+
+ checkErrors: function() {
+ if( module.is.hidden() ) {
+ module.error(error.visible, $module);
+ }
+ if(module.cache.element.height > module.cache.context.height) {
+ module.reset();
+ module.error(error.elementSize, $module);
+ return;
+ }
+ },
+
+ bind: {
+ events: function() {
+ $window
+ .on('load' + eventNamespace, module.event.load)
+ .on('resize' + eventNamespace, module.event.resize)
+ ;
+ // pub/sub pattern
+ $scroll
+ .off('scroll' + eventNamespace)
+ .on('scroll' + eventNamespace, module.event.scroll)
+ .on('scrollchange' + eventNamespace, module.event.scrollchange)
+ ;
+ }
+ },
+
+ event: {
+ changed: function(mutations) {
+ clearTimeout(module.timer);
+ module.timer = setTimeout(function() {
+ module.verbose('DOM tree modified, updating sticky menu', mutations);
+ module.refresh();
+ }, 100);
+ },
+ documentChanged: function(mutations) {
+ [].forEach.call(mutations, function(mutation) {
+ if(mutation.removedNodes) {
+ [].forEach.call(mutation.removedNodes, function(node) {
+ if(node == element || $(node).find(element).length > 0) {
+ module.debug('Element removed from DOM, tearing down events');
+ module.destroy();
+ }
+ });
+ }
+ });
+ },
+ load: function() {
+ module.verbose('Page contents finished loading');
+ requestAnimationFrame(module.refresh);
+ },
+ resize: function() {
+ module.verbose('Window resized');
+ requestAnimationFrame(module.refresh);
+ },
+ scroll: function() {
+ requestAnimationFrame(function() {
+ $scroll.triggerHandler('scrollchange' + eventNamespace, $scroll.scrollTop() );
+ });
+ },
+ scrollchange: function(event, scrollPosition) {
+ module.stick(scrollPosition);
+ settings.onScroll.call(element);
+ }
+ },
+
+ refresh: function(hardRefresh) {
+ module.reset();
+ if(!settings.context) {
+ module.determineContext();
+ }
+ if(hardRefresh) {
+ module.determineContainer();
+ }
+ module.save.positions();
+ module.stick();
+ settings.onReposition.call(element);
+ },
+
+ supports: {
+ sticky: function() {
+ var
+ $element = $('
')
+ ;
+ $element.addClass(className.supported);
+ return($element.css('position').match('sticky'));
+ }
+ },
+
+ save: {
+ lastScroll: function(scroll) {
+ module.lastScroll = scroll;
+ },
+ elementScroll: function(scroll) {
+ module.elementScroll = scroll;
+ },
+ positions: function() {
+ var
+ scrollContext = {
+ height : $scroll.height()
+ },
+ element = {
+ margin: {
+ top : parseInt($module.css('margin-top'), 10),
+ bottom : parseInt($module.css('margin-bottom'), 10),
+ },
+ offset : $module.offset(),
+ width : $module.outerWidth(),
+ height : $module.outerHeight()
+ },
+ context = {
+ offset : $context.offset(),
+ height : $context.outerHeight()
+ }
+ ;
+ if( !module.is.standardScroll() ) {
+ module.debug('Non-standard scroll. Removing scroll offset from element offset');
+
+ scrollContext.top = $scroll.scrollTop();
+ scrollContext.left = $scroll.scrollLeft();
+
+ element.offset.top += scrollContext.top;
+ context.offset.top += scrollContext.top;
+ element.offset.left += scrollContext.left;
+ context.offset.left += scrollContext.left;
+ }
+ module.cache = {
+ fits : ( (element.height + settings.offset) <= scrollContext.height),
+ sameHeight : (element.height == context.height),
+ scrollContext : {
+ height : scrollContext.height
+ },
+ element: {
+ margin : element.margin,
+ top : element.offset.top - element.margin.top,
+ left : element.offset.left,
+ width : element.width,
+ height : element.height,
+ bottom : element.offset.top + element.height
+ },
+ context: {
+ top : context.offset.top,
+ height : context.height,
+ bottom : context.offset.top + context.height
+ }
+ };
+ module.set.containerSize();
+
+ module.stick();
+ module.debug('Caching element positions', module.cache);
+ }
+ },
+
+ get: {
+ direction: function(scroll) {
+ var
+ direction = 'down'
+ ;
+ scroll = scroll || $scroll.scrollTop();
+ if(module.lastScroll !== undefined) {
+ if(module.lastScroll < scroll) {
+ direction = 'down';
+ }
+ else if(module.lastScroll > scroll) {
+ direction = 'up';
+ }
+ }
+ return direction;
+ },
+ scrollChange: function(scroll) {
+ scroll = scroll || $scroll.scrollTop();
+ return (module.lastScroll)
+ ? (scroll - module.lastScroll)
+ : 0
+ ;
+ },
+ currentElementScroll: function() {
+ if(module.elementScroll) {
+ return module.elementScroll;
+ }
+ return ( module.is.top() )
+ ? Math.abs(parseInt($module.css('top'), 10)) || 0
+ : Math.abs(parseInt($module.css('bottom'), 10)) || 0
+ ;
+ },
+
+ elementScroll: function(scroll) {
+ scroll = scroll || $scroll.scrollTop();
+ var
+ element = module.cache.element,
+ scrollContext = module.cache.scrollContext,
+ delta = module.get.scrollChange(scroll),
+ maxScroll = (element.height - scrollContext.height + settings.offset),
+ elementScroll = module.get.currentElementScroll(),
+ possibleScroll = (elementScroll + delta)
+ ;
+ if(module.cache.fits || possibleScroll < 0) {
+ elementScroll = 0;
+ }
+ else if(possibleScroll > maxScroll ) {
+ elementScroll = maxScroll;
+ }
+ else {
+ elementScroll = possibleScroll;
+ }
+ return elementScroll;
+ }
+ },
+
+ remove: {
+ lastScroll: function() {
+ delete module.lastScroll;
+ },
+ elementScroll: function(scroll) {
+ delete module.elementScroll;
+ },
+ minimumSize: function() {
+ $container
+ .css('min-height', '')
+ ;
+ },
+ offset: function() {
+ $module.css('margin-top', '');
+ }
+ },
+
+ set: {
+ offset: function() {
+ module.verbose('Setting offset on element', settings.offset);
+ $module
+ .css('margin-top', settings.offset)
+ ;
+ },
+ containerSize: function() {
+ var
+ tagName = $container.get(0).tagName
+ ;
+ if(tagName === 'HTML' || tagName == 'body') {
+ // this can trigger for too many reasons
+ //module.error(error.container, tagName, $module);
+ module.determineContainer();
+ }
+ else {
+ if( Math.abs($container.outerHeight() - module.cache.context.height) > settings.jitter) {
+ module.debug('Context has padding, specifying exact height for container', module.cache.context.height);
+ $container.css({
+ height: module.cache.context.height
+ });
+ }
+ }
+ },
+ minimumSize: function() {
+ var
+ element = module.cache.element
+ ;
+ $container
+ .css('min-height', element.height)
+ ;
+ },
+ scroll: function(scroll) {
+ module.debug('Setting scroll on element', scroll);
+ if(module.elementScroll == scroll) {
+ return;
+ }
+ if( module.is.top() ) {
+ $module
+ .css('bottom', '')
+ .css('top', -scroll)
+ ;
+ }
+ if( module.is.bottom() ) {
+ $module
+ .css('top', '')
+ .css('bottom', scroll)
+ ;
+ }
+ },
+ size: function() {
+ if(module.cache.element.height !== 0 && module.cache.element.width !== 0) {
+ element.style.setProperty('width', module.cache.element.width + 'px', 'important');
+ element.style.setProperty('height', module.cache.element.height + 'px', 'important');
+ }
+ }
+ },
+
+ is: {
+ standardScroll: function() {
+ return ($scroll[0] == window);
+ },
+ top: function() {
+ return $module.hasClass(className.top);
+ },
+ bottom: function() {
+ return $module.hasClass(className.bottom);
+ },
+ initialPosition: function() {
+ return (!module.is.fixed() && !module.is.bound());
+ },
+ hidden: function() {
+ return (!$module.is(':visible'));
+ },
+ bound: function() {
+ return $module.hasClass(className.bound);
+ },
+ fixed: function() {
+ return $module.hasClass(className.fixed);
+ }
+ },
+
+ stick: function(scroll) {
+ var
+ cachedPosition = scroll || $scroll.scrollTop(),
+ cache = module.cache,
+ fits = cache.fits,
+ sameHeight = cache.sameHeight,
+ element = cache.element,
+ scrollContext = cache.scrollContext,
+ context = cache.context,
+ offset = (module.is.bottom() && settings.pushing)
+ ? settings.bottomOffset
+ : settings.offset,
+ scroll = {
+ top : cachedPosition + offset,
+ bottom : cachedPosition + offset + scrollContext.height
+ },
+ elementScroll = (fits)
+ ? 0
+ : module.get.elementScroll(scroll.top),
+
+ // shorthand
+ doesntFit = !fits,
+ elementVisible = (element.height !== 0)
+ ;
+ if(elementVisible && !sameHeight) {
+
+ if( module.is.initialPosition() ) {
+ if(scroll.top >= context.bottom) {
+ module.debug('Initial element position is bottom of container');
+ module.bindBottom();
+ }
+ else if(scroll.top > element.top) {
+ if( (element.height + scroll.top - elementScroll) >= context.bottom ) {
+ module.debug('Initial element position is bottom of container');
+ module.bindBottom();
+ }
+ else {
+ module.debug('Initial element position is fixed');
+ module.fixTop();
+ }
+ }
+
+ }
+ else if( module.is.fixed() ) {
+
+ // currently fixed top
+ if( module.is.top() ) {
+ if( scroll.top <= element.top ) {
+ module.debug('Fixed element reached top of container');
+ module.setInitialPosition();
+ }
+ else if( (element.height + scroll.top - elementScroll) >= context.bottom ) {
+ module.debug('Fixed element reached bottom of container');
+ module.bindBottom();
+ }
+ // scroll element if larger than screen
+ else if(doesntFit) {
+ module.set.scroll(elementScroll);
+ module.save.lastScroll(scroll.top);
+ module.save.elementScroll(elementScroll);
+ }
+ }
+
+ // currently fixed bottom
+ else if(module.is.bottom() ) {
+
+ // top edge
+ if( (scroll.bottom - element.height) <= element.top) {
+ module.debug('Bottom fixed rail has reached top of container');
+ module.setInitialPosition();
+ }
+ // bottom edge
+ else if(scroll.bottom >= context.bottom) {
+ module.debug('Bottom fixed rail has reached bottom of container');
+ module.bindBottom();
+ }
+ // scroll element if larger than screen
+ else if(doesntFit) {
+ module.set.scroll(elementScroll);
+ module.save.lastScroll(scroll.top);
+ module.save.elementScroll(elementScroll);
+ }
+
+ }
+ }
+ else if( module.is.bottom() ) {
+ if( scroll.top <= element.top ) {
+ module.debug('Jumped from bottom fixed to top fixed, most likely used home/end button');
+ module.setInitialPosition();
+ }
+ else {
+ if(settings.pushing) {
+ if(module.is.bound() && scroll.bottom <= context.bottom ) {
+ module.debug('Fixing bottom attached element to bottom of browser.');
+ module.fixBottom();
+ }
+ }
+ else {
+ if(module.is.bound() && (scroll.top <= context.bottom - element.height) ) {
+ module.debug('Fixing bottom attached element to top of browser.');
+ module.fixTop();
+ }
+ }
+ }
+ }
+ }
+ },
+
+ bindTop: function() {
+ module.debug('Binding element to top of parent container');
+ module.remove.offset();
+ $module
+ .css({
+ left : '',
+ top : '',
+ marginBottom : ''
+ })
+ .removeClass(className.fixed)
+ .removeClass(className.bottom)
+ .addClass(className.bound)
+ .addClass(className.top)
+ ;
+ settings.onTop.call(element);
+ settings.onUnstick.call(element);
+ },
+ bindBottom: function() {
+ module.debug('Binding element to bottom of parent container');
+ module.remove.offset();
+ $module
+ .css({
+ left : '',
+ top : ''
+ })
+ .removeClass(className.fixed)
+ .removeClass(className.top)
+ .addClass(className.bound)
+ .addClass(className.bottom)
+ ;
+ settings.onBottom.call(element);
+ settings.onUnstick.call(element);
+ },
+
+ setInitialPosition: function() {
+ module.debug('Returning to initial position');
+ module.unfix();
+ module.unbind();
+ },
+
+
+ fixTop: function() {
+ module.debug('Fixing element to top of page');
+ if(settings.setSize) {
+ module.set.size();
+ }
+ module.set.minimumSize();
+ module.set.offset();
+ $module
+ .css({
+ left : module.cache.element.left,
+ bottom : '',
+ marginBottom : ''
+ })
+ .removeClass(className.bound)
+ .removeClass(className.bottom)
+ .addClass(className.fixed)
+ .addClass(className.top)
+ ;
+ settings.onStick.call(element);
+ },
+
+ fixBottom: function() {
+ module.debug('Sticking element to bottom of page');
+ if(settings.setSize) {
+ module.set.size();
+ }
+ module.set.minimumSize();
+ module.set.offset();
+ $module
+ .css({
+ left : module.cache.element.left,
+ bottom : '',
+ marginBottom : ''
+ })
+ .removeClass(className.bound)
+ .removeClass(className.top)
+ .addClass(className.fixed)
+ .addClass(className.bottom)
+ ;
+ settings.onStick.call(element);
+ },
+
+ unbind: function() {
+ if( module.is.bound() ) {
+ module.debug('Removing container bound position on element');
+ module.remove.offset();
+ $module
+ .removeClass(className.bound)
+ .removeClass(className.top)
+ .removeClass(className.bottom)
+ ;
+ }
+ },
+
+ unfix: function() {
+ if( module.is.fixed() ) {
+ module.debug('Removing fixed position on element');
+ module.remove.minimumSize();
+ module.remove.offset();
+ $module
+ .removeClass(className.fixed)
+ .removeClass(className.top)
+ .removeClass(className.bottom)
+ ;
+ settings.onUnstick.call(element);
+ }
+ },
+
+ reset: function() {
+ module.debug('Resetting elements position');
+ module.unbind();
+ module.unfix();
+ module.resetCSS();
+ module.remove.offset();
+ module.remove.lastScroll();
+ },
+
+ resetCSS: function() {
+ $module
+ .css({
+ width : '',
+ height : ''
+ })
+ ;
+ $container
+ .css({
+ height: ''
+ })
+ ;
+ },
+
+ setting: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ settings[name] = value;
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 0);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ }
+ })
+ ;
+
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.fn.sticky.settings = {
+
+ name : 'Sticky',
+ namespace : 'sticky',
+
+ silent : false,
+ debug : false,
+ verbose : true,
+ performance : true,
+
+ // whether to stick in the opposite direction on scroll up
+ pushing : false,
+
+ context : false,
+ container : false,
+
+ // Context to watch scroll events
+ scrollContext : window,
+
+ // Offset to adjust scroll
+ offset : 0,
+
+ // Offset to adjust scroll when attached to bottom of screen
+ bottomOffset : 0,
+
+ // will only set container height if difference between context and container is larger than this number
+ jitter : 5,
+
+ // set width of sticky element when it is fixed to page (used to make sure 100% width is maintained if no fixed size set)
+ setSize : true,
+
+ // Whether to automatically observe changes with Mutation Observers
+ observeChanges : false,
+
+ // Called when position is recalculated
+ onReposition : function(){},
+
+ // Called on each scroll
+ onScroll : function(){},
+
+ // Called when element is stuck to viewport
+ onStick : function(){},
+
+ // Called when element is unstuck from viewport
+ onUnstick : function(){},
+
+ // Called when element reaches top of context
+ onTop : function(){},
+
+ // Called when element reaches bottom of context
+ onBottom : function(){},
+
+ error : {
+ container : 'Sticky element must be inside a relative container',
+ visible : 'Element is hidden, you must call refresh after element becomes visible. Use silent setting to surpress this warning in production.',
+ method : 'The method you called is not defined.',
+ invalidContext : 'Context specified does not exist',
+ elementSize : 'Sticky element is larger than its container, cannot create sticky.'
+ },
+
+ className : {
+ bound : 'bound',
+ fixed : 'fixed',
+ supported : 'native',
+ top : 'top',
+ bottom : 'bottom'
+ }
+
+};
+
+})( jQuery, window, document );
+
+/*!
+ * # Fomantic-UI 2.8.8 - Tab
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+'use strict';
+
+$.isWindow = $.isWindow || function(obj) {
+ return obj != null && obj === obj.window;
+};
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.tab = function(parameters) {
+
+ var
+ // use window context if none specified
+ $allModules = $.isFunction(this)
+ ? $(window)
+ : $(this),
+
+ moduleSelector = $allModules.selector || '',
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+
+ initializedHistory = false,
+ returnedValue
+ ;
+
+ $allModules
+ .each(function() {
+ var
+
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.fn.tab.settings, parameters)
+ : $.extend({}, $.fn.tab.settings),
+
+ className = settings.className,
+ metadata = settings.metadata,
+ selector = settings.selector,
+ error = settings.error,
+ regExp = settings.regExp,
+
+ eventNamespace = '.' + settings.namespace,
+ moduleNamespace = 'module-' + settings.namespace,
+
+ $module = $(this),
+ $context,
+ $tabs,
+
+ cache = {},
+ firstLoad = true,
+ recursionDepth = 0,
+ element = this,
+ instance = $module.data(moduleNamespace),
+
+ activeTabPath,
+ parameterArray,
+ module,
+
+ historyEvent
+
+ ;
+
+ module = {
+
+ initialize: function() {
+ module.debug('Initializing tab menu item', $module);
+ module.fix.callbacks();
+ module.determineTabs();
+
+ module.debug('Determining tabs', settings.context, $tabs);
+ // set up automatic routing
+ if(settings.auto) {
+ module.set.auto();
+ }
+ module.bind.events();
+
+ if(settings.history && !initializedHistory) {
+ module.initializeHistory();
+ initializedHistory = true;
+ }
+
+ if(settings.autoTabActivation && instance === undefined && module.determine.activeTab() == null) {
+ module.debug('No active tab detected, setting first tab active', module.get.initialPath());
+ module.changeTab(settings.autoTabActivation === true ? module.get.initialPath() : settings.autoTabActivation);
+ };
+
+ module.instantiate();
+ },
+
+ instantiate: function () {
+ module.verbose('Storing instance of module', module);
+ instance = module;
+ $module
+ .data(moduleNamespace, module)
+ ;
+ },
+
+ destroy: function() {
+ module.debug('Destroying tabs', $module);
+ $module
+ .removeData(moduleNamespace)
+ .off(eventNamespace)
+ ;
+ },
+
+ bind: {
+ events: function() {
+ // if using $.tab don't add events
+ if( !$.isWindow( element ) ) {
+ module.debug('Attaching tab activation events to element', $module);
+ $module
+ .on('click' + eventNamespace, module.event.click)
+ ;
+ }
+ }
+ },
+
+ determineTabs: function() {
+ var
+ $reference
+ ;
+
+ // determine tab context
+ if(settings.context === 'parent') {
+ if($module.closest(selector.ui).length > 0) {
+ $reference = $module.closest(selector.ui);
+ module.verbose('Using closest UI element as parent', $reference);
+ }
+ else {
+ $reference = $module;
+ }
+ $context = $reference.parent();
+ module.verbose('Determined parent element for creating context', $context);
+ }
+ else if(settings.context) {
+ $context = $(settings.context);
+ module.verbose('Using selector for tab context', settings.context, $context);
+ }
+ else {
+ $context = $('body');
+ }
+ // find tabs
+ if(settings.childrenOnly) {
+ $tabs = $context.children(selector.tabs);
+ module.debug('Searching tab context children for tabs', $context, $tabs);
+ }
+ else {
+ $tabs = $context.find(selector.tabs);
+ module.debug('Searching tab context for tabs', $context, $tabs);
+ }
+ },
+
+ fix: {
+ callbacks: function() {
+ if( $.isPlainObject(parameters) && (parameters.onTabLoad || parameters.onTabInit) ) {
+ if(parameters.onTabLoad) {
+ parameters.onLoad = parameters.onTabLoad;
+ delete parameters.onTabLoad;
+ module.error(error.legacyLoad, parameters.onLoad);
+ }
+ if(parameters.onTabInit) {
+ parameters.onFirstLoad = parameters.onTabInit;
+ delete parameters.onTabInit;
+ module.error(error.legacyInit, parameters.onFirstLoad);
+ }
+ settings = $.extend(true, {}, $.fn.tab.settings, parameters);
+ }
+ }
+ },
+
+ initializeHistory: function() {
+ module.debug('Initializing page state');
+ if( $.address === undefined ) {
+ module.error(error.state);
+ return false;
+ }
+ else {
+ if(settings.historyType == 'state') {
+ module.debug('Using HTML5 to manage state');
+ if(settings.path !== false) {
+ $.address
+ .history(true)
+ .state(settings.path)
+ ;
+ }
+ else {
+ module.error(error.path);
+ return false;
+ }
+ }
+ $.address
+ .bind('change', module.event.history.change)
+ ;
+ }
+ },
+
+ event: {
+ click: function(event) {
+ var
+ tabPath = $(this).data(metadata.tab)
+ ;
+ if(tabPath !== undefined) {
+ if(settings.history) {
+ module.verbose('Updating page state', event);
+ $.address.value(tabPath);
+ }
+ else {
+ module.verbose('Changing tab', event);
+ module.changeTab(tabPath);
+ }
+ event.preventDefault();
+ }
+ else {
+ module.debug('No tab specified');
+ }
+ },
+ history: {
+ change: function(event) {
+ var
+ tabPath = event.pathNames.join('/') || module.get.initialPath(),
+ pageTitle = settings.templates.determineTitle(tabPath) || false
+ ;
+ module.performance.display();
+ module.debug('History change event', tabPath, event);
+ historyEvent = event;
+ if(tabPath !== undefined) {
+ module.changeTab(tabPath);
+ }
+ if(pageTitle) {
+ $.address.title(pageTitle);
+ }
+ }
+ }
+ },
+
+ refresh: function() {
+ if(activeTabPath) {
+ module.debug('Refreshing tab', activeTabPath);
+ module.changeTab(activeTabPath);
+ }
+ },
+
+ cache: {
+
+ read: function(cacheKey) {
+ return (cacheKey !== undefined)
+ ? cache[cacheKey]
+ : false
+ ;
+ },
+ add: function(cacheKey, content) {
+ cacheKey = cacheKey || activeTabPath;
+ module.debug('Adding cached content for', cacheKey);
+ cache[cacheKey] = content;
+ },
+ remove: function(cacheKey) {
+ cacheKey = cacheKey || activeTabPath;
+ module.debug('Removing cached content for', cacheKey);
+ delete cache[cacheKey];
+ }
+ },
+
+ escape: {
+ string: function(text) {
+ text = String(text);
+ return text.replace(regExp.escape, '\\$&');
+ }
+ },
+
+ set: {
+ auto: function() {
+ var
+ url = (typeof settings.path == 'string')
+ ? settings.path.replace(/\/$/, '') + '/{$tab}'
+ : '/{$tab}'
+ ;
+ module.verbose('Setting up automatic tab retrieval from server', url);
+ if($.isPlainObject(settings.apiSettings)) {
+ settings.apiSettings.url = url;
+ }
+ else {
+ settings.apiSettings = {
+ url: url
+ };
+ }
+ },
+ loading: function(tabPath) {
+ var
+ $tab = module.get.tabElement(tabPath),
+ isLoading = $tab.hasClass(className.loading)
+ ;
+ if(!isLoading) {
+ module.verbose('Setting loading state for', $tab);
+ $tab
+ .addClass(className.loading)
+ .siblings($tabs)
+ .removeClass(className.active + ' ' + className.loading)
+ ;
+ if($tab.length > 0) {
+ settings.onRequest.call($tab[0], tabPath);
+ }
+ }
+ },
+ state: function(state) {
+ $.address.value(state);
+ }
+ },
+
+ changeTab: function(tabPath) {
+ var
+ pushStateAvailable = (window.history && window.history.pushState),
+ shouldIgnoreLoad = (pushStateAvailable && settings.ignoreFirstLoad && firstLoad),
+ remoteContent = (settings.auto || $.isPlainObject(settings.apiSettings) ),
+ // only add default path if not remote content
+ pathArray = (remoteContent && !shouldIgnoreLoad)
+ ? module.utilities.pathToArray(tabPath)
+ : module.get.defaultPathArray(tabPath)
+ ;
+ tabPath = module.utilities.arrayToPath(pathArray);
+ $.each(pathArray, function(index, tab) {
+ var
+ currentPathArray = pathArray.slice(0, index + 1),
+ currentPath = module.utilities.arrayToPath(currentPathArray),
+
+ isTab = module.is.tab(currentPath),
+ isLastIndex = (index + 1 == pathArray.length),
+
+ $tab = module.get.tabElement(currentPath),
+ $anchor,
+ nextPathArray,
+ nextPath,
+ isLastTab
+ ;
+ module.verbose('Looking for tab', tab);
+ if(isTab) {
+ module.verbose('Tab was found', tab);
+ // scope up
+ activeTabPath = currentPath;
+ parameterArray = module.utilities.filterArray(pathArray, currentPathArray);
+
+ if(isLastIndex) {
+ isLastTab = true;
+ }
+ else {
+ nextPathArray = pathArray.slice(0, index + 2);
+ nextPath = module.utilities.arrayToPath(nextPathArray);
+ isLastTab = ( !module.is.tab(nextPath) );
+ if(isLastTab) {
+ module.verbose('Tab parameters found', nextPathArray);
+ }
+ }
+ if(isLastTab && remoteContent) {
+ if(!shouldIgnoreLoad) {
+ module.activate.navigation(currentPath);
+ module.fetch.content(currentPath, tabPath);
+ }
+ else {
+ module.debug('Ignoring remote content on first tab load', currentPath);
+ firstLoad = false;
+ module.cache.add(tabPath, $tab.html());
+ module.activate.all(currentPath);
+ settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent);
+ settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent);
+ }
+ return false;
+ }
+ else {
+ module.debug('Opened local tab', currentPath);
+ module.activate.all(currentPath);
+ if( !module.cache.read(currentPath) ) {
+ module.cache.add(currentPath, true);
+ module.debug('First time tab loaded calling tab init');
+ settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent);
+ }
+ settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent);
+ }
+
+ }
+ else if(tabPath.search('/') == -1 && tabPath !== '') {
+ // look for in page anchor
+ tabPath = module.escape.string(tabPath);
+ $anchor = $('#' + tabPath + ', a[name="' + tabPath + '"]');
+ currentPath = $anchor.closest('[data-tab]').data(metadata.tab);
+ $tab = module.get.tabElement(currentPath);
+ // if anchor exists use parent tab
+ if($anchor && $anchor.length > 0 && currentPath) {
+ module.debug('Anchor link used, opening parent tab', $tab, $anchor);
+ if( !$tab.hasClass(className.active) ) {
+ setTimeout(function() {
+ module.scrollTo($anchor);
+ }, 0);
+ }
+ module.activate.all(currentPath);
+ if( !module.cache.read(currentPath) ) {
+ module.cache.add(currentPath, true);
+ module.debug('First time tab loaded calling tab init');
+ settings.onFirstLoad.call($tab[0], currentPath, parameterArray, historyEvent);
+ }
+ settings.onLoad.call($tab[0], currentPath, parameterArray, historyEvent);
+ return false;
+ }
+ }
+ else {
+ module.error(error.missingTab, $module, $context, currentPath);
+ return false;
+ }
+ });
+ },
+
+ scrollTo: function($element) {
+ var
+ scrollOffset = ($element && $element.length > 0)
+ ? $element.offset().top
+ : false
+ ;
+ if(scrollOffset !== false) {
+ module.debug('Forcing scroll to an in-page link in a hidden tab', scrollOffset, $element);
+ $(document).scrollTop(scrollOffset);
+ }
+ },
+
+ update: {
+ content: function(tabPath, html, evaluateScripts) {
+ var
+ $tab = module.get.tabElement(tabPath),
+ tab = $tab[0]
+ ;
+ evaluateScripts = (evaluateScripts !== undefined)
+ ? evaluateScripts
+ : settings.evaluateScripts
+ ;
+ if(typeof settings.cacheType == 'string' && settings.cacheType.toLowerCase() == 'dom' && typeof html !== 'string') {
+ $tab
+ .empty()
+ .append($(html).clone(true))
+ ;
+ }
+ else {
+ if(evaluateScripts) {
+ module.debug('Updating HTML and evaluating inline scripts', tabPath, html);
+ $tab.html(html);
+ }
+ else {
+ module.debug('Updating HTML', tabPath, html);
+ tab.innerHTML = html;
+ }
+ }
+ }
+ },
+
+ fetch: {
+
+ content: function(tabPath, fullTabPath) {
+ var
+ $tab = module.get.tabElement(tabPath),
+ apiSettings = {
+ dataType : 'html',
+ encodeParameters : false,
+ on : 'now',
+ cache : settings.alwaysRefresh,
+ headers : {
+ 'X-Remote': true
+ },
+ onSuccess : function(response) {
+ if(settings.cacheType == 'response') {
+ module.cache.add(fullTabPath, response);
+ }
+ module.update.content(tabPath, response);
+ if(tabPath == activeTabPath) {
+ module.debug('Content loaded', tabPath);
+ module.activate.tab(tabPath);
+ }
+ else {
+ module.debug('Content loaded in background', tabPath);
+ }
+ settings.onFirstLoad.call($tab[0], tabPath, parameterArray, historyEvent);
+ settings.onLoad.call($tab[0], tabPath, parameterArray, historyEvent);
+
+ if(settings.loadOnce) {
+ module.cache.add(fullTabPath, true);
+ }
+ else if(typeof settings.cacheType == 'string' && settings.cacheType.toLowerCase() == 'dom' && $tab.children().length > 0) {
+ setTimeout(function() {
+ var
+ $clone = $tab.children().clone(true)
+ ;
+ $clone = $clone.not('script');
+ module.cache.add(fullTabPath, $clone);
+ }, 0);
+ }
+ else {
+ module.cache.add(fullTabPath, $tab.html());
+ }
+ },
+ urlData: {
+ tab: fullTabPath
+ }
+ },
+ request = $tab.api('get request') || false,
+ existingRequest = ( request && request.state() === 'pending' ),
+ requestSettings,
+ cachedContent
+ ;
+
+ fullTabPath = fullTabPath || tabPath;
+ cachedContent = module.cache.read(fullTabPath);
+
+
+ if(settings.cache && cachedContent) {
+ module.activate.tab(tabPath);
+ module.debug('Adding cached content', fullTabPath);
+ if(!settings.loadOnce) {
+ if(settings.evaluateScripts == 'once') {
+ module.update.content(tabPath, cachedContent, false);
+ }
+ else {
+ module.update.content(tabPath, cachedContent);
+ }
+ }
+ settings.onLoad.call($tab[0], tabPath, parameterArray, historyEvent);
+ }
+ else if(existingRequest) {
+ module.set.loading(tabPath);
+ module.debug('Content is already loading', fullTabPath);
+ }
+ else if($.api !== undefined) {
+ requestSettings = $.extend(true, {}, settings.apiSettings, apiSettings);
+ module.debug('Retrieving remote content', fullTabPath, requestSettings);
+ module.set.loading(tabPath);
+ $tab.api(requestSettings);
+ }
+ else {
+ module.error(error.api);
+ }
+ }
+ },
+
+ activate: {
+ all: function(tabPath) {
+ module.activate.tab(tabPath);
+ module.activate.navigation(tabPath);
+ },
+ tab: function(tabPath) {
+ var
+ $tab = module.get.tabElement(tabPath),
+ $deactiveTabs = (settings.deactivate == 'siblings')
+ ? $tab.siblings($tabs)
+ : $tabs.not($tab),
+ isActive = $tab.hasClass(className.active)
+ ;
+ module.verbose('Showing tab content for', $tab);
+ if(!isActive) {
+ $tab
+ .addClass(className.active)
+ ;
+ $deactiveTabs
+ .removeClass(className.active + ' ' + className.loading)
+ ;
+ if($tab.length > 0) {
+ settings.onVisible.call($tab[0], tabPath);
+ }
+ }
+ },
+ navigation: function(tabPath) {
+ var
+ $navigation = module.get.navElement(tabPath),
+ $deactiveNavigation = (settings.deactivate == 'siblings')
+ ? $navigation.siblings($allModules)
+ : $allModules.not($navigation),
+ isActive = $navigation.hasClass(className.active)
+ ;
+ module.verbose('Activating tab navigation for', $navigation, tabPath);
+ if(!isActive) {
+ $navigation
+ .addClass(className.active)
+ ;
+ $deactiveNavigation
+ .removeClass(className.active + ' ' + className.loading)
+ ;
+ }
+ }
+ },
+
+ deactivate: {
+ all: function() {
+ module.deactivate.navigation();
+ module.deactivate.tabs();
+ },
+ navigation: function() {
+ $allModules
+ .removeClass(className.active)
+ ;
+ },
+ tabs: function() {
+ $tabs
+ .removeClass(className.active + ' ' + className.loading)
+ ;
+ }
+ },
+
+ is: {
+ tab: function(tabName) {
+ return (tabName !== undefined)
+ ? ( module.get.tabElement(tabName).length > 0 )
+ : false
+ ;
+ }
+ },
+
+ get: {
+ initialPath: function() {
+ return $allModules.eq(0).data(metadata.tab) || $tabs.eq(0).data(metadata.tab);
+ },
+ path: function() {
+ return $.address.value();
+ },
+ // adds default tabs to tab path
+ defaultPathArray: function(tabPath) {
+ return module.utilities.pathToArray( module.get.defaultPath(tabPath) );
+ },
+ defaultPath: function(tabPath) {
+ var
+ $defaultNav = $allModules.filter('[data-' + metadata.tab + '^="' + module.escape.string(tabPath) + '/"]').eq(0),
+ defaultTab = $defaultNav.data(metadata.tab) || false
+ ;
+ if( defaultTab ) {
+ module.debug('Found default tab', defaultTab);
+ if(recursionDepth < settings.maxDepth) {
+ recursionDepth++;
+ return module.get.defaultPath(defaultTab);
+ }
+ module.error(error.recursion);
+ }
+ else {
+ module.debug('No default tabs found for', tabPath, $tabs);
+ }
+ recursionDepth = 0;
+ return tabPath;
+ },
+ navElement: function(tabPath) {
+ tabPath = tabPath || activeTabPath;
+ return $allModules.filter('[data-' + metadata.tab + '="' + module.escape.string(tabPath) + '"]');
+ },
+ tabElement: function(tabPath) {
+ var
+ $fullPathTab,
+ $simplePathTab,
+ tabPathArray,
+ lastTab
+ ;
+ tabPath = tabPath || activeTabPath;
+ tabPathArray = module.utilities.pathToArray(tabPath);
+ lastTab = module.utilities.last(tabPathArray);
+ $fullPathTab = $tabs.filter('[data-' + metadata.tab + '="' + module.escape.string(tabPath) + '"]');
+ $simplePathTab = $tabs.filter('[data-' + metadata.tab + '="' + module.escape.string(lastTab) + '"]');
+ return ($fullPathTab.length > 0)
+ ? $fullPathTab
+ : $simplePathTab
+ ;
+ },
+ tab: function() {
+ return activeTabPath;
+ }
+ },
+
+ determine: {
+ activeTab: function() {
+ var activeTab = null;
+
+ $tabs.each(function(_index, tab) {
+ var $tab = $(tab);
+
+ if( $tab.hasClass(className.active) ) {
+ var
+ tabPath = $(this).data(metadata.tab),
+ $anchor = $allModules.filter('[data-' + metadata.tab + '="' + module.escape.string(tabPath) + '"]')
+ ;
+
+ if( $anchor.hasClass(className.active) ) {
+ activeTab = tabPath;
+ }
+ }
+ });
+
+ return activeTab;
+ }
+ },
+
+ utilities: {
+ filterArray: function(keepArray, removeArray) {
+ return $.grep(keepArray, function(keepValue) {
+ return ( $.inArray(keepValue, removeArray) == -1);
+ });
+ },
+ last: function(array) {
+ return Array.isArray(array)
+ ? array[ array.length - 1]
+ : false
+ ;
+ },
+ pathToArray: function(pathName) {
+ if(pathName === undefined) {
+ pathName = activeTabPath;
+ }
+ return typeof pathName == 'string'
+ ? pathName.split('/')
+ : [pathName]
+ ;
+ },
+ arrayToPath: function(pathArray) {
+ return Array.isArray(pathArray)
+ ? pathArray.join('/')
+ : false
+ ;
+ }
+ },
+
+ setting: function(name, value) {
+ module.debug('Changing setting', name, value);
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ if($.isPlainObject(settings[name])) {
+ $.extend(true, settings[name], value);
+ }
+ else {
+ settings[name] = value;
+ }
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ module.error(error.method, query);
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ }
+ })
+ ;
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+
+};
+
+// shortcut for tabbed content with no defined navigation
+$.tab = function() {
+ $(window).tab.apply(this, arguments);
+};
+
+$.fn.tab.settings = {
+
+ name : 'Tab',
+ namespace : 'tab',
+
+ silent : false,
+ debug : false,
+ verbose : false,
+ performance : true,
+
+ auto : false, // uses pjax style endpoints fetching content from same url with remote-content headers
+ history : false, // use browser history
+ historyType : 'hash', // #/ or html5 state
+ path : false, // base path of url
+
+ context : false, // specify a context that tabs must appear inside
+ childrenOnly : false, // use only tabs that are children of context
+ maxDepth : 25, // max depth a tab can be nested
+
+ deactivate : 'siblings', // whether tabs should deactivate sibling menu elements or all elements initialized together
+
+ alwaysRefresh : false, // load tab content new every tab click
+ cache : true, // cache the content requests to pull locally
+ loadOnce : false, // Whether tab data should only be loaded once when using remote content
+ cacheType : 'response', // Whether to cache exact response, or to html cache contents after scripts execute
+ ignoreFirstLoad : false, // don't load remote content on first load
+
+ apiSettings : false, // settings for api call
+ evaluateScripts : 'once', // whether inline scripts should be parsed (true/false/once). Once will not re-evaluate on cached content
+ autoTabActivation: true, // whether a non existing active tab will auto activate the first available tab
+
+ onFirstLoad : function(tabPath, parameterArray, historyEvent) {}, // called first time loaded
+ onLoad : function(tabPath, parameterArray, historyEvent) {}, // called on every load
+ onVisible : function(tabPath, parameterArray, historyEvent) {}, // called every time tab visible
+ onRequest : function(tabPath, parameterArray, historyEvent) {}, // called ever time a tab beings loading remote content
+
+ templates : {
+ determineTitle: function(tabArray) {} // returns page title for path
+ },
+
+ error: {
+ api : 'You attempted to load content without API module',
+ method : 'The method you called is not defined',
+ missingTab : 'Activated tab cannot be found. Tabs are case-sensitive.',
+ noContent : 'The tab you specified is missing a content url.',
+ path : 'History enabled, but no path was specified',
+ recursion : 'Max recursive depth reached',
+ legacyInit : 'onTabInit has been renamed to onFirstLoad in 2.0, please adjust your code.',
+ legacyLoad : 'onTabLoad has been renamed to onLoad in 2.0. Please adjust your code',
+ state : 'History requires Asual\'s Address library '
+ },
+
+ regExp : {
+ escape : /[-[\]{}()*+?.,\\^$|#\s:=@]/g
+ },
+
+ metadata : {
+ tab : 'tab',
+ loaded : 'loaded',
+ promise: 'promise'
+ },
+
+ className : {
+ loading : 'loading',
+ active : 'active'
+ },
+
+ selector : {
+ tabs : '.ui.tab',
+ ui : '.ui'
+ }
+
+};
+
+})( jQuery, window, document );
+
+/*!
+ * # Fomantic-UI 2.8.8 - Toast
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+'use strict';
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.toast = function(parameters) {
+ var
+ $allModules = $(this),
+ moduleSelector = $allModules.selector || '',
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+ returnedValue
+ ;
+ $allModules
+ .each(function() {
+ var
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.fn.toast.settings, parameters)
+ : $.extend({}, $.fn.toast.settings),
+
+ className = settings.className,
+ selector = settings.selector,
+ error = settings.error,
+ namespace = settings.namespace,
+ fields = settings.fields,
+
+ eventNamespace = '.' + namespace,
+ moduleNamespace = namespace + '-module',
+
+ $module = $(this),
+ $toastBox,
+ $toast,
+ $actions,
+ $progress,
+ $progressBar,
+ $animationObject,
+ $close,
+ $context = (settings.context)
+ ? $(settings.context)
+ : $('body'),
+
+ isToastComponent = $module.hasClass('toast') || $module.hasClass('message') || $module.hasClass('card'),
+
+ element = this,
+ instance = isToastComponent ? $module.data(moduleNamespace) : undefined,
+
+ module
+ ;
+ module = {
+
+ initialize: function() {
+ module.verbose('Initializing element');
+ if (!module.has.container()) {
+ module.create.container();
+ }
+ if(isToastComponent || settings.message !== '' || settings.title !== '' || module.get.iconClass() !== '' || settings.showImage || module.has.configActions()) {
+ if(typeof settings.showProgress !== 'string' || [className.top,className.bottom].indexOf(settings.showProgress) === -1 ) {
+ settings.showProgress = false;
+ }
+ module.create.toast();
+ if(settings.closeOnClick && (settings.closeIcon || $($toast).find(selector.input).length > 0 || module.has.configActions())){
+ settings.closeOnClick = false;
+ }
+ if(!settings.closeOnClick) {
+ $toastBox.addClass(className.unclickable);
+ }
+ module.bind.events();
+ }
+ module.instantiate();
+ if($toastBox) {
+ module.show();
+ }
+ },
+
+ instantiate: function() {
+ module.verbose('Storing instance of toast');
+ instance = module;
+ $module
+ .data(moduleNamespace, instance)
+ ;
+ },
+
+ destroy: function() {
+ if($toastBox) {
+ module.debug('Removing toast', $toastBox);
+ module.unbind.events();
+ $toastBox.remove();
+ $toastBox = undefined;
+ $toast = undefined;
+ $animationObject = undefined;
+ settings.onRemove.call($toastBox, element);
+ $progress = undefined;
+ $progressBar = undefined;
+ $close = undefined;
+ }
+ $module
+ .removeData(moduleNamespace)
+ ;
+ },
+
+ show: function(callback) {
+ callback = callback || function(){};
+ module.debug('Showing toast');
+ if(settings.onShow.call($toastBox, element) === false) {
+ module.debug('onShow callback returned false, cancelling toast animation');
+ return;
+ }
+ module.animate.show(callback);
+ },
+
+ close: function(callback) {
+ callback = callback || function(){};
+ module.remove.visible();
+ module.unbind.events();
+ module.animate.close(callback);
+
+ },
+
+ create: {
+ container: function() {
+ module.verbose('Creating container');
+ $context.append($('
',{class: settings.position + ' ' + className.container + ' ' +(settings.horizontal ? className.horizontal : '')}));
+ },
+ toast: function() {
+ $toastBox = $('
', {class: className.box});
+ var iconClass = module.get.iconClass();
+ if (!isToastComponent) {
+ module.verbose('Creating toast');
+ $toast = $('
');
+ var $content = $('
', {class: className.content});
+ if (iconClass !== '') {
+ $toast.append($(' ', {class: iconClass + ' ' + className.icon}));
+ }
+
+ if (settings.showImage) {
+ $toast.append($(' ', {
+ class: className.image + ' ' + settings.classImage,
+ src: settings.showImage
+ }));
+ }
+ if (settings.title !== '') {
+ $content.append($('
', {
+ class: className.title,
+ text: settings.title
+ }));
+ }
+
+ $content.append($('
', {class: className.message, html: module.helpers.escape(settings.message, settings.preserveHTML)}));
+
+ $toast
+ .addClass(settings.class + ' ' + className.toast)
+ .append($content)
+ ;
+ $toast.css('opacity', settings.opacity);
+ if (settings.closeIcon) {
+ $close = $(' ', {class: className.close + ' ' + (typeof settings.closeIcon === 'string' ? settings.closeIcon : '')});
+ if($close.hasClass(className.left)) {
+ $toast.prepend($close);
+ } else {
+ $toast.append($close);
+ }
+ }
+ } else {
+ $toast = settings.cloneModule ? $module.clone().removeAttr('id') : $module;
+ $close = $toast.find('> i'+module.helpers.toClass(className.close));
+ settings.closeIcon = ($close.length > 0);
+ if (iconClass !== '') {
+ $toast.find(selector.icon).attr('class',iconClass + ' ' + className.icon);
+ }
+ if (settings.showImage) {
+ $toast.find(selector.image).attr('src',settings.showImage);
+ }
+ if (settings.title !== '') {
+ $toast.find(selector.title).html(module.helpers.escape(settings.title, settings.preserveHTML));
+ }
+ if (settings.message !== '') {
+ $toast.find(selector.message).html(module.helpers.escape(settings.message, settings.preserveHTML));
+ }
+ }
+ if ($toast.hasClass(className.compact)) {
+ settings.compact = true;
+ }
+ if ($toast.hasClass('card')) {
+ settings.compact = false;
+ }
+ $actions = $toast.find('.actions');
+ if (module.has.configActions()) {
+ if ($actions.length === 0) {
+ $actions = $('
', {class: className.actions + ' ' + (settings.classActions || '')}).appendTo($toast);
+ }
+ if($toast.hasClass('card') && !$actions.hasClass(className.attached)) {
+ $actions.addClass(className.extraContent);
+ if($actions.hasClass(className.vertical)) {
+ $actions.removeClass(className.vertical);
+ module.error(error.verticalCard);
+ }
+ }
+ settings.actions.forEach(function (el) {
+ var icon = el[fields.icon] ? ' ' : '',
+ text = module.helpers.escape(el[fields.text] || '', settings.preserveHTML),
+ cls = module.helpers.deQuote(el[fields.class] || ''),
+ click = el[fields.click] && $.isFunction(el[fields.click]) ? el[fields.click] : function () {};
+ $actions.append($(' ', {
+ html: icon + text,
+ class: className.button + ' ' + cls,
+ click: function () {
+ if (click.call(element, $module) === false) {
+ return;
+ }
+ module.close();
+ }
+ }));
+ });
+ }
+ if ($actions && $actions.hasClass(className.vertical)) {
+ $toast.addClass(className.vertical);
+ }
+ if($actions.length > 0 && !$actions.hasClass(className.attached)) {
+ if ($actions && (!$actions.hasClass(className.basic) || $actions.hasClass(className.left))) {
+ $toast.addClass(className.actions);
+ }
+ }
+ if(settings.displayTime === 'auto'){
+ settings.displayTime = Math.max(settings.minDisplayTime, $toast.text().split(" ").length / settings.wordsPerMinute * 60000);
+ }
+ $toastBox.append($toast);
+
+ if($actions.length > 0 && $actions.hasClass(className.attached)) {
+ $actions.addClass(className.buttons);
+ $actions.detach();
+ $toast.addClass(className.attached);
+ if (!$actions.hasClass(className.vertical)) {
+ if ($actions.hasClass(className.top)) {
+ $toastBox.prepend($actions);
+ $toast.addClass(className.bottom);
+ } else {
+ $toastBox.append($actions);
+ $toast.addClass(className.top);
+ }
+ } else {
+ $toast.wrap(
+ $('
',{
+ class:className.vertical + ' ' +
+ className.attached + ' ' +
+ (settings.compact ? className.compact : '')
+ })
+ );
+ if($actions.hasClass(className.left)) {
+ $toast.addClass(className.left).parent().addClass(className.left).prepend($actions);
+ } else {
+ $toast.parent().append($actions);
+ }
+ }
+ }
+ if($module !== $toast) {
+ $module = $toast;
+ element = $toast[0];
+ }
+ if(settings.displayTime > 0) {
+ var progressingClass = className.progressing+' '+(settings.pauseOnHover ? className.pausable:'');
+ if (!!settings.showProgress) {
+ $progress = $('
', {
+ class: className.progress + ' ' + (settings.classProgress || settings.class),
+ 'data-percent': ''
+ });
+ if(!settings.classProgress) {
+ if ($toast.hasClass('toast') && !$toast.hasClass(className.inverted)) {
+ $progress.addClass(className.inverted);
+ } else {
+ $progress.removeClass(className.inverted);
+ }
+ }
+ $progressBar = $('
', {class: 'bar '+(settings.progressUp ? 'up ' : 'down ')+progressingClass});
+ $progress
+ .addClass(settings.showProgress)
+ .append($progressBar);
+ if ($progress.hasClass(className.top)) {
+ $toastBox.prepend($progress);
+ } else {
+ $toastBox.append($progress);
+ }
+ $progressBar.css('animation-duration', settings.displayTime / 1000 + 's');
+ }
+ $animationObject = $(' ',{class:'wait '+progressingClass});
+ $animationObject.css('animation-duration', settings.displayTime / 1000 + 's');
+ $animationObject.appendTo($toast);
+ }
+ if (settings.compact) {
+ $toastBox.addClass(className.compact);
+ $toast.addClass(className.compact);
+ if($progress) {
+ $progress.addClass(className.compact);
+ }
+ }
+ if (settings.newestOnTop) {
+ $toastBox.prependTo(module.get.container());
+ }
+ else {
+ $toastBox.appendTo(module.get.container());
+ }
+ }
+ },
+
+ bind: {
+ events: function() {
+ module.debug('Binding events to toast');
+ if(settings.closeOnClick || settings.closeIcon) {
+ (settings.closeIcon ? $close : $toast)
+ .on('click' + eventNamespace, module.event.click)
+ ;
+ }
+ if($animationObject) {
+ $animationObject.on('animationend' + eventNamespace, module.close);
+ }
+ $toastBox
+ .on('click' + eventNamespace, selector.approve, module.event.approve)
+ .on('click' + eventNamespace, selector.deny, module.event.deny)
+ ;
+ }
+ },
+
+ unbind: {
+ events: function() {
+ module.debug('Unbinding events to toast');
+ if(settings.closeOnClick || settings.closeIcon) {
+ (settings.closeIcon ? $close : $toast)
+ .off('click' + eventNamespace)
+ ;
+ }
+ if($animationObject) {
+ $animationObject.off('animationend' + eventNamespace);
+ }
+ $toastBox
+ .off('click' + eventNamespace)
+ ;
+ }
+ },
+
+ animate: {
+ show: function(callback) {
+ callback = $.isFunction(callback) ? callback : function(){};
+ if(settings.transition && module.can.useElement('transition') && $module.transition('is supported')) {
+ module.set.visible();
+ $toastBox
+ .transition({
+ animation : settings.transition.showMethod + ' in',
+ queue : false,
+ debug : settings.debug,
+ verbose : settings.verbose,
+ duration : settings.transition.showDuration,
+ onComplete : function() {
+ callback.call($toastBox, element);
+ settings.onVisible.call($toastBox, element);
+ }
+ })
+ ;
+ }
+ },
+ close: function(callback) {
+ callback = $.isFunction(callback) ? callback : function(){};
+ module.debug('Closing toast');
+ if(settings.onHide.call($toastBox, element) === false) {
+ module.debug('onHide callback returned false, cancelling toast animation');
+ return;
+ }
+ if(settings.transition && $.fn.transition !== undefined && $module.transition('is supported')) {
+ $toastBox
+ .transition({
+ animation : settings.transition.hideMethod + ' out',
+ queue : false,
+ duration : settings.transition.hideDuration,
+ debug : settings.debug,
+ verbose : settings.verbose,
+ interval : 50,
+
+ onBeforeHide: function(callback){
+ callback = $.isFunction(callback)?callback : function(){};
+ if(settings.transition.closeEasing !== ''){
+ if($toastBox) {
+ $toastBox.css('opacity', 0);
+ $toastBox.wrap('
').parent().hide(settings.transition.closeDuration, settings.transition.closeEasing, function () {
+ if ($toastBox) {
+ $toastBox.parent().remove();
+ callback.call($toastBox);
+ }
+ });
+ }
+ } else {
+ callback.call($toastBox);
+ }
+ },
+ onComplete : function() {
+ callback.call($toastBox, element);
+ settings.onHidden.call($toastBox, element);
+ module.destroy();
+ }
+ })
+ ;
+ }
+ else {
+ module.error(error.noTransition);
+ }
+ },
+ pause: function() {
+ $animationObject.css('animationPlayState','paused');
+ if($progressBar) {
+ $progressBar.css('animationPlayState', 'paused');
+ }
+ },
+ continue: function() {
+ $animationObject.css('animationPlayState','running');
+ if($progressBar) {
+ $progressBar.css('animationPlayState', 'running');
+ }
+ }
+ },
+
+ has: {
+ container: function() {
+ module.verbose('Determining if there is already a container');
+ return ($context.find(module.helpers.toClass(settings.position) + selector.container + (settings.horizontal ? module.helpers.toClass(className.horizontal) : '')).length > 0);
+ },
+ toast: function(){
+ return !!module.get.toast();
+ },
+ toasts: function(){
+ return module.get.toasts().length > 0;
+ },
+ configActions: function () {
+ return Array.isArray(settings.actions) && settings.actions.length > 0;
+ }
+ },
+
+ get: {
+ container: function() {
+ return ($context.find(module.helpers.toClass(settings.position) + selector.container)[0]);
+ },
+ toastBox: function() {
+ return $toastBox || null;
+ },
+ toast: function() {
+ return $toast || null;
+ },
+ toasts: function() {
+ return $(module.get.container()).find(selector.box);
+ },
+ iconClass: function() {
+ return typeof settings.showIcon === 'string' ? settings.showIcon : settings.showIcon && settings.icons[settings.class] ? settings.icons[settings.class] : '';
+ },
+ remainingTime: function() {
+ return $animationObject ? $animationObject.css('opacity') * settings.displayTime : 0;
+ }
+ },
+
+ set: {
+ visible: function() {
+ $toast.addClass(className.visible);
+ }
+ },
+
+ remove: {
+ visible: function() {
+ $toast.removeClass(className.visible);
+ }
+ },
+
+ event: {
+ click: function(event) {
+ if($(event.target).closest('a').length === 0) {
+ settings.onClick.call($toastBox, element);
+ module.close();
+ }
+ },
+ approve: function() {
+ if(settings.onApprove.call(element, $module) === false) {
+ module.verbose('Approve callback returned false cancelling close');
+ return;
+ }
+ module.close();
+ },
+ deny: function() {
+ if(settings.onDeny.call(element, $module) === false) {
+ module.verbose('Deny callback returned false cancelling close');
+ return;
+ }
+ module.close();
+ }
+ },
+
+ helpers: {
+ toClass: function(selector) {
+ var
+ classes = selector.split(' '),
+ result = ''
+ ;
+
+ classes.forEach(function (element) {
+ result += '.' + element;
+ });
+
+ return result;
+ },
+ deQuote: function(string) {
+ return String(string).replace(/"/g,"");
+ },
+ escape: function(string, preserveHTML) {
+ if (preserveHTML){
+ return string;
+ }
+ var
+ badChars = /[<>"'`]/g,
+ shouldEscape = /[&<>"'`]/,
+ escape = {
+ "<": "<",
+ ">": ">",
+ '"': """,
+ "'": "'",
+ "`": "`"
+ },
+ escapedChar = function(chr) {
+ return escape[chr];
+ }
+ ;
+ if(shouldEscape.test(string)) {
+ string = string.replace(/&(?![a-z0-9#]{1,6};)/, "&");
+ return string.replace(badChars, escapedChar);
+ }
+ return string;
+ }
+ },
+
+ can: {
+ useElement: function(element){
+ if ($.fn[element] !== undefined) {
+ return true;
+ }
+ module.error(error.noElement.replace('{element}',element));
+ return false;
+ }
+ },
+
+ setting: function(name, value) {
+ module.debug('Changing setting', name, value);
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ if($.isPlainObject(settings[name])) {
+ $.extend(true, settings[name], value);
+ }
+ else {
+ settings[name] = value;
+ }
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ module.error(error.method, query);
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ returnedValue = $module;
+ }
+ })
+ ;
+
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.fn.toast.settings = {
+
+ name : 'Toast',
+ namespace : 'toast',
+
+ silent : false,
+ debug : false,
+ verbose : false,
+ performance : true,
+
+ context : 'body',
+
+ position : 'top right',
+ horizontal : false,
+ class : 'neutral',
+ classProgress : false,
+ classActions : false,
+ classImage : 'mini',
+
+ title : '',
+ message : '',
+ displayTime : 3000, // set to zero to require manually dismissal, otherwise hides on its own
+ minDisplayTime : 1000, // minimum displaytime in case displayTime is set to 'auto'
+ wordsPerMinute : 120,
+ showIcon : false,
+ newestOnTop : false,
+ showProgress : false,
+ pauseOnHover : true,
+ progressUp : false, //if true, the bar will start at 0% and increase to 100%
+ opacity : 1,
+ compact : true,
+ closeIcon : false,
+ closeOnClick : true,
+ cloneModule : true,
+ actions : false,
+ preserveHTML : true,
+ showImage : false,
+
+ // transition settings
+ transition : {
+ showMethod : 'scale',
+ showDuration : 500,
+ hideMethod : 'scale',
+ hideDuration : 500,
+ closeEasing : 'easeOutCubic', //Set to empty string to stack the closed toast area immediately (old behaviour)
+ closeDuration: 500
+ },
+
+ error: {
+ method : 'The method you called is not defined.',
+ noElement : 'This module requires ui {element}',
+ verticalCard : 'Vertical but not attached actions are not supported for card layout'
+ },
+
+ className : {
+ container : 'ui toast-container',
+ box : 'floating toast-box',
+ progress : 'ui attached active progress',
+ toast : 'ui toast',
+ icon : 'centered icon',
+ visible : 'visible',
+ content : 'content',
+ title : 'ui header',
+ message : 'message',
+ actions : 'actions',
+ extraContent : 'extra content',
+ button : 'ui button',
+ buttons : 'ui buttons',
+ close : 'close icon',
+ image : 'ui image',
+ vertical : 'vertical',
+ horizontal : 'horizontal',
+ attached : 'attached',
+ inverted : 'inverted',
+ compact : 'compact',
+ pausable : 'pausable',
+ progressing : 'progressing',
+ top : 'top',
+ bottom : 'bottom',
+ left : 'left',
+ basic : 'basic',
+ unclickable : 'unclickable'
+ },
+
+ icons : {
+ info : 'info',
+ success : 'checkmark',
+ warning : 'warning',
+ error : 'times'
+ },
+
+ selector : {
+ container : '.ui.toast-container',
+ box : '.toast-box',
+ toast : '.ui.toast',
+ title : '.header',
+ message : '.message:not(.ui)',
+ image : '> img.image, > .image > img',
+ icon : '> i.icon',
+ input : 'input:not([type="hidden"]), textarea, select, button, .ui.button, ui.dropdown',
+ approve : '.actions .positive, .actions .approve, .actions .ok',
+ deny : '.actions .negative, .actions .deny, .actions .cancel'
+ },
+
+ fields : {
+ class : 'class',
+ text : 'text',
+ icon : 'icon',
+ click : 'click'
+ },
+
+ // callbacks
+ onShow : function(){},
+ onVisible : function(){},
+ onClick : function(){},
+ onHide : function(){},
+ onHidden : function(){},
+ onRemove : function(){},
+ onApprove : function(){},
+ onDeny : function(){}
+};
+
+$.extend( $.easing, {
+ easeOutBounce: function (x, t, b, c, d) {
+ if ((t/=d) < (1/2.75)) {
+ return c*(7.5625*t*t) + b;
+ } else if (t < (2/2.75)) {
+ return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
+ } else if (t < (2.5/2.75)) {
+ return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
+ } else {
+ return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
+ }
+ },
+ easeOutCubic: function (t) {
+ return (--t)*t*t+1;
+ }
+});
+
+
+})( jQuery, window, document );
+
+/*!
+ * # Fomantic-UI 2.8.8 - Transition
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+'use strict';
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.transition = function() {
+ var
+ $allModules = $(this),
+ moduleSelector = $allModules.selector || '',
+
+ time = new Date().getTime(),
+ performance = [],
+
+ moduleArguments = arguments,
+ query = moduleArguments[0],
+ queryArguments = [].slice.call(arguments, 1),
+ methodInvoked = (typeof query === 'string'),
+
+ returnedValue
+ ;
+ $allModules
+ .each(function(index) {
+ var
+ $module = $(this),
+ element = this,
+
+ // set at run time
+ settings,
+ instance,
+
+ error,
+ className,
+ metadata,
+ animationEnd,
+
+ moduleNamespace,
+ eventNamespace,
+ module
+ ;
+
+ module = {
+
+ initialize: function() {
+
+ // get full settings
+ settings = module.get.settings.apply(element, moduleArguments);
+
+ // shorthand
+ className = settings.className;
+ error = settings.error;
+ metadata = settings.metadata;
+
+ // define namespace
+ eventNamespace = '.' + settings.namespace;
+ moduleNamespace = 'module-' + settings.namespace;
+ instance = $module.data(moduleNamespace) || module;
+
+ // get vendor specific events
+ animationEnd = module.get.animationEndEvent();
+
+ if(methodInvoked) {
+ methodInvoked = module.invoke(query);
+ }
+
+ // method not invoked, lets run an animation
+ if(methodInvoked === false) {
+ module.verbose('Converted arguments into settings object', settings);
+ if(settings.interval) {
+ module.delay(settings.animate);
+ }
+ else {
+ module.animate();
+ }
+ module.instantiate();
+ }
+ },
+
+ instantiate: function() {
+ module.verbose('Storing instance of module', module);
+ instance = module;
+ $module
+ .data(moduleNamespace, instance)
+ ;
+ },
+
+ destroy: function() {
+ module.verbose('Destroying previous module for', element);
+ $module
+ .removeData(moduleNamespace)
+ ;
+ },
+
+ refresh: function() {
+ module.verbose('Refreshing display type on next animation');
+ delete module.displayType;
+ },
+
+ forceRepaint: function() {
+ module.verbose('Forcing element repaint');
+ var
+ $parentElement = $module.parent(),
+ $nextElement = $module.next()
+ ;
+ if($nextElement.length === 0) {
+ $module.detach().appendTo($parentElement);
+ }
+ else {
+ $module.detach().insertBefore($nextElement);
+ }
+ },
+
+ repaint: function() {
+ module.verbose('Repainting element');
+ var
+ fakeAssignment = element.offsetWidth
+ ;
+ },
+
+ delay: function(interval) {
+ var
+ direction = module.get.animationDirection(),
+ shouldReverse,
+ delay
+ ;
+ if(!direction) {
+ direction = module.can.transition()
+ ? module.get.direction()
+ : 'static'
+ ;
+ }
+ interval = (interval !== undefined)
+ ? interval
+ : settings.interval
+ ;
+ shouldReverse = (settings.reverse == 'auto' && direction == className.outward);
+ delay = (shouldReverse || settings.reverse == true)
+ ? ($allModules.length - index) * settings.interval
+ : index * settings.interval
+ ;
+ module.debug('Delaying animation by', delay);
+ setTimeout(module.animate, delay);
+ },
+
+ animate: function(overrideSettings) {
+ settings = overrideSettings || settings;
+ if(!module.is.supported()) {
+ module.error(error.support);
+ return false;
+ }
+ module.debug('Preparing animation', settings.animation);
+ if(module.is.animating()) {
+ if(settings.queue) {
+ if(!settings.allowRepeats && module.has.direction() && module.is.occurring() && module.queuing !== true) {
+ module.debug('Animation is currently occurring, preventing queueing same animation', settings.animation);
+ }
+ else {
+ module.queue(settings.animation);
+ }
+ return false;
+ }
+ else if(!settings.allowRepeats && module.is.occurring()) {
+ module.debug('Animation is already occurring, will not execute repeated animation', settings.animation);
+ return false;
+ }
+ else {
+ module.debug('New animation started, completing previous early', settings.animation);
+ instance.complete();
+ }
+ }
+ if( module.can.animate() ) {
+ module.set.animating(settings.animation);
+ }
+ else {
+ module.error(error.noAnimation, settings.animation, element);
+ }
+ },
+
+ reset: function() {
+ module.debug('Resetting animation to beginning conditions');
+ module.remove.animationCallbacks();
+ module.restore.conditions();
+ module.remove.animating();
+ },
+
+ queue: function(animation) {
+ module.debug('Queueing animation of', animation);
+ module.queuing = true;
+ $module
+ .one(animationEnd + '.queue' + eventNamespace, function() {
+ module.queuing = false;
+ module.repaint();
+ module.animate.apply(this, settings);
+ })
+ ;
+ },
+
+ complete: function (event) {
+ if(event && event.target === element) {
+ event.stopPropagation();
+ }
+ module.debug('Animation complete', settings.animation);
+ module.remove.completeCallback();
+ module.remove.failSafe();
+ if(!module.is.looping()) {
+ if( module.is.outward() ) {
+ module.verbose('Animation is outward, hiding element');
+ module.restore.conditions();
+ module.hide();
+ }
+ else if( module.is.inward() ) {
+ module.verbose('Animation is outward, showing element');
+ module.restore.conditions();
+ module.show();
+ }
+ else {
+ module.verbose('Static animation completed');
+ module.restore.conditions();
+ settings.onComplete.call(element);
+ }
+ }
+ },
+
+ force: {
+ visible: function() {
+ var
+ style = $module.attr('style'),
+ userStyle = module.get.userStyle(style),
+ displayType = module.get.displayType(),
+ overrideStyle = userStyle + 'display: ' + displayType + ' !important;',
+ inlineDisplay = $module[0].style.display,
+ mustStayHidden = !displayType || (inlineDisplay === 'none' && settings.skipInlineHidden) || $module[0].tagName.match(/(script|link|style)/i)
+ ;
+ if (mustStayHidden){
+ module.remove.transition();
+ return false;
+ }
+ module.verbose('Overriding default display to show element', displayType);
+ $module
+ .attr('style', overrideStyle)
+ ;
+ return true;
+ },
+ hidden: function() {
+ var
+ style = $module.attr('style'),
+ currentDisplay = $module.css('display'),
+ emptyStyle = (style === undefined || style === '')
+ ;
+ if(currentDisplay !== 'none' && !module.is.hidden()) {
+ module.verbose('Overriding default display to hide element');
+ $module
+ .css('display', 'none')
+ ;
+ }
+ else if(emptyStyle) {
+ $module
+ .removeAttr('style')
+ ;
+ }
+ }
+ },
+
+ has: {
+ direction: function(animation) {
+ var
+ hasDirection = false
+ ;
+ animation = animation || settings.animation;
+ if(typeof animation === 'string') {
+ animation = animation.split(' ');
+ $.each(animation, function(index, word){
+ if(word === className.inward || word === className.outward) {
+ hasDirection = true;
+ }
+ });
+ }
+ return hasDirection;
+ },
+ inlineDisplay: function() {
+ var
+ style = $module.attr('style') || ''
+ ;
+ return Array.isArray(style.match(/display.*?;/, ''));
+ }
+ },
+
+ set: {
+ animating: function(animation) {
+ // remove previous callbacks
+ module.remove.completeCallback();
+
+ // determine exact animation
+ animation = animation || settings.animation;
+ var animationClass = module.get.animationClass(animation);
+
+ // save animation class in cache to restore class names
+ module.save.animation(animationClass);
+
+ if(module.force.visible()) {
+ module.remove.hidden();
+ module.remove.direction();
+
+ module.start.animation(animationClass);
+ }
+ },
+ duration: function(animationName, duration) {
+ duration = duration || settings.duration;
+ duration = (typeof duration == 'number')
+ ? duration + 'ms'
+ : duration
+ ;
+ if(duration || duration === 0) {
+ module.verbose('Setting animation duration', duration);
+ $module
+ .css({
+ 'animation-duration': duration
+ })
+ ;
+ }
+ },
+ direction: function(direction) {
+ direction = direction || module.get.direction();
+ if(direction == className.inward) {
+ module.set.inward();
+ }
+ else {
+ module.set.outward();
+ }
+ },
+ looping: function() {
+ module.debug('Transition set to loop');
+ $module
+ .addClass(className.looping)
+ ;
+ },
+ hidden: function() {
+ $module
+ .addClass(className.transition)
+ .addClass(className.hidden)
+ ;
+ },
+ inward: function() {
+ module.debug('Setting direction to inward');
+ $module
+ .removeClass(className.outward)
+ .addClass(className.inward)
+ ;
+ },
+ outward: function() {
+ module.debug('Setting direction to outward');
+ $module
+ .removeClass(className.inward)
+ .addClass(className.outward)
+ ;
+ },
+ visible: function() {
+ $module
+ .addClass(className.transition)
+ .addClass(className.visible)
+ ;
+ }
+ },
+
+ start: {
+ animation: function(animationClass) {
+ animationClass = animationClass || module.get.animationClass();
+ module.debug('Starting tween', animationClass);
+ $module
+ .addClass(animationClass)
+ .one(animationEnd + '.complete' + eventNamespace, module.complete)
+ ;
+ if(settings.useFailSafe) {
+ module.add.failSafe();
+ }
+ module.set.duration(settings.duration);
+ settings.onStart.call(element);
+ }
+ },
+
+ save: {
+ animation: function(animation) {
+ if(!module.cache) {
+ module.cache = {};
+ }
+ module.cache.animation = animation;
+ },
+ displayType: function(displayType) {
+ if(displayType !== 'none') {
+ $module.data(metadata.displayType, displayType);
+ }
+ },
+ transitionExists: function(animation, exists) {
+ $.fn.transition.exists[animation] = exists;
+ module.verbose('Saving existence of transition', animation, exists);
+ }
+ },
+
+ restore: {
+ conditions: function() {
+ var
+ animation = module.get.currentAnimation()
+ ;
+ if(animation) {
+ $module
+ .removeClass(animation)
+ ;
+ module.verbose('Removing animation class', module.cache);
+ }
+ module.remove.duration();
+ }
+ },
+
+ add: {
+ failSafe: function() {
+ var
+ duration = module.get.duration()
+ ;
+ module.timer = setTimeout(function() {
+ $module.triggerHandler(animationEnd);
+ }, duration + settings.failSafeDelay);
+ module.verbose('Adding fail safe timer', module.timer);
+ }
+ },
+
+ remove: {
+ animating: function() {
+ $module.removeClass(className.animating);
+ },
+ animationCallbacks: function() {
+ module.remove.queueCallback();
+ module.remove.completeCallback();
+ },
+ queueCallback: function() {
+ $module.off('.queue' + eventNamespace);
+ },
+ completeCallback: function() {
+ $module.off('.complete' + eventNamespace);
+ },
+ display: function() {
+ $module.css('display', '');
+ },
+ direction: function() {
+ $module
+ .removeClass(className.inward)
+ .removeClass(className.outward)
+ ;
+ },
+ duration: function() {
+ $module
+ .css('animation-duration', '')
+ ;
+ },
+ failSafe: function() {
+ module.verbose('Removing fail safe timer', module.timer);
+ if(module.timer) {
+ clearTimeout(module.timer);
+ }
+ },
+ hidden: function() {
+ $module.removeClass(className.hidden);
+ },
+ visible: function() {
+ $module.removeClass(className.visible);
+ },
+ looping: function() {
+ module.debug('Transitions are no longer looping');
+ if( module.is.looping() ) {
+ module.reset();
+ $module
+ .removeClass(className.looping)
+ ;
+ }
+ },
+ transition: function() {
+ $module
+ .removeClass(className.transition)
+ .removeClass(className.visible)
+ .removeClass(className.hidden)
+ ;
+ }
+ },
+ get: {
+ settings: function(animation, duration, onComplete) {
+ // single settings object
+ if(typeof animation == 'object') {
+ return $.extend(true, {}, $.fn.transition.settings, animation);
+ }
+ // all arguments provided
+ else if(typeof onComplete == 'function') {
+ return $.extend({}, $.fn.transition.settings, {
+ animation : animation,
+ onComplete : onComplete,
+ duration : duration
+ });
+ }
+ // only duration provided
+ else if(typeof duration == 'string' || typeof duration == 'number') {
+ return $.extend({}, $.fn.transition.settings, {
+ animation : animation,
+ duration : duration
+ });
+ }
+ // duration is actually settings object
+ else if(typeof duration == 'object') {
+ return $.extend({}, $.fn.transition.settings, duration, {
+ animation : animation
+ });
+ }
+ // duration is actually callback
+ else if(typeof duration == 'function') {
+ return $.extend({}, $.fn.transition.settings, {
+ animation : animation,
+ onComplete : duration
+ });
+ }
+ // only animation provided
+ else {
+ return $.extend({}, $.fn.transition.settings, {
+ animation : animation
+ });
+ }
+ },
+ animationClass: function(animation) {
+ var
+ animationClass = animation || settings.animation,
+ directionClass = (module.can.transition() && !module.has.direction())
+ ? module.get.direction() + ' '
+ : ''
+ ;
+ return className.animating + ' '
+ + className.transition + ' '
+ + directionClass
+ + animationClass
+ ;
+ },
+ currentAnimation: function() {
+ return (module.cache && module.cache.animation !== undefined)
+ ? module.cache.animation
+ : false
+ ;
+ },
+ currentDirection: function() {
+ return module.is.inward()
+ ? className.inward
+ : className.outward
+ ;
+ },
+ direction: function() {
+ return module.is.hidden() || !module.is.visible()
+ ? className.inward
+ : className.outward
+ ;
+ },
+ animationDirection: function(animation) {
+ var
+ direction
+ ;
+ animation = animation || settings.animation;
+ if(typeof animation === 'string') {
+ animation = animation.split(' ');
+ // search animation name for out/in class
+ $.each(animation, function(index, word){
+ if(word === className.inward) {
+ direction = className.inward;
+ }
+ else if(word === className.outward) {
+ direction = className.outward;
+ }
+ });
+ }
+ // return found direction
+ if(direction) {
+ return direction;
+ }
+ return false;
+ },
+ duration: function(duration) {
+ duration = duration || settings.duration;
+ if(duration === false) {
+ duration = $module.css('animation-duration') || 0;
+ }
+ return (typeof duration === 'string')
+ ? (duration.indexOf('ms') > -1)
+ ? parseFloat(duration)
+ : parseFloat(duration) * 1000
+ : duration
+ ;
+ },
+ displayType: function(shouldDetermine) {
+ shouldDetermine = (shouldDetermine !== undefined)
+ ? shouldDetermine
+ : true
+ ;
+ if(settings.displayType) {
+ return settings.displayType;
+ }
+ if(shouldDetermine && $module.data(metadata.displayType) === undefined) {
+ var currentDisplay = $module.css('display');
+ if(currentDisplay === '' || currentDisplay === 'none'){
+ // create fake element to determine display state
+ module.can.transition(true);
+ } else {
+ module.save.displayType(currentDisplay);
+ }
+ }
+ return $module.data(metadata.displayType);
+ },
+ userStyle: function(style) {
+ style = style || $module.attr('style') || '';
+ return style.replace(/display.*?;/, '');
+ },
+ transitionExists: function(animation) {
+ return $.fn.transition.exists[animation];
+ },
+ animationStartEvent: function() {
+ var
+ element = document.createElement('div'),
+ animations = {
+ 'animation' :'animationstart',
+ 'OAnimation' :'oAnimationStart',
+ 'MozAnimation' :'mozAnimationStart',
+ 'WebkitAnimation' :'webkitAnimationStart'
+ },
+ animation
+ ;
+ for(animation in animations){
+ if( element.style[animation] !== undefined ){
+ return animations[animation];
+ }
+ }
+ return false;
+ },
+ animationEndEvent: function() {
+ var
+ element = document.createElement('div'),
+ animations = {
+ 'animation' :'animationend',
+ 'OAnimation' :'oAnimationEnd',
+ 'MozAnimation' :'mozAnimationEnd',
+ 'WebkitAnimation' :'webkitAnimationEnd'
+ },
+ animation
+ ;
+ for(animation in animations){
+ if( element.style[animation] !== undefined ){
+ return animations[animation];
+ }
+ }
+ return false;
+ }
+
+ },
+
+ can: {
+ transition: function(forced) {
+ var
+ animation = settings.animation,
+ transitionExists = module.get.transitionExists(animation),
+ displayType = module.get.displayType(false),
+ elementClass,
+ tagName,
+ $clone,
+ currentAnimation,
+ inAnimation,
+ directionExists
+ ;
+ if( transitionExists === undefined || forced) {
+ module.verbose('Determining whether animation exists');
+ elementClass = $module.attr('class');
+ tagName = $module.prop('tagName');
+
+ $clone = $('<' + tagName + ' />').addClass( elementClass ).insertAfter($module);
+ currentAnimation = $clone
+ .addClass(animation)
+ .removeClass(className.inward)
+ .removeClass(className.outward)
+ .addClass(className.animating)
+ .addClass(className.transition)
+ .css('animationName')
+ ;
+ inAnimation = $clone
+ .addClass(className.inward)
+ .css('animationName')
+ ;
+ if(!displayType) {
+ displayType = $clone
+ .attr('class', elementClass)
+ .removeAttr('style')
+ .removeClass(className.hidden)
+ .removeClass(className.visible)
+ .show()
+ .css('display')
+ ;
+ module.verbose('Determining final display state', displayType);
+ module.save.displayType(displayType);
+ }
+
+ $clone.remove();
+ if(currentAnimation != inAnimation) {
+ module.debug('Direction exists for animation', animation);
+ directionExists = true;
+ }
+ else if(currentAnimation == 'none' || !currentAnimation) {
+ module.debug('No animation defined in css', animation);
+ return;
+ }
+ else {
+ module.debug('Static animation found', animation, displayType);
+ directionExists = false;
+ }
+ module.save.transitionExists(animation, directionExists);
+ }
+ return (transitionExists !== undefined)
+ ? transitionExists
+ : directionExists
+ ;
+ },
+ animate: function() {
+ // can transition does not return a value if animation does not exist
+ return (module.can.transition() !== undefined);
+ }
+ },
+
+ is: {
+ animating: function() {
+ return $module.hasClass(className.animating);
+ },
+ inward: function() {
+ return $module.hasClass(className.inward);
+ },
+ outward: function() {
+ return $module.hasClass(className.outward);
+ },
+ looping: function() {
+ return $module.hasClass(className.looping);
+ },
+ occurring: function(animation) {
+ animation = animation || settings.animation;
+ animation = '.' + animation.replace(' ', '.');
+ return ( $module.filter(animation).length > 0 );
+ },
+ visible: function() {
+ return $module.is(':visible');
+ },
+ hidden: function() {
+ return $module.css('visibility') === 'hidden';
+ },
+ supported: function() {
+ return(animationEnd !== false);
+ }
+ },
+
+ hide: function() {
+ module.verbose('Hiding element');
+ if( module.is.animating() ) {
+ module.reset();
+ }
+ element.blur(); // IE will trigger focus change if element is not blurred before hiding
+ module.remove.display();
+ module.remove.visible();
+ if($.isFunction(settings.onBeforeHide)){
+ settings.onBeforeHide.call(element,function(){
+ module.hideNow();
+ });
+ } else {
+ module.hideNow();
+ }
+
+ },
+
+ hideNow: function() {
+ module.set.hidden();
+ module.force.hidden();
+ settings.onHide.call(element);
+ settings.onComplete.call(element);
+ // module.repaint();
+ },
+
+ show: function(display) {
+ module.verbose('Showing element', display);
+ if(module.force.visible()) {
+ module.remove.hidden();
+ module.set.visible();
+ settings.onShow.call(element);
+ settings.onComplete.call(element);
+ // module.repaint();
+ }
+ },
+
+ toggle: function() {
+ if( module.is.visible() ) {
+ module.hide();
+ }
+ else {
+ module.show();
+ }
+ },
+
+ stop: function() {
+ module.debug('Stopping current animation');
+ $module.triggerHandler(animationEnd);
+ },
+
+ stopAll: function() {
+ module.debug('Stopping all animation');
+ module.remove.queueCallback();
+ $module.triggerHandler(animationEnd);
+ },
+
+ clear: {
+ queue: function() {
+ module.debug('Clearing animation queue');
+ module.remove.queueCallback();
+ }
+ },
+
+ enable: function() {
+ module.verbose('Starting animation');
+ $module.removeClass(className.disabled);
+ },
+
+ disable: function() {
+ module.debug('Stopping animation');
+ $module.addClass(className.disabled);
+ },
+
+ setting: function(name, value) {
+ module.debug('Changing setting', name, value);
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ if($.isPlainObject(settings[name])) {
+ $.extend(true, settings[name], value);
+ }
+ else {
+ settings[name] = value;
+ }
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if($allModules.length > 1) {
+ title += ' ' + '(' + $allModules.length + ')';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ // modified for transition to return invoke success
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return (found !== undefined)
+ ? found
+ : false
+ ;
+ }
+ };
+ module.initialize();
+ })
+ ;
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+// Records if CSS transition is available
+$.fn.transition.exists = {};
+
+$.fn.transition.settings = {
+
+ // module info
+ name : 'Transition',
+
+ // hide all output from this component regardless of other settings
+ silent : false,
+
+ // debug content outputted to console
+ debug : false,
+
+ // verbose debug output
+ verbose : false,
+
+ // performance data output
+ performance : true,
+
+ // event namespace
+ namespace : 'transition',
+
+ // delay between animations in group
+ interval : 0,
+
+ // whether group animations should be reversed
+ reverse : 'auto',
+
+ // animation callback event
+ onStart : function() {},
+ onComplete : function() {},
+ onShow : function() {},
+ onHide : function() {},
+
+ // whether timeout should be used to ensure callback fires in cases animationend does not
+ useFailSafe : true,
+
+ // delay in ms for fail safe
+ failSafeDelay : 100,
+
+ // whether EXACT animation can occur twice in a row
+ allowRepeats : false,
+
+ // Override final display type on visible
+ displayType : false,
+
+ // animation duration
+ animation : 'fade',
+ duration : false,
+
+ // new animations will occur after previous ones
+ queue : true,
+
+// whether initially inline hidden objects should be skipped for transition
+ skipInlineHidden: false,
+
+ metadata : {
+ displayType: 'display'
+ },
+
+ className : {
+ animating : 'animating',
+ disabled : 'disabled',
+ hidden : 'hidden',
+ inward : 'in',
+ loading : 'loading',
+ looping : 'looping',
+ outward : 'out',
+ transition : 'transition',
+ visible : 'visible'
+ },
+
+ // possible errors
+ error: {
+ noAnimation : 'Element is no longer attached to DOM. Unable to animate. Use silent setting to surpress this warning in production.',
+ repeated : 'That animation is already occurring, cancelling repeated animation',
+ method : 'The method you called is not defined',
+ support : 'This browser does not support CSS animations'
+ }
+
+};
+
+
+})( jQuery, window, document );
+
+/*!
+ * # Fomantic-UI 2.8.8 - API
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+'use strict';
+
+$.isWindow = $.isWindow || function(obj) {
+ return obj != null && obj === obj.window;
+};
+
+ window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.api = $.fn.api = function(parameters) {
+
+ var
+ // use window context if none specified
+ $allModules = $.isFunction(this)
+ ? $(window)
+ : $(this),
+ moduleSelector = $allModules.selector || '',
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+
+ returnedValue
+ ;
+
+ $allModules
+ .each(function() {
+ var
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.fn.api.settings, parameters)
+ : $.extend({}, $.fn.api.settings),
+
+ // internal aliases
+ namespace = settings.namespace,
+ metadata = settings.metadata,
+ selector = settings.selector,
+ error = settings.error,
+ className = settings.className,
+
+ // define namespaces for modules
+ eventNamespace = '.' + namespace,
+ moduleNamespace = 'module-' + namespace,
+
+ // element that creates request
+ $module = $(this),
+ $form = $module.closest(selector.form),
+
+ // context used for state
+ $context = (settings.stateContext)
+ ? $(settings.stateContext)
+ : $module,
+
+ // request details
+ ajaxSettings,
+ requestSettings,
+ url,
+ data,
+ requestStartTime,
+
+ // standard module
+ element = this,
+ context = $context[0],
+ instance = $module.data(moduleNamespace),
+ module
+ ;
+
+ module = {
+
+ initialize: function() {
+ if(!methodInvoked) {
+ module.bind.events();
+ }
+ module.instantiate();
+ },
+
+ instantiate: function() {
+ module.verbose('Storing instance of module', module);
+ instance = module;
+ $module
+ .data(moduleNamespace, instance)
+ ;
+ },
+
+ destroy: function() {
+ module.verbose('Destroying previous module for', element);
+ $module
+ .removeData(moduleNamespace)
+ .off(eventNamespace)
+ ;
+ },
+
+ bind: {
+ events: function() {
+ var
+ triggerEvent = module.get.event()
+ ;
+ if( triggerEvent ) {
+ module.verbose('Attaching API events to element', triggerEvent);
+ $module
+ .on(triggerEvent + eventNamespace, module.event.trigger)
+ ;
+ }
+ else if(settings.on == 'now') {
+ module.debug('Querying API endpoint immediately');
+ module.query();
+ }
+ }
+ },
+
+ decode: {
+ json: function(response) {
+ if(response !== undefined && typeof response == 'string') {
+ try {
+ response = JSON.parse(response);
+ }
+ catch(e) {
+ // isnt json string
+ }
+ }
+ return response;
+ }
+ },
+
+ read: {
+ cachedResponse: function(url) {
+ var
+ response
+ ;
+ if(window.Storage === undefined) {
+ module.error(error.noStorage);
+ return;
+ }
+ response = sessionStorage.getItem(url);
+ module.debug('Using cached response', url, response);
+ response = module.decode.json(response);
+ return response;
+ }
+ },
+ write: {
+ cachedResponse: function(url, response) {
+ if(response && response === '') {
+ module.debug('Response empty, not caching', response);
+ return;
+ }
+ if(window.Storage === undefined) {
+ module.error(error.noStorage);
+ return;
+ }
+ if( $.isPlainObject(response) ) {
+ response = JSON.stringify(response);
+ }
+ sessionStorage.setItem(url, response);
+ module.verbose('Storing cached response for url', url, response);
+ }
+ },
+
+ query: function() {
+
+ if(module.is.disabled()) {
+ module.debug('Element is disabled API request aborted');
+ return;
+ }
+
+ if(module.is.loading()) {
+ if(settings.interruptRequests) {
+ module.debug('Interrupting previous request');
+ module.abort();
+ }
+ else {
+ module.debug('Cancelling request, previous request is still pending');
+ return;
+ }
+ }
+
+ // pass element metadata to url (value, text)
+ if(settings.defaultData) {
+ $.extend(true, settings.urlData, module.get.defaultData());
+ }
+
+ // Add form content
+ if(settings.serializeForm) {
+ settings.data = module.add.formData(settings.data);
+ }
+
+ // call beforesend and get any settings changes
+ requestSettings = module.get.settings();
+
+ // check if before send cancelled request
+ if(requestSettings === false) {
+ module.cancelled = true;
+ module.error(error.beforeSend);
+ return;
+ }
+ else {
+ module.cancelled = false;
+ }
+
+ // get url
+ url = module.get.templatedURL();
+
+ if(!url && !module.is.mocked()) {
+ module.error(error.missingURL);
+ return;
+ }
+
+ // replace variables
+ url = module.add.urlData( url );
+ // missing url parameters
+ if( !url && !module.is.mocked()) {
+ return;
+ }
+
+ requestSettings.url = settings.base + url;
+
+ // look for jQuery ajax parameters in settings
+ ajaxSettings = $.extend(true, {}, settings, {
+ type : settings.method || settings.type,
+ data : data,
+ url : settings.base + url,
+ beforeSend : settings.beforeXHR,
+ success : function() {},
+ failure : function() {},
+ complete : function() {}
+ });
+
+ module.debug('Querying URL', ajaxSettings.url);
+ module.verbose('Using AJAX settings', ajaxSettings);
+ if(settings.cache === 'local' && module.read.cachedResponse(url)) {
+ module.debug('Response returned from local cache');
+ module.request = module.create.request();
+ module.request.resolveWith(context, [ module.read.cachedResponse(url) ]);
+ return;
+ }
+
+ if( !settings.throttle ) {
+ module.debug('Sending request', data, ajaxSettings.method);
+ module.send.request();
+ }
+ else {
+ if(!settings.throttleFirstRequest && !module.timer) {
+ module.debug('Sending request', data, ajaxSettings.method);
+ module.send.request();
+ module.timer = setTimeout(function(){}, settings.throttle);
+ }
+ else {
+ module.debug('Throttling request', settings.throttle);
+ clearTimeout(module.timer);
+ module.timer = setTimeout(function() {
+ if(module.timer) {
+ delete module.timer;
+ }
+ module.debug('Sending throttled request', data, ajaxSettings.method);
+ module.send.request();
+ }, settings.throttle);
+ }
+ }
+
+ },
+
+ should: {
+ removeError: function() {
+ return ( settings.hideError === true || (settings.hideError === 'auto' && !module.is.form()) );
+ }
+ },
+
+ is: {
+ disabled: function() {
+ return ($module.filter(selector.disabled).length > 0);
+ },
+ expectingJSON: function() {
+ return settings.dataType === 'json' || settings.dataType === 'jsonp';
+ },
+ form: function() {
+ return $module.is('form') || $context.is('form');
+ },
+ mocked: function() {
+ return (settings.mockResponse || settings.mockResponseAsync || settings.response || settings.responseAsync);
+ },
+ input: function() {
+ return $module.is('input');
+ },
+ loading: function() {
+ return (module.request)
+ ? (module.request.state() == 'pending')
+ : false
+ ;
+ },
+ abortedRequest: function(xhr) {
+ if(xhr && xhr.readyState !== undefined && xhr.readyState === 0) {
+ module.verbose('XHR request determined to be aborted');
+ return true;
+ }
+ else {
+ module.verbose('XHR request was not aborted');
+ return false;
+ }
+ },
+ validResponse: function(response) {
+ if( (!module.is.expectingJSON()) || !$.isFunction(settings.successTest) ) {
+ module.verbose('Response is not JSON, skipping validation', settings.successTest, response);
+ return true;
+ }
+ module.debug('Checking JSON returned success', settings.successTest, response);
+ if( settings.successTest(response) ) {
+ module.debug('Response passed success test', response);
+ return true;
+ }
+ else {
+ module.debug('Response failed success test', response);
+ return false;
+ }
+ }
+ },
+
+ was: {
+ cancelled: function() {
+ return (module.cancelled || false);
+ },
+ succesful: function() {
+ module.verbose('This behavior will be deleted due to typo. Use "was successful" instead.');
+ return module.was.successful();
+ },
+ successful: function() {
+ return (module.request && module.request.state() == 'resolved');
+ },
+ failure: function() {
+ return (module.request && module.request.state() == 'rejected');
+ },
+ complete: function() {
+ return (module.request && (module.request.state() == 'resolved' || module.request.state() == 'rejected') );
+ }
+ },
+
+ add: {
+ urlData: function(url, urlData) {
+ var
+ requiredVariables,
+ optionalVariables
+ ;
+ if(url) {
+ requiredVariables = url.match(settings.regExp.required);
+ optionalVariables = url.match(settings.regExp.optional);
+ urlData = urlData || settings.urlData;
+ if(requiredVariables) {
+ module.debug('Looking for required URL variables', requiredVariables);
+ $.each(requiredVariables, function(index, templatedString) {
+ var
+ // allow legacy {$var} style
+ variable = (templatedString.indexOf('$') !== -1)
+ ? templatedString.substr(2, templatedString.length - 3)
+ : templatedString.substr(1, templatedString.length - 2),
+ value = ($.isPlainObject(urlData) && urlData[variable] !== undefined)
+ ? urlData[variable]
+ : ($module.data(variable) !== undefined)
+ ? $module.data(variable)
+ : ($context.data(variable) !== undefined)
+ ? $context.data(variable)
+ : urlData[variable]
+ ;
+ // remove value
+ if(value === undefined) {
+ module.error(error.requiredParameter, variable, url);
+ url = false;
+ return false;
+ }
+ else {
+ module.verbose('Found required variable', variable, value);
+ value = (settings.encodeParameters)
+ ? module.get.urlEncodedValue(value)
+ : value
+ ;
+ url = url.replace(templatedString, value);
+ }
+ });
+ }
+ if(optionalVariables) {
+ module.debug('Looking for optional URL variables', requiredVariables);
+ $.each(optionalVariables, function(index, templatedString) {
+ var
+ // allow legacy {/$var} style
+ variable = (templatedString.indexOf('$') !== -1)
+ ? templatedString.substr(3, templatedString.length - 4)
+ : templatedString.substr(2, templatedString.length - 3),
+ value = ($.isPlainObject(urlData) && urlData[variable] !== undefined)
+ ? urlData[variable]
+ : ($module.data(variable) !== undefined)
+ ? $module.data(variable)
+ : ($context.data(variable) !== undefined)
+ ? $context.data(variable)
+ : urlData[variable]
+ ;
+ // optional replacement
+ if(value !== undefined) {
+ module.verbose('Optional variable Found', variable, value);
+ url = url.replace(templatedString, value);
+ }
+ else {
+ module.verbose('Optional variable not found', variable);
+ // remove preceding slash if set
+ if(url.indexOf('/' + templatedString) !== -1) {
+ url = url.replace('/' + templatedString, '');
+ }
+ else {
+ url = url.replace(templatedString, '');
+ }
+ }
+ });
+ }
+ }
+ return url;
+ },
+ formData: function(data) {
+ var
+ canSerialize = ($.fn.serializeObject !== undefined),
+ formData = (canSerialize)
+ ? $form.serializeObject()
+ : $form.serialize(),
+ hasOtherData
+ ;
+ data = data || settings.data;
+ hasOtherData = $.isPlainObject(data);
+
+ if(hasOtherData) {
+ if(canSerialize) {
+ module.debug('Extending existing data with form data', data, formData);
+ data = $.extend(true, {}, data, formData);
+ }
+ else {
+ module.error(error.missingSerialize);
+ module.debug('Cant extend data. Replacing data with form data', data, formData);
+ data = formData;
+ }
+ }
+ else {
+ module.debug('Adding form data', formData);
+ data = formData;
+ }
+ return data;
+ }
+ },
+
+ send: {
+ request: function() {
+ module.set.loading();
+ module.request = module.create.request();
+ if( module.is.mocked() ) {
+ module.mockedXHR = module.create.mockedXHR();
+ }
+ else {
+ module.xhr = module.create.xhr();
+ }
+ settings.onRequest.call(context, module.request, module.xhr);
+ }
+ },
+
+ event: {
+ trigger: function(event) {
+ module.query();
+ if(event.type == 'submit' || event.type == 'click') {
+ event.preventDefault();
+ }
+ },
+ xhr: {
+ always: function() {
+ // nothing special
+ },
+ done: function(response, textStatus, xhr) {
+ var
+ context = this,
+ elapsedTime = (new Date().getTime() - requestStartTime),
+ timeLeft = (settings.loadingDuration - elapsedTime),
+ translatedResponse = ( $.isFunction(settings.onResponse) )
+ ? module.is.expectingJSON() && !settings.rawResponse
+ ? settings.onResponse.call(context, $.extend(true, {}, response))
+ : settings.onResponse.call(context, response)
+ : false
+ ;
+ timeLeft = (timeLeft > 0)
+ ? timeLeft
+ : 0
+ ;
+ if(translatedResponse) {
+ module.debug('Modified API response in onResponse callback', settings.onResponse, translatedResponse, response);
+ response = translatedResponse;
+ }
+ if(timeLeft > 0) {
+ module.debug('Response completed early delaying state change by', timeLeft);
+ }
+ setTimeout(function() {
+ if( module.is.validResponse(response) ) {
+ module.request.resolveWith(context, [response, xhr]);
+ }
+ else {
+ module.request.rejectWith(context, [xhr, 'invalid']);
+ }
+ }, timeLeft);
+ },
+ fail: function(xhr, status, httpMessage) {
+ var
+ context = this,
+ elapsedTime = (new Date().getTime() - requestStartTime),
+ timeLeft = (settings.loadingDuration - elapsedTime)
+ ;
+ timeLeft = (timeLeft > 0)
+ ? timeLeft
+ : 0
+ ;
+ if(timeLeft > 0) {
+ module.debug('Response completed early delaying state change by', timeLeft);
+ }
+ setTimeout(function() {
+ if( module.is.abortedRequest(xhr) ) {
+ module.request.rejectWith(context, [xhr, 'aborted', httpMessage]);
+ }
+ else {
+ module.request.rejectWith(context, [xhr, 'error', status, httpMessage]);
+ }
+ }, timeLeft);
+ }
+ },
+ request: {
+ done: function(response, xhr) {
+ module.debug('Successful API Response', response);
+ if(settings.cache === 'local' && url) {
+ module.write.cachedResponse(url, response);
+ module.debug('Saving server response locally', module.cache);
+ }
+ settings.onSuccess.call(context, response, $module, xhr);
+ },
+ complete: function(firstParameter, secondParameter) {
+ var
+ xhr,
+ response
+ ;
+ // have to guess callback parameters based on request success
+ if( module.was.successful() ) {
+ response = firstParameter;
+ xhr = secondParameter;
+ }
+ else {
+ xhr = firstParameter;
+ response = module.get.responseFromXHR(xhr);
+ }
+ module.remove.loading();
+ settings.onComplete.call(context, response, $module, xhr);
+ },
+ fail: function(xhr, status, httpMessage) {
+ var
+ // pull response from xhr if available
+ response = module.get.responseFromXHR(xhr),
+ errorMessage = module.get.errorFromRequest(response, status, httpMessage)
+ ;
+ if(status == 'aborted') {
+ module.debug('XHR Aborted (Most likely caused by page navigation or CORS Policy)', status, httpMessage);
+ settings.onAbort.call(context, status, $module, xhr);
+ return true;
+ }
+ else if(status == 'invalid') {
+ module.debug('JSON did not pass success test. A server-side error has most likely occurred', response);
+ }
+ else if(status == 'error') {
+ if(xhr !== undefined) {
+ module.debug('XHR produced a server error', status, httpMessage);
+ // make sure we have an error to display to console
+ if( (xhr.status < 200 || xhr.status >= 300) && httpMessage !== undefined && httpMessage !== '') {
+ module.error(error.statusMessage + httpMessage, ajaxSettings.url);
+ }
+ settings.onError.call(context, errorMessage, $module, xhr);
+ }
+ }
+
+ if(settings.errorDuration && status !== 'aborted') {
+ module.debug('Adding error state');
+ module.set.error();
+ if( module.should.removeError() ) {
+ setTimeout(module.remove.error, settings.errorDuration);
+ }
+ }
+ module.debug('API Request failed', errorMessage, xhr);
+ settings.onFailure.call(context, response, $module, xhr);
+ }
+ }
+ },
+
+ create: {
+
+ request: function() {
+ // api request promise
+ return $.Deferred()
+ .always(module.event.request.complete)
+ .done(module.event.request.done)
+ .fail(module.event.request.fail)
+ ;
+ },
+
+ mockedXHR: function () {
+ var
+ // xhr does not simulate these properties of xhr but must return them
+ textStatus = false,
+ status = false,
+ httpMessage = false,
+ responder = settings.mockResponse || settings.response,
+ asyncResponder = settings.mockResponseAsync || settings.responseAsync,
+ asyncCallback,
+ response,
+ mockedXHR
+ ;
+
+ mockedXHR = $.Deferred()
+ .always(module.event.xhr.complete)
+ .done(module.event.xhr.done)
+ .fail(module.event.xhr.fail)
+ ;
+
+ if(responder) {
+ if( $.isFunction(responder) ) {
+ module.debug('Using specified synchronous callback', responder);
+ response = responder.call(context, requestSettings);
+ }
+ else {
+ module.debug('Using settings specified response', responder);
+ response = responder;
+ }
+ // simulating response
+ mockedXHR.resolveWith(context, [ response, textStatus, { responseText: response }]);
+ }
+ else if( $.isFunction(asyncResponder) ) {
+ asyncCallback = function(response) {
+ module.debug('Async callback returned response', response);
+
+ if(response) {
+ mockedXHR.resolveWith(context, [ response, textStatus, { responseText: response }]);
+ }
+ else {
+ mockedXHR.rejectWith(context, [{ responseText: response }, status, httpMessage]);
+ }
+ };
+ module.debug('Using specified async response callback', asyncResponder);
+ asyncResponder.call(context, requestSettings, asyncCallback);
+ }
+ return mockedXHR;
+ },
+
+ xhr: function() {
+ var
+ xhr
+ ;
+ // ajax request promise
+ xhr = $.ajax(ajaxSettings)
+ .always(module.event.xhr.always)
+ .done(module.event.xhr.done)
+ .fail(module.event.xhr.fail)
+ ;
+ module.verbose('Created server request', xhr, ajaxSettings);
+ return xhr;
+ }
+ },
+
+ set: {
+ error: function() {
+ module.verbose('Adding error state to element', $context);
+ $context.addClass(className.error);
+ },
+ loading: function() {
+ module.verbose('Adding loading state to element', $context);
+ $context.addClass(className.loading);
+ requestStartTime = new Date().getTime();
+ }
+ },
+
+ remove: {
+ error: function() {
+ module.verbose('Removing error state from element', $context);
+ $context.removeClass(className.error);
+ },
+ loading: function() {
+ module.verbose('Removing loading state from element', $context);
+ $context.removeClass(className.loading);
+ }
+ },
+
+ get: {
+ responseFromXHR: function(xhr) {
+ return $.isPlainObject(xhr)
+ ? (module.is.expectingJSON())
+ ? module.decode.json(xhr.responseText)
+ : xhr.responseText
+ : false
+ ;
+ },
+ errorFromRequest: function(response, status, httpMessage) {
+ return ($.isPlainObject(response) && response.error !== undefined)
+ ? response.error // use json error message
+ : (settings.error[status] !== undefined) // use server error message
+ ? settings.error[status]
+ : httpMessage
+ ;
+ },
+ request: function() {
+ return module.request || false;
+ },
+ xhr: function() {
+ return module.xhr || false;
+ },
+ settings: function() {
+ var
+ runSettings
+ ;
+ runSettings = settings.beforeSend.call($module, settings);
+ if(runSettings) {
+ if(runSettings.success !== undefined) {
+ module.debug('Legacy success callback detected', runSettings);
+ module.error(error.legacyParameters, runSettings.success);
+ runSettings.onSuccess = runSettings.success;
+ }
+ if(runSettings.failure !== undefined) {
+ module.debug('Legacy failure callback detected', runSettings);
+ module.error(error.legacyParameters, runSettings.failure);
+ runSettings.onFailure = runSettings.failure;
+ }
+ if(runSettings.complete !== undefined) {
+ module.debug('Legacy complete callback detected', runSettings);
+ module.error(error.legacyParameters, runSettings.complete);
+ runSettings.onComplete = runSettings.complete;
+ }
+ }
+ if(runSettings === undefined) {
+ module.error(error.noReturnedValue);
+ }
+ if(runSettings === false) {
+ return runSettings;
+ }
+ return (runSettings !== undefined)
+ ? $.extend(true, {}, runSettings)
+ : $.extend(true, {}, settings)
+ ;
+ },
+ urlEncodedValue: function(value) {
+ var
+ decodedValue = window.decodeURIComponent(value),
+ encodedValue = window.encodeURIComponent(value),
+ alreadyEncoded = (decodedValue !== value)
+ ;
+ if(alreadyEncoded) {
+ module.debug('URL value is already encoded, avoiding double encoding', value);
+ return value;
+ }
+ module.verbose('Encoding value using encodeURIComponent', value, encodedValue);
+ return encodedValue;
+ },
+ defaultData: function() {
+ var
+ data = {}
+ ;
+ if( !$.isWindow(element) ) {
+ if( module.is.input() ) {
+ data.value = $module.val();
+ }
+ else if( module.is.form() ) {
+
+ }
+ else {
+ data.text = $module.text();
+ }
+ }
+ return data;
+ },
+ event: function() {
+ if( $.isWindow(element) || settings.on == 'now' ) {
+ module.debug('API called without element, no events attached');
+ return false;
+ }
+ else if(settings.on == 'auto') {
+ if( $module.is('input') ) {
+ return (element.oninput !== undefined)
+ ? 'input'
+ : (element.onpropertychange !== undefined)
+ ? 'propertychange'
+ : 'keyup'
+ ;
+ }
+ else if( $module.is('form') ) {
+ return 'submit';
+ }
+ else {
+ return 'click';
+ }
+ }
+ else {
+ return settings.on;
+ }
+ },
+ templatedURL: function(action) {
+ action = action || $module.data(metadata.action) || settings.action || false;
+ url = $module.data(metadata.url) || settings.url || false;
+ if(url) {
+ module.debug('Using specified url', url);
+ return url;
+ }
+ if(action) {
+ module.debug('Looking up url for action', action, settings.api);
+ if(settings.api[action] === undefined && !module.is.mocked()) {
+ module.error(error.missingAction, settings.action, settings.api);
+ return;
+ }
+ url = settings.api[action];
+ }
+ else if( module.is.form() ) {
+ url = $module.attr('action') || $context.attr('action') || false;
+ module.debug('No url or action specified, defaulting to form action', url);
+ }
+ return url;
+ }
+ },
+
+ abort: function() {
+ var
+ xhr = module.get.xhr()
+ ;
+ if( xhr && xhr.state() !== 'resolved') {
+ module.debug('Cancelling API request');
+ xhr.abort();
+ }
+ },
+
+ // reset state
+ reset: function() {
+ module.remove.error();
+ module.remove.loading();
+ },
+
+ setting: function(name, value) {
+ module.debug('Changing setting', name, value);
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ if($.isPlainObject(settings[name])) {
+ $.extend(true, settings[name], value);
+ }
+ else {
+ settings[name] = value;
+ }
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ //'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ module.error(error.method, query);
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ }
+ })
+ ;
+
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.api.settings = {
+
+ name : 'API',
+ namespace : 'api',
+
+ debug : false,
+ verbose : false,
+ performance : true,
+
+ // object containing all templates endpoints
+ api : {},
+
+ // whether to cache responses
+ cache : true,
+
+ // whether new requests should abort previous requests
+ interruptRequests : true,
+
+ // event binding
+ on : 'auto',
+
+ // context for applying state classes
+ stateContext : false,
+
+ // duration for loading state
+ loadingDuration : 0,
+
+ // whether to hide errors after a period of time
+ hideError : 'auto',
+
+ // duration for error state
+ errorDuration : 2000,
+
+ // whether parameters should be encoded with encodeURIComponent
+ encodeParameters : true,
+
+ // API action to use
+ action : false,
+
+ // templated URL to use
+ url : false,
+
+ // base URL to apply to all endpoints
+ base : '',
+
+ // data that will
+ urlData : {},
+
+ // whether to add default data to url data
+ defaultData : true,
+
+ // whether to serialize closest form
+ serializeForm : false,
+
+ // how long to wait before request should occur
+ throttle : 0,
+
+ // whether to throttle first request or only repeated
+ throttleFirstRequest : true,
+
+ // standard ajax settings
+ method : 'get',
+ data : {},
+ dataType : 'json',
+
+ // mock response
+ mockResponse : false,
+ mockResponseAsync : false,
+
+ // aliases for mock
+ response : false,
+ responseAsync : false,
+
+// whether onResponse should work with response value without force converting into an object
+ rawResponse : false,
+
+ // callbacks before request
+ beforeSend : function(settings) { return settings; },
+ beforeXHR : function(xhr) {},
+ onRequest : function(promise, xhr) {},
+
+ // after request
+ onResponse : false, // function(response) { },
+
+ // response was successful, if JSON passed validation
+ onSuccess : function(response, $module) {},
+
+ // request finished without aborting
+ onComplete : function(response, $module) {},
+
+ // failed JSON success test
+ onFailure : function(response, $module) {},
+
+ // server error
+ onError : function(errorMessage, $module) {},
+
+ // request aborted
+ onAbort : function(errorMessage, $module) {},
+
+ successTest : false,
+
+ // errors
+ error : {
+ beforeSend : 'The before send function has aborted the request',
+ error : 'There was an error with your request',
+ exitConditions : 'API Request Aborted. Exit conditions met',
+ JSONParse : 'JSON could not be parsed during error handling',
+ legacyParameters : 'You are using legacy API success callback names',
+ method : 'The method you called is not defined',
+ missingAction : 'API action used but no url was defined',
+ missingSerialize : 'jquery-serialize-object is required to add form data to an existing data object',
+ missingURL : 'No URL specified for api event',
+ noReturnedValue : 'The beforeSend callback must return a settings object, beforeSend ignored.',
+ noStorage : 'Caching responses locally requires session storage',
+ parseError : 'There was an error parsing your request',
+ requiredParameter : 'Missing a required URL parameter: ',
+ statusMessage : 'Server gave an error: ',
+ timeout : 'Your request timed out'
+ },
+
+ regExp : {
+ required : /\{\$*[A-z0-9]+\}/g,
+ optional : /\{\/\$*[A-z0-9]+\}/g,
+ },
+
+ className: {
+ loading : 'loading',
+ error : 'error'
+ },
+
+ selector: {
+ disabled : '.disabled',
+ form : 'form'
+ },
+
+ metadata: {
+ action : 'action',
+ url : 'url'
+ }
+};
+
+
+
+})( jQuery, window, document );
+
+/*!
+ * # Fomantic-UI 2.8.8 - State
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+"use strict";
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.state = function(parameters) {
+ var
+ $allModules = $(this),
+
+ moduleSelector = $allModules.selector || '',
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+
+ returnedValue
+ ;
+ $allModules
+ .each(function() {
+ var
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.fn.state.settings, parameters)
+ : $.extend({}, $.fn.state.settings),
+
+ error = settings.error,
+ metadata = settings.metadata,
+ className = settings.className,
+ namespace = settings.namespace,
+ states = settings.states,
+ text = settings.text,
+
+ eventNamespace = '.' + namespace,
+ moduleNamespace = namespace + '-module',
+
+ $module = $(this),
+
+ element = this,
+ instance = $module.data(moduleNamespace),
+
+ module
+ ;
+ module = {
+
+ initialize: function() {
+ module.verbose('Initializing module');
+
+ // allow module to guess desired state based on element
+ if(settings.automatic) {
+ module.add.defaults();
+ }
+
+ // bind events with delegated events
+ if(settings.context && moduleSelector !== '') {
+ $(settings.context)
+ .on(moduleSelector, 'mouseenter' + eventNamespace, module.change.text)
+ .on(moduleSelector, 'mouseleave' + eventNamespace, module.reset.text)
+ .on(moduleSelector, 'click' + eventNamespace, module.toggle.state)
+ ;
+ }
+ else {
+ $module
+ .on('mouseenter' + eventNamespace, module.change.text)
+ .on('mouseleave' + eventNamespace, module.reset.text)
+ .on('click' + eventNamespace, module.toggle.state)
+ ;
+ }
+ module.instantiate();
+ },
+
+ instantiate: function() {
+ module.verbose('Storing instance of module', module);
+ instance = module;
+ $module
+ .data(moduleNamespace, module)
+ ;
+ },
+
+ destroy: function() {
+ module.verbose('Destroying previous module', instance);
+ $module
+ .off(eventNamespace)
+ .removeData(moduleNamespace)
+ ;
+ },
+
+ refresh: function() {
+ module.verbose('Refreshing selector cache');
+ $module = $(element);
+ },
+
+ add: {
+ defaults: function() {
+ var
+ userStates = parameters && $.isPlainObject(parameters.states)
+ ? parameters.states
+ : {}
+ ;
+ $.each(settings.defaults, function(type, typeStates) {
+ if( module.is[type] !== undefined && module.is[type]() ) {
+ module.verbose('Adding default states', type, element);
+ $.extend(settings.states, typeStates, userStates);
+ }
+ });
+ }
+ },
+
+ is: {
+
+ active: function() {
+ return $module.hasClass(className.active);
+ },
+ loading: function() {
+ return $module.hasClass(className.loading);
+ },
+ inactive: function() {
+ return !( $module.hasClass(className.active) );
+ },
+ state: function(state) {
+ if(className[state] === undefined) {
+ return false;
+ }
+ return $module.hasClass( className[state] );
+ },
+
+ enabled: function() {
+ return !( $module.is(settings.filter.active) );
+ },
+ disabled: function() {
+ return ( $module.is(settings.filter.active) );
+ },
+ textEnabled: function() {
+ return !( $module.is(settings.filter.text) );
+ },
+
+ // definitions for automatic type detection
+ button: function() {
+ return $module.is('.button:not(a, .submit)');
+ },
+ input: function() {
+ return $module.is('input');
+ },
+ progress: function() {
+ return $module.is('.ui.progress');
+ }
+ },
+
+ allow: function(state) {
+ module.debug('Now allowing state', state);
+ states[state] = true;
+ },
+ disallow: function(state) {
+ module.debug('No longer allowing', state);
+ states[state] = false;
+ },
+
+ allows: function(state) {
+ return states[state] || false;
+ },
+
+ enable: function() {
+ $module.removeClass(className.disabled);
+ },
+
+ disable: function() {
+ $module.addClass(className.disabled);
+ },
+
+ setState: function(state) {
+ if(module.allows(state)) {
+ $module.addClass( className[state] );
+ }
+ },
+
+ removeState: function(state) {
+ if(module.allows(state)) {
+ $module.removeClass( className[state] );
+ }
+ },
+
+ toggle: {
+ state: function() {
+ var
+ apiRequest,
+ requestCancelled
+ ;
+ if( module.allows('active') && module.is.enabled() ) {
+ module.refresh();
+ if($.fn.api !== undefined) {
+ apiRequest = $module.api('get request');
+ requestCancelled = $module.api('was cancelled');
+ if( requestCancelled ) {
+ module.debug('API Request cancelled by beforesend');
+ settings.activateTest = function(){ return false; };
+ settings.deactivateTest = function(){ return false; };
+ }
+ else if(apiRequest) {
+ module.listenTo(apiRequest);
+ return;
+ }
+ }
+ module.change.state();
+ }
+ }
+ },
+
+ listenTo: function(apiRequest) {
+ module.debug('API request detected, waiting for state signal', apiRequest);
+ if(apiRequest) {
+ if(text.loading) {
+ module.update.text(text.loading);
+ }
+ $.when(apiRequest)
+ .then(function() {
+ if(apiRequest.state() == 'resolved') {
+ module.debug('API request succeeded');
+ settings.activateTest = function(){ return true; };
+ settings.deactivateTest = function(){ return true; };
+ }
+ else {
+ module.debug('API request failed');
+ settings.activateTest = function(){ return false; };
+ settings.deactivateTest = function(){ return false; };
+ }
+ module.change.state();
+ })
+ ;
+ }
+ },
+
+ // checks whether active/inactive state can be given
+ change: {
+
+ state: function() {
+ module.debug('Determining state change direction');
+ // inactive to active change
+ if( module.is.inactive() ) {
+ module.activate();
+ }
+ else {
+ module.deactivate();
+ }
+ if(settings.sync) {
+ module.sync();
+ }
+ settings.onChange.call(element);
+ },
+
+ text: function() {
+ if( module.is.textEnabled() ) {
+ if(module.is.disabled() ) {
+ module.verbose('Changing text to disabled text', text.hover);
+ module.update.text(text.disabled);
+ }
+ else if( module.is.active() ) {
+ if(text.hover) {
+ module.verbose('Changing text to hover text', text.hover);
+ module.update.text(text.hover);
+ }
+ else if(text.deactivate) {
+ module.verbose('Changing text to deactivating text', text.deactivate);
+ module.update.text(text.deactivate);
+ }
+ }
+ else {
+ if(text.hover) {
+ module.verbose('Changing text to hover text', text.hover);
+ module.update.text(text.hover);
+ }
+ else if(text.activate){
+ module.verbose('Changing text to activating text', text.activate);
+ module.update.text(text.activate);
+ }
+ }
+ }
+ }
+
+ },
+
+ activate: function() {
+ if( settings.activateTest.call(element) ) {
+ module.debug('Setting state to active');
+ $module
+ .addClass(className.active)
+ ;
+ module.update.text(text.active);
+ settings.onActivate.call(element);
+ }
+ },
+
+ deactivate: function() {
+ if( settings.deactivateTest.call(element) ) {
+ module.debug('Setting state to inactive');
+ $module
+ .removeClass(className.active)
+ ;
+ module.update.text(text.inactive);
+ settings.onDeactivate.call(element);
+ }
+ },
+
+ sync: function() {
+ module.verbose('Syncing other buttons to current state');
+ if( module.is.active() ) {
+ $allModules
+ .not($module)
+ .state('activate');
+ }
+ else {
+ $allModules
+ .not($module)
+ .state('deactivate')
+ ;
+ }
+ },
+
+ get: {
+ text: function() {
+ return (settings.selector.text)
+ ? $module.find(settings.selector.text).text()
+ : $module.html()
+ ;
+ },
+ textFor: function(state) {
+ return text[state] || false;
+ }
+ },
+
+ flash: {
+ text: function(text, duration, callback) {
+ var
+ previousText = module.get.text()
+ ;
+ module.debug('Flashing text message', text, duration);
+ text = text || settings.text.flash;
+ duration = duration || settings.flashDuration;
+ callback = callback || function() {};
+ module.update.text(text);
+ setTimeout(function(){
+ module.update.text(previousText);
+ callback.call(element);
+ }, duration);
+ }
+ },
+
+ reset: {
+ // on mouseout sets text to previous value
+ text: function() {
+ var
+ activeText = text.active || $module.data(metadata.storedText),
+ inactiveText = text.inactive || $module.data(metadata.storedText)
+ ;
+ if( module.is.textEnabled() ) {
+ if( module.is.active() && activeText) {
+ module.verbose('Resetting active text', activeText);
+ module.update.text(activeText);
+ }
+ else if(inactiveText) {
+ module.verbose('Resetting inactive text', activeText);
+ module.update.text(inactiveText);
+ }
+ }
+ }
+ },
+
+ update: {
+ text: function(text) {
+ var
+ currentText = module.get.text()
+ ;
+ if(text && text !== currentText) {
+ module.debug('Updating text', text);
+ if(settings.selector.text) {
+ $module
+ .data(metadata.storedText, text)
+ .find(settings.selector.text)
+ .text(text)
+ ;
+ }
+ else {
+ $module
+ .data(metadata.storedText, text)
+ .html(text)
+ ;
+ }
+ }
+ else {
+ module.debug('Text is already set, ignoring update', text);
+ }
+ }
+ },
+
+ setting: function(name, value) {
+ module.debug('Changing setting', name, value);
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ if($.isPlainObject(settings[name])) {
+ $.extend(true, settings[name], value);
+ }
+ else {
+ settings[name] = value;
+ }
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ module.error(error.method, query);
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ }
+ })
+ ;
+
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.fn.state.settings = {
+
+ // module info
+ name : 'State',
+
+ // debug output
+ debug : false,
+
+ // verbose debug output
+ verbose : false,
+
+ // namespace for events
+ namespace : 'state',
+
+ // debug data includes performance
+ performance : true,
+
+ // callback occurs on state change
+ onActivate : function() {},
+ onDeactivate : function() {},
+ onChange : function() {},
+
+ // state test functions
+ activateTest : function() { return true; },
+ deactivateTest : function() { return true; },
+
+ // whether to automatically map default states
+ automatic : true,
+
+ // activate / deactivate changes all elements instantiated at same time
+ sync : false,
+
+ // default flash text duration, used for temporarily changing text of an element
+ flashDuration : 1000,
+
+ // selector filter
+ filter : {
+ text : '.loading, .disabled',
+ active : '.disabled'
+ },
+
+ context : false,
+
+ // error
+ error: {
+ beforeSend : 'The before send function has cancelled state change',
+ method : 'The method you called is not defined.'
+ },
+
+ // metadata
+ metadata: {
+ promise : 'promise',
+ storedText : 'stored-text'
+ },
+
+ // change class on state
+ className: {
+ active : 'active',
+ disabled : 'disabled',
+ error : 'error',
+ loading : 'loading',
+ success : 'success',
+ warning : 'warning'
+ },
+
+ selector: {
+ // selector for text node
+ text: false
+ },
+
+ defaults : {
+ input: {
+ disabled : true,
+ loading : true,
+ active : true
+ },
+ button: {
+ disabled : true,
+ loading : true,
+ active : true,
+ },
+ progress: {
+ active : true,
+ success : true,
+ warning : true,
+ error : true
+ }
+ },
+
+ states : {
+ active : true,
+ disabled : true,
+ error : true,
+ loading : true,
+ success : true,
+ warning : true
+ },
+
+ text : {
+ disabled : false,
+ flash : false,
+ hover : false,
+ active : false,
+ inactive : false,
+ activate : false,
+ deactivate : false
+ }
+
+};
+
+
+
+})( jQuery, window, document );
+
+/*!
+ * # Fomantic-UI 2.8.8 - Visibility
+ * http://github.com/fomantic/Fomantic-UI/
+ *
+ *
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+
+;(function ($, window, document, undefined) {
+
+'use strict';
+
+$.isFunction = $.isFunction || function(obj) {
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+};
+
+window = (typeof window != 'undefined' && window.Math == Math)
+ ? window
+ : (typeof self != 'undefined' && self.Math == Math)
+ ? self
+ : Function('return this')()
+;
+
+$.fn.visibility = function(parameters) {
+ var
+ $allModules = $(this),
+ moduleSelector = $allModules.selector || '',
+
+ time = new Date().getTime(),
+ performance = [],
+
+ query = arguments[0],
+ methodInvoked = (typeof query == 'string'),
+ queryArguments = [].slice.call(arguments, 1),
+ returnedValue,
+
+ moduleCount = $allModules.length,
+ loadedCount = 0
+ ;
+
+ $allModules
+ .each(function() {
+ var
+ settings = ( $.isPlainObject(parameters) )
+ ? $.extend(true, {}, $.fn.visibility.settings, parameters)
+ : $.extend({}, $.fn.visibility.settings),
+
+ className = settings.className,
+ namespace = settings.namespace,
+ error = settings.error,
+ metadata = settings.metadata,
+
+ eventNamespace = '.' + namespace,
+ moduleNamespace = 'module-' + namespace,
+
+ $window = $(window),
+
+ $module = $(this),
+ $context = $(settings.context),
+
+ $placeholder,
+
+ instance = $module.data(moduleNamespace),
+
+ requestAnimationFrame = window.requestAnimationFrame
+ || window.mozRequestAnimationFrame
+ || window.webkitRequestAnimationFrame
+ || window.msRequestAnimationFrame
+ || function(callback) { setTimeout(callback, 0); },
+
+ element = this,
+ disabled = false,
+
+ contextObserver,
+ observer,
+ module
+ ;
+
+ module = {
+
+ initialize: function() {
+ module.debug('Initializing', settings);
+
+ module.setup.cache();
+
+ if( module.should.trackChanges() ) {
+
+ if(settings.type == 'image') {
+ module.setup.image();
+ }
+ if(settings.type == 'fixed') {
+ module.setup.fixed();
+ }
+
+ if(settings.observeChanges) {
+ module.observeChanges();
+ }
+ module.bind.events();
+ }
+
+ module.save.position();
+ if( !module.is.visible() ) {
+ module.error(error.visible, $module);
+ }
+
+ if(settings.initialCheck) {
+ module.checkVisibility();
+ }
+ module.instantiate();
+ },
+
+ instantiate: function() {
+ module.debug('Storing instance', module);
+ $module
+ .data(moduleNamespace, module)
+ ;
+ instance = module;
+ },
+
+ destroy: function() {
+ module.verbose('Destroying previous module');
+ if(observer) {
+ observer.disconnect();
+ }
+ if(contextObserver) {
+ contextObserver.disconnect();
+ }
+ $window
+ .off('load' + eventNamespace, module.event.load)
+ .off('resize' + eventNamespace, module.event.resize)
+ ;
+ $context
+ .off('scroll' + eventNamespace, module.event.scroll)
+ .off('scrollchange' + eventNamespace, module.event.scrollchange)
+ ;
+ if(settings.type == 'fixed') {
+ module.resetFixed();
+ module.remove.placeholder();
+ }
+ $module
+ .off(eventNamespace)
+ .removeData(moduleNamespace)
+ ;
+ },
+
+ observeChanges: function() {
+ if('MutationObserver' in window) {
+ contextObserver = new MutationObserver(module.event.contextChanged);
+ observer = new MutationObserver(module.event.changed);
+ contextObserver.observe(document, {
+ childList : true,
+ subtree : true
+ });
+ observer.observe(element, {
+ childList : true,
+ subtree : true
+ });
+ module.debug('Setting up mutation observer', observer);
+ }
+ },
+
+ bind: {
+ events: function() {
+ module.verbose('Binding visibility events to scroll and resize');
+ if(settings.refreshOnLoad) {
+ $window
+ .on('load' + eventNamespace, module.event.load)
+ ;
+ }
+ $window
+ .on('resize' + eventNamespace, module.event.resize)
+ ;
+ // pub/sub pattern
+ $context
+ .off('scroll' + eventNamespace)
+ .on('scroll' + eventNamespace, module.event.scroll)
+ .on('scrollchange' + eventNamespace, module.event.scrollchange)
+ ;
+ }
+ },
+
+ event: {
+ changed: function(mutations) {
+ module.verbose('DOM tree modified, updating visibility calculations');
+ module.timer = setTimeout(function() {
+ module.verbose('DOM tree modified, updating sticky menu');
+ module.refresh();
+ }, 100);
+ },
+ contextChanged: function(mutations) {
+ [].forEach.call(mutations, function(mutation) {
+ if(mutation.removedNodes) {
+ [].forEach.call(mutation.removedNodes, function(node) {
+ if(node == element || $(node).find(element).length > 0) {
+ module.debug('Element removed from DOM, tearing down events');
+ module.destroy();
+ }
+ });
+ }
+ });
+ },
+ resize: function() {
+ module.debug('Window resized');
+ if(settings.refreshOnResize) {
+ requestAnimationFrame(module.refresh);
+ }
+ },
+ load: function() {
+ module.debug('Page finished loading');
+ requestAnimationFrame(module.refresh);
+ },
+ // publishes scrollchange event on one scroll
+ scroll: function() {
+ if(settings.throttle) {
+ clearTimeout(module.timer);
+ module.timer = setTimeout(function() {
+ $context.triggerHandler('scrollchange' + eventNamespace, [ $context.scrollTop() ]);
+ }, settings.throttle);
+ }
+ else {
+ requestAnimationFrame(function() {
+ $context.triggerHandler('scrollchange' + eventNamespace, [ $context.scrollTop() ]);
+ });
+ }
+ },
+ // subscribes to scrollchange
+ scrollchange: function(event, scrollPosition) {
+ module.checkVisibility(scrollPosition);
+ },
+ },
+
+ precache: function(images, callback) {
+ if (!(images instanceof Array)) {
+ images = [images];
+ }
+ var
+ imagesLength = images.length,
+ loadedCounter = 0,
+ cache = [],
+ cacheImage = document.createElement('img'),
+ handleLoad = function() {
+ loadedCounter++;
+ if (loadedCounter >= images.length) {
+ if ($.isFunction(callback)) {
+ callback();
+ }
+ }
+ }
+ ;
+ while (imagesLength--) {
+ cacheImage = document.createElement('img');
+ cacheImage.onload = handleLoad;
+ cacheImage.onerror = handleLoad;
+ cacheImage.src = images[imagesLength];
+ cache.push(cacheImage);
+ }
+ },
+
+ enableCallbacks: function() {
+ module.debug('Allowing callbacks to occur');
+ disabled = false;
+ },
+
+ disableCallbacks: function() {
+ module.debug('Disabling all callbacks temporarily');
+ disabled = true;
+ },
+
+ should: {
+ trackChanges: function() {
+ if(methodInvoked) {
+ module.debug('One time query, no need to bind events');
+ return false;
+ }
+ module.debug('Callbacks being attached');
+ return true;
+ }
+ },
+
+ setup: {
+ cache: function() {
+ module.cache = {
+ occurred : {},
+ screen : {},
+ element : {},
+ };
+ },
+ image: function() {
+ var
+ src = $module.data(metadata.src)
+ ;
+ if(src) {
+ module.verbose('Lazy loading image', src);
+ settings.once = true;
+ settings.observeChanges = false;
+
+ // show when top visible
+ settings.onOnScreen = function() {
+ module.debug('Image on screen', element);
+ module.precache(src, function() {
+ module.set.image(src, function() {
+ loadedCount++;
+ if(loadedCount == moduleCount) {
+ settings.onAllLoaded.call(this);
+ }
+ settings.onLoad.call(this);
+ });
+ });
+ };
+ }
+ },
+ fixed: function() {
+ module.debug('Setting up fixed');
+ settings.once = false;
+ settings.observeChanges = false;
+ settings.initialCheck = true;
+ settings.refreshOnLoad = true;
+ if(!parameters.transition) {
+ settings.transition = false;
+ }
+ module.create.placeholder();
+ module.debug('Added placeholder', $placeholder);
+ settings.onTopPassed = function() {
+ module.debug('Element passed, adding fixed position', $module);
+ module.show.placeholder();
+ module.set.fixed();
+ if(settings.transition) {
+ if($.fn.transition !== undefined) {
+ $module.transition(settings.transition, settings.duration);
+ }
+ }
+ };
+ settings.onTopPassedReverse = function() {
+ module.debug('Element returned to position, removing fixed', $module);
+ module.hide.placeholder();
+ module.remove.fixed();
+ };
+ }
+ },
+
+ create: {
+ placeholder: function() {
+ module.verbose('Creating fixed position placeholder');
+ $placeholder = $module
+ .clone(false)
+ .css('display', 'none')
+ .addClass(className.placeholder)
+ .insertAfter($module)
+ ;
+ }
+ },
+
+ show: {
+ placeholder: function() {
+ module.verbose('Showing placeholder');
+ $placeholder
+ .css('display', 'block')
+ .css('visibility', 'hidden')
+ ;
+ }
+ },
+ hide: {
+ placeholder: function() {
+ module.verbose('Hiding placeholder');
+ $placeholder
+ .css('display', 'none')
+ .css('visibility', '')
+ ;
+ }
+ },
+
+ set: {
+ fixed: function() {
+ module.verbose('Setting element to fixed position');
+ $module
+ .addClass(className.fixed)
+ .css({
+ position : 'fixed',
+ top : settings.offset + 'px',
+ left : 'auto',
+ zIndex : settings.zIndex
+ })
+ ;
+ settings.onFixed.call(element);
+ },
+ image: function(src, callback) {
+ $module
+ .attr('src', src)
+ ;
+ if(settings.transition) {
+ if( $.fn.transition !== undefined) {
+ if($module.hasClass(className.visible)) {
+ module.debug('Transition already occurred on this image, skipping animation');
+ return;
+ }
+ $module.transition(settings.transition, settings.duration, callback);
+ }
+ else {
+ $module.fadeIn(settings.duration, callback);
+ }
+ }
+ else {
+ $module.show();
+ }
+ }
+ },
+
+ is: {
+ onScreen: function() {
+ var
+ calculations = module.get.elementCalculations()
+ ;
+ return calculations.onScreen;
+ },
+ offScreen: function() {
+ var
+ calculations = module.get.elementCalculations()
+ ;
+ return calculations.offScreen;
+ },
+ visible: function() {
+ if(module.cache && module.cache.element) {
+ return !(module.cache.element.width === 0 && module.cache.element.offset.top === 0);
+ }
+ return false;
+ },
+ verticallyScrollableContext: function() {
+ var
+ overflowY = ($context.get(0) !== window)
+ ? $context.css('overflow-y')
+ : false
+ ;
+ return (overflowY == 'auto' || overflowY == 'scroll');
+ },
+ horizontallyScrollableContext: function() {
+ var
+ overflowX = ($context.get(0) !== window)
+ ? $context.css('overflow-x')
+ : false
+ ;
+ return (overflowX == 'auto' || overflowX == 'scroll');
+ }
+ },
+
+ refresh: function() {
+ module.debug('Refreshing constants (width/height)');
+ if(settings.type == 'fixed') {
+ module.resetFixed();
+ }
+ module.reset();
+ module.save.position();
+ if(settings.checkOnRefresh) {
+ module.checkVisibility();
+ }
+ settings.onRefresh.call(element);
+ },
+
+ resetFixed: function () {
+ module.remove.fixed();
+ module.remove.occurred();
+ },
+
+ reset: function() {
+ module.verbose('Resetting all cached values');
+ if( $.isPlainObject(module.cache) ) {
+ module.cache.screen = {};
+ module.cache.element = {};
+ }
+ },
+
+ checkVisibility: function(scroll) {
+ module.verbose('Checking visibility of element', module.cache.element);
+
+ if( !disabled && module.is.visible() ) {
+
+ // save scroll position
+ module.save.scroll(scroll);
+
+ // update calculations derived from scroll
+ module.save.calculations();
+
+ // percentage
+ module.passed();
+
+ // reverse (must be first)
+ module.passingReverse();
+ module.topVisibleReverse();
+ module.bottomVisibleReverse();
+ module.topPassedReverse();
+ module.bottomPassedReverse();
+
+ // one time
+ module.onScreen();
+ module.offScreen();
+ module.passing();
+ module.topVisible();
+ module.bottomVisible();
+ module.topPassed();
+ module.bottomPassed();
+
+ // on update callback
+ if(settings.onUpdate) {
+ settings.onUpdate.call(element, module.get.elementCalculations());
+ }
+ }
+ },
+
+ passed: function(amount, newCallback) {
+ var
+ calculations = module.get.elementCalculations()
+ ;
+ // assign callback
+ if(amount && newCallback) {
+ settings.onPassed[amount] = newCallback;
+ }
+ else if(amount !== undefined) {
+ return (module.get.pixelsPassed(amount) > calculations.pixelsPassed);
+ }
+ else if(calculations.passing) {
+ $.each(settings.onPassed, function(amount, callback) {
+ if(calculations.bottomVisible || calculations.pixelsPassed > module.get.pixelsPassed(amount)) {
+ module.execute(callback, amount);
+ }
+ else if(!settings.once) {
+ module.remove.occurred(callback);
+ }
+ });
+ }
+ },
+
+ onScreen: function(newCallback) {
+ var
+ calculations = module.get.elementCalculations(),
+ callback = newCallback || settings.onOnScreen,
+ callbackName = 'onScreen'
+ ;
+ if(newCallback) {
+ module.debug('Adding callback for onScreen', newCallback);
+ settings.onOnScreen = newCallback;
+ }
+ if(calculations.onScreen) {
+ module.execute(callback, callbackName);
+ }
+ else if(!settings.once) {
+ module.remove.occurred(callbackName);
+ }
+ if(newCallback !== undefined) {
+ return calculations.onOnScreen;
+ }
+ },
+
+ offScreen: function(newCallback) {
+ var
+ calculations = module.get.elementCalculations(),
+ callback = newCallback || settings.onOffScreen,
+ callbackName = 'offScreen'
+ ;
+ if(newCallback) {
+ module.debug('Adding callback for offScreen', newCallback);
+ settings.onOffScreen = newCallback;
+ }
+ if(calculations.offScreen) {
+ module.execute(callback, callbackName);
+ }
+ else if(!settings.once) {
+ module.remove.occurred(callbackName);
+ }
+ if(newCallback !== undefined) {
+ return calculations.onOffScreen;
+ }
+ },
+
+ passing: function(newCallback) {
+ var
+ calculations = module.get.elementCalculations(),
+ callback = newCallback || settings.onPassing,
+ callbackName = 'passing'
+ ;
+ if(newCallback) {
+ module.debug('Adding callback for passing', newCallback);
+ settings.onPassing = newCallback;
+ }
+ if(calculations.passing) {
+ module.execute(callback, callbackName);
+ }
+ else if(!settings.once) {
+ module.remove.occurred(callbackName);
+ }
+ if(newCallback !== undefined) {
+ return calculations.passing;
+ }
+ },
+
+
+ topVisible: function(newCallback) {
+ var
+ calculations = module.get.elementCalculations(),
+ callback = newCallback || settings.onTopVisible,
+ callbackName = 'topVisible'
+ ;
+ if(newCallback) {
+ module.debug('Adding callback for top visible', newCallback);
+ settings.onTopVisible = newCallback;
+ }
+ if(calculations.topVisible) {
+ module.execute(callback, callbackName);
+ }
+ else if(!settings.once) {
+ module.remove.occurred(callbackName);
+ }
+ if(newCallback === undefined) {
+ return calculations.topVisible;
+ }
+ },
+
+ bottomVisible: function(newCallback) {
+ var
+ calculations = module.get.elementCalculations(),
+ callback = newCallback || settings.onBottomVisible,
+ callbackName = 'bottomVisible'
+ ;
+ if(newCallback) {
+ module.debug('Adding callback for bottom visible', newCallback);
+ settings.onBottomVisible = newCallback;
+ }
+ if(calculations.bottomVisible) {
+ module.execute(callback, callbackName);
+ }
+ else if(!settings.once) {
+ module.remove.occurred(callbackName);
+ }
+ if(newCallback === undefined) {
+ return calculations.bottomVisible;
+ }
+ },
+
+ topPassed: function(newCallback) {
+ var
+ calculations = module.get.elementCalculations(),
+ callback = newCallback || settings.onTopPassed,
+ callbackName = 'topPassed'
+ ;
+ if(newCallback) {
+ module.debug('Adding callback for top passed', newCallback);
+ settings.onTopPassed = newCallback;
+ }
+ if(calculations.topPassed) {
+ module.execute(callback, callbackName);
+ }
+ else if(!settings.once) {
+ module.remove.occurred(callbackName);
+ }
+ if(newCallback === undefined) {
+ return calculations.topPassed;
+ }
+ },
+
+ bottomPassed: function(newCallback) {
+ var
+ calculations = module.get.elementCalculations(),
+ callback = newCallback || settings.onBottomPassed,
+ callbackName = 'bottomPassed'
+ ;
+ if(newCallback) {
+ module.debug('Adding callback for bottom passed', newCallback);
+ settings.onBottomPassed = newCallback;
+ }
+ if(calculations.bottomPassed) {
+ module.execute(callback, callbackName);
+ }
+ else if(!settings.once) {
+ module.remove.occurred(callbackName);
+ }
+ if(newCallback === undefined) {
+ return calculations.bottomPassed;
+ }
+ },
+
+ passingReverse: function(newCallback) {
+ var
+ calculations = module.get.elementCalculations(),
+ callback = newCallback || settings.onPassingReverse,
+ callbackName = 'passingReverse'
+ ;
+ if(newCallback) {
+ module.debug('Adding callback for passing reverse', newCallback);
+ settings.onPassingReverse = newCallback;
+ }
+ if(!calculations.passing) {
+ if(module.get.occurred('passing')) {
+ module.execute(callback, callbackName);
+ }
+ }
+ else if(!settings.once) {
+ module.remove.occurred(callbackName);
+ }
+ if(newCallback !== undefined) {
+ return !calculations.passing;
+ }
+ },
+
+
+ topVisibleReverse: function(newCallback) {
+ var
+ calculations = module.get.elementCalculations(),
+ callback = newCallback || settings.onTopVisibleReverse,
+ callbackName = 'topVisibleReverse'
+ ;
+ if(newCallback) {
+ module.debug('Adding callback for top visible reverse', newCallback);
+ settings.onTopVisibleReverse = newCallback;
+ }
+ if(!calculations.topVisible) {
+ if(module.get.occurred('topVisible')) {
+ module.execute(callback, callbackName);
+ }
+ }
+ else if(!settings.once) {
+ module.remove.occurred(callbackName);
+ }
+ if(newCallback === undefined) {
+ return !calculations.topVisible;
+ }
+ },
+
+ bottomVisibleReverse: function(newCallback) {
+ var
+ calculations = module.get.elementCalculations(),
+ callback = newCallback || settings.onBottomVisibleReverse,
+ callbackName = 'bottomVisibleReverse'
+ ;
+ if(newCallback) {
+ module.debug('Adding callback for bottom visible reverse', newCallback);
+ settings.onBottomVisibleReverse = newCallback;
+ }
+ if(!calculations.bottomVisible) {
+ if(module.get.occurred('bottomVisible')) {
+ module.execute(callback, callbackName);
+ }
+ }
+ else if(!settings.once) {
+ module.remove.occurred(callbackName);
+ }
+ if(newCallback === undefined) {
+ return !calculations.bottomVisible;
+ }
+ },
+
+ topPassedReverse: function(newCallback) {
+ var
+ calculations = module.get.elementCalculations(),
+ callback = newCallback || settings.onTopPassedReverse,
+ callbackName = 'topPassedReverse'
+ ;
+ if(newCallback) {
+ module.debug('Adding callback for top passed reverse', newCallback);
+ settings.onTopPassedReverse = newCallback;
+ }
+ if(!calculations.topPassed) {
+ if(module.get.occurred('topPassed')) {
+ module.execute(callback, callbackName);
+ }
+ }
+ else if(!settings.once) {
+ module.remove.occurred(callbackName);
+ }
+ if(newCallback === undefined) {
+ return !calculations.onTopPassed;
+ }
+ },
+
+ bottomPassedReverse: function(newCallback) {
+ var
+ calculations = module.get.elementCalculations(),
+ callback = newCallback || settings.onBottomPassedReverse,
+ callbackName = 'bottomPassedReverse'
+ ;
+ if(newCallback) {
+ module.debug('Adding callback for bottom passed reverse', newCallback);
+ settings.onBottomPassedReverse = newCallback;
+ }
+ if(!calculations.bottomPassed) {
+ if(module.get.occurred('bottomPassed')) {
+ module.execute(callback, callbackName);
+ }
+ }
+ else if(!settings.once) {
+ module.remove.occurred(callbackName);
+ }
+ if(newCallback === undefined) {
+ return !calculations.bottomPassed;
+ }
+ },
+
+ execute: function(callback, callbackName) {
+ var
+ calculations = module.get.elementCalculations(),
+ screen = module.get.screenCalculations()
+ ;
+ callback = callback || false;
+ if(callback) {
+ if(settings.continuous) {
+ module.debug('Callback being called continuously', callbackName, calculations);
+ callback.call(element, calculations, screen);
+ }
+ else if(!module.get.occurred(callbackName)) {
+ module.debug('Conditions met', callbackName, calculations);
+ callback.call(element, calculations, screen);
+ }
+ }
+ module.save.occurred(callbackName);
+ },
+
+ remove: {
+ fixed: function() {
+ module.debug('Removing fixed position');
+ $module
+ .removeClass(className.fixed)
+ .css({
+ position : '',
+ top : '',
+ left : '',
+ zIndex : ''
+ })
+ ;
+ settings.onUnfixed.call(element);
+ },
+ placeholder: function() {
+ module.debug('Removing placeholder content');
+ if($placeholder) {
+ $placeholder.remove();
+ }
+ },
+ occurred: function(callback) {
+ if(callback) {
+ var
+ occurred = module.cache.occurred
+ ;
+ if(occurred[callback] !== undefined && occurred[callback] === true) {
+ module.debug('Callback can now be called again', callback);
+ module.cache.occurred[callback] = false;
+ }
+ }
+ else {
+ module.cache.occurred = {};
+ }
+ }
+ },
+
+ save: {
+ calculations: function() {
+ module.verbose('Saving all calculations necessary to determine positioning');
+ module.save.direction();
+ module.save.screenCalculations();
+ module.save.elementCalculations();
+ },
+ occurred: function(callback) {
+ if(callback) {
+ if(module.cache.occurred[callback] === undefined || (module.cache.occurred[callback] !== true)) {
+ module.verbose('Saving callback occurred', callback);
+ module.cache.occurred[callback] = true;
+ }
+ }
+ },
+ scroll: function(scrollPosition) {
+ scrollPosition = scrollPosition + settings.offset || $context.scrollTop() + settings.offset;
+ module.cache.scroll = scrollPosition;
+ },
+ direction: function() {
+ var
+ scroll = module.get.scroll(),
+ lastScroll = module.get.lastScroll(),
+ direction
+ ;
+ if(scroll > lastScroll && lastScroll) {
+ direction = 'down';
+ }
+ else if(scroll < lastScroll && lastScroll) {
+ direction = 'up';
+ }
+ else {
+ direction = 'static';
+ }
+ module.cache.direction = direction;
+ return module.cache.direction;
+ },
+ elementPosition: function() {
+ var
+ element = module.cache.element,
+ screen = module.get.screenSize()
+ ;
+ module.verbose('Saving element position');
+ // (quicker than $.extend)
+ element.fits = (element.height < screen.height);
+ element.offset = $module.offset();
+ element.width = $module.outerWidth();
+ element.height = $module.outerHeight();
+ // compensate for scroll in context
+ if(module.is.verticallyScrollableContext()) {
+ element.offset.top += $context.scrollTop() - $context.offset().top;
+ }
+ if(module.is.horizontallyScrollableContext()) {
+ element.offset.left += $context.scrollLeft() - $context.offset().left;
+ }
+ // store
+ module.cache.element = element;
+ return element;
+ },
+ elementCalculations: function() {
+ var
+ screen = module.get.screenCalculations(),
+ element = module.get.elementPosition()
+ ;
+ // offset
+ if(settings.includeMargin) {
+ element.margin = {};
+ element.margin.top = parseInt($module.css('margin-top'), 10);
+ element.margin.bottom = parseInt($module.css('margin-bottom'), 10);
+ element.top = element.offset.top - element.margin.top;
+ element.bottom = element.offset.top + element.height + element.margin.bottom;
+ }
+ else {
+ element.top = element.offset.top;
+ element.bottom = element.offset.top + element.height;
+ }
+
+ // visibility
+ element.topPassed = (screen.top >= element.top);
+ element.bottomPassed = (screen.top >= element.bottom);
+ element.topVisible = (screen.bottom >= element.top) && !element.topPassed;
+ element.bottomVisible = (screen.bottom >= element.bottom) && !element.bottomPassed;
+ element.pixelsPassed = 0;
+ element.percentagePassed = 0;
+
+ // meta calculations
+ element.onScreen = ((element.topVisible || element.passing) && !element.bottomPassed);
+ element.passing = (element.topPassed && !element.bottomPassed);
+ element.offScreen = (!element.onScreen);
+
+ // passing calculations
+ if(element.passing) {
+ element.pixelsPassed = (screen.top - element.top);
+ element.percentagePassed = (screen.top - element.top) / element.height;
+ }
+ module.cache.element = element;
+ module.verbose('Updated element calculations', element);
+ return element;
+ },
+ screenCalculations: function() {
+ var
+ scroll = module.get.scroll()
+ ;
+ module.save.direction();
+ module.cache.screen.top = scroll;
+ module.cache.screen.bottom = scroll + module.cache.screen.height;
+ return module.cache.screen;
+ },
+ screenSize: function() {
+ module.verbose('Saving window position');
+ module.cache.screen = {
+ height: $context.height()
+ };
+ },
+ position: function() {
+ module.save.screenSize();
+ module.save.elementPosition();
+ }
+ },
+
+ get: {
+ pixelsPassed: function(amount) {
+ var
+ element = module.get.elementCalculations()
+ ;
+ if(amount.search('%') > -1) {
+ return ( element.height * (parseInt(amount, 10) / 100) );
+ }
+ return parseInt(amount, 10);
+ },
+ occurred: function(callback) {
+ return (module.cache.occurred !== undefined)
+ ? module.cache.occurred[callback] || false
+ : false
+ ;
+ },
+ direction: function() {
+ if(module.cache.direction === undefined) {
+ module.save.direction();
+ }
+ return module.cache.direction;
+ },
+ elementPosition: function() {
+ if(module.cache.element === undefined) {
+ module.save.elementPosition();
+ }
+ return module.cache.element;
+ },
+ elementCalculations: function() {
+ if(module.cache.element === undefined) {
+ module.save.elementCalculations();
+ }
+ return module.cache.element;
+ },
+ screenCalculations: function() {
+ if(module.cache.screen === undefined) {
+ module.save.screenCalculations();
+ }
+ return module.cache.screen;
+ },
+ screenSize: function() {
+ if(module.cache.screen === undefined) {
+ module.save.screenSize();
+ }
+ return module.cache.screen;
+ },
+ scroll: function() {
+ if(module.cache.scroll === undefined) {
+ module.save.scroll();
+ }
+ return module.cache.scroll;
+ },
+ lastScroll: function() {
+ if(module.cache.screen === undefined) {
+ module.debug('First scroll event, no last scroll could be found');
+ return false;
+ }
+ return module.cache.screen.top;
+ }
+ },
+
+ setting: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, settings, name);
+ }
+ else if(value !== undefined) {
+ settings[name] = value;
+ }
+ else {
+ return settings[name];
+ }
+ },
+ internal: function(name, value) {
+ if( $.isPlainObject(name) ) {
+ $.extend(true, module, name);
+ }
+ else if(value !== undefined) {
+ module[name] = value;
+ }
+ else {
+ return module[name];
+ }
+ },
+ debug: function() {
+ if(!settings.silent && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.debug = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.debug.apply(console, arguments);
+ }
+ }
+ },
+ verbose: function() {
+ if(!settings.silent && settings.verbose && settings.debug) {
+ if(settings.performance) {
+ module.performance.log(arguments);
+ }
+ else {
+ module.verbose = Function.prototype.bind.call(console.info, console, settings.name + ':');
+ module.verbose.apply(console, arguments);
+ }
+ }
+ },
+ error: function() {
+ if(!settings.silent) {
+ module.error = Function.prototype.bind.call(console.error, console, settings.name + ':');
+ module.error.apply(console, arguments);
+ }
+ },
+ performance: {
+ log: function(message) {
+ var
+ currentTime,
+ executionTime,
+ previousTime
+ ;
+ if(settings.performance) {
+ currentTime = new Date().getTime();
+ previousTime = time || currentTime;
+ executionTime = currentTime - previousTime;
+ time = currentTime;
+ performance.push({
+ 'Name' : message[0],
+ 'Arguments' : [].slice.call(message, 1) || '',
+ 'Element' : element,
+ 'Execution Time' : executionTime
+ });
+ }
+ clearTimeout(module.performance.timer);
+ module.performance.timer = setTimeout(module.performance.display, 500);
+ },
+ display: function() {
+ var
+ title = settings.name + ':',
+ totalTime = 0
+ ;
+ time = false;
+ clearTimeout(module.performance.timer);
+ $.each(performance, function(index, data) {
+ totalTime += data['Execution Time'];
+ });
+ title += ' ' + totalTime + 'ms';
+ if(moduleSelector) {
+ title += ' \'' + moduleSelector + '\'';
+ }
+ if( (console.group !== undefined || console.table !== undefined) && performance.length > 0) {
+ console.groupCollapsed(title);
+ if(console.table) {
+ console.table(performance);
+ }
+ else {
+ $.each(performance, function(index, data) {
+ console.log(data['Name'] + ': ' + data['Execution Time']+'ms');
+ });
+ }
+ console.groupEnd();
+ }
+ performance = [];
+ }
+ },
+ invoke: function(query, passedArguments, context) {
+ var
+ object = instance,
+ maxDepth,
+ found,
+ response
+ ;
+ passedArguments = passedArguments || queryArguments;
+ context = element || context;
+ if(typeof query == 'string' && object !== undefined) {
+ query = query.split(/[\. ]/);
+ maxDepth = query.length - 1;
+ $.each(query, function(depth, value) {
+ var camelCaseValue = (depth != maxDepth)
+ ? value + query[depth + 1].charAt(0).toUpperCase() + query[depth + 1].slice(1)
+ : query
+ ;
+ if( $.isPlainObject( object[camelCaseValue] ) && (depth != maxDepth) ) {
+ object = object[camelCaseValue];
+ }
+ else if( object[camelCaseValue] !== undefined ) {
+ found = object[camelCaseValue];
+ return false;
+ }
+ else if( $.isPlainObject( object[value] ) && (depth != maxDepth) ) {
+ object = object[value];
+ }
+ else if( object[value] !== undefined ) {
+ found = object[value];
+ return false;
+ }
+ else {
+ module.error(error.method, query);
+ return false;
+ }
+ });
+ }
+ if ( $.isFunction( found ) ) {
+ response = found.apply(context, passedArguments);
+ }
+ else if(found !== undefined) {
+ response = found;
+ }
+ if(Array.isArray(returnedValue)) {
+ returnedValue.push(response);
+ }
+ else if(returnedValue !== undefined) {
+ returnedValue = [returnedValue, response];
+ }
+ else if(response !== undefined) {
+ returnedValue = response;
+ }
+ return found;
+ }
+ };
+
+ if(methodInvoked) {
+ if(instance === undefined) {
+ module.initialize();
+ }
+ instance.save.scroll();
+ instance.save.calculations();
+ module.invoke(query);
+ }
+ else {
+ if(instance !== undefined) {
+ instance.invoke('destroy');
+ }
+ module.initialize();
+ }
+ })
+ ;
+
+ return (returnedValue !== undefined)
+ ? returnedValue
+ : this
+ ;
+};
+
+$.fn.visibility.settings = {
+
+ name : 'Visibility',
+ namespace : 'visibility',
+
+ debug : false,
+ verbose : false,
+ performance : true,
+
+ // whether to use mutation observers to follow changes
+ observeChanges : true,
+
+ // check position immediately on init
+ initialCheck : true,
+
+ // whether to refresh calculations after all page images load
+ refreshOnLoad : true,
+
+ // whether to refresh calculations after page resize event
+ refreshOnResize : true,
+
+ // should call callbacks on refresh event (resize, etc)
+ checkOnRefresh : true,
+
+ // callback should only occur one time
+ once : true,
+
+ // callback should fire continuously whe evaluates to true
+ continuous : false,
+
+ // offset to use with scroll top
+ offset : 0,
+
+ // whether to include margin in elements position
+ includeMargin : false,
+
+ // scroll context for visibility checks
+ context : window,
+
+ // visibility check delay in ms (defaults to animationFrame)
+ throttle : false,
+
+ // special visibility type (image, fixed)
+ type : false,
+
+ // z-index to use with visibility 'fixed'
+ zIndex : '10',
+
+ // image only animation settings
+ transition : 'fade in',
+ duration : 1000,
+
+ // array of callbacks for percentage
+ onPassed : {},
+
+ // standard callbacks
+ onOnScreen : false,
+ onOffScreen : false,
+ onPassing : false,
+ onTopVisible : false,
+ onBottomVisible : false,
+ onTopPassed : false,
+ onBottomPassed : false,
+
+ // reverse callbacks
+ onPassingReverse : false,
+ onTopVisibleReverse : false,
+ onBottomVisibleReverse : false,
+ onTopPassedReverse : false,
+ onBottomPassedReverse : false,
+
+ // special callbacks for image
+ onLoad : function() {},
+ onAllLoaded : function() {},
+
+ // special callbacks for fixed position
+ onFixed : function() {},
+ onUnfixed : function() {},
+
+ // utility callbacks
+ onUpdate : false, // disabled by default for performance
+ onRefresh : function(){},
+
+ metadata : {
+ src: 'src'
+ },
+
+ className: {
+ fixed : 'fixed',
+ placeholder : 'constraint',
+ visible : 'visible'
+ },
+
+ error : {
+ method : 'The method you called is not defined.',
+ visible : 'Element is hidden, you must call refresh after element becomes visible'
+ }
+
+};
+
+})( jQuery, window, document );
diff --git a/public/dist/semantic.min.css b/public/dist/semantic.min.css
new file mode 100644
index 000000000..c545f77dd
--- /dev/null
+++ b/public/dist/semantic.min.css
@@ -0,0 +1 @@
+ @import url('https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,400%3B0,700%3B1,400%3B1,700&subset=latin&display=swap');*, *:before, *:after {-webkit-box-sizing: inherit;box-sizing: inherit;}html {-webkit-box-sizing: border-box;box-sizing: border-box;}input[type="text"], input[type="email"], input[type="search"], input[type="password"] {-webkit-appearance: none;-moz-appearance: none;}html {line-height: 1.15;-webkit-text-size-adjust: 100%;}body {margin: 10em;}main {display: block;}** * Correct the font size and margin on `h1` elements within `section` and * `article` contexts in Chrome, Firefox, and Safari. */h1 {font-size: 2em;margin: 0.67em 10em;}hr {-webkit-box-sizing: content-box;box-sizing: content-box;height: 0;overflow: visible;}pre {font-family: monospace, monospace;font-size: 1em;}a {background-color: transparent;}abbr[title] {border-bottom: none;text-decoration: underline;text-decoration: underline dotted;}b, strong {font-weight: bolder;}code, kbd, samp {font-family: monospace, monospace;font-size: 1em;}small {font-size: 80%;}sub, sup {font-size: 75%;line-height: 0;position: relative;vertical-align: baseline;}sub {bottom: -0.25em;}sup {top: -0.5em;}img {border-style: none;}button, input, optgroup, select, textarea {font-family: inherit;font-size: 100%;line-height: 1.15;margin: 0;}button, input {overflow: visible;}button, select {text-transform: none;}button, [type="button"], [type="reset"], [type="submit"] {-webkit-appearance: button;}html, body {height: 100%;}html {font-size: 14px;}body {margin: 0;padding: 10px;overflow-x: hidden;min-width: 320px;background: #FBF7F4;font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;font-size: 14px;line-height: 1.4285em;color: rgba(0, 0, 0, 0.87);}h1, h2, h3, h4, h5 {font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;line-height: 1.28571429em;margin: calc(2rem - 0.1428571428571429em) 0 1rem;font-weight: bold;padding: 10px;}h1 {min-height: 1rem;font-size: 2rem;}h1:first-child, h2:first-child, h3:first-child, h4:first-child, h5:first-child {margin-top: 0;}p {margin: 0 0 1em;line-height: 1.4285em;}p:first-child {margin-top: 0;}p:last-child {margin-bottom: 0;}.ui.button {cursor: pointer;display: inline-block;min-height: 1em;outline: none;border: none;vertical-align: baseline;background: #2B5B4B;color: rgba(255, 255, 255, 1);font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;margin: 0 0.25em 0 0;padding: 0.78571429em 1.5em 0.78571429em;text-transform: none;text-shadow: none;font-weight: bold;line-height: 1em;font-style: normal;text-align: center;text-decoration: none;border-radius: 0.28571429rem;-webkit-box-shadow: 0 0 0 1px transparent inset, 0 0 0 0 rgba(34, 36, 38, 0.15) inset;box-shadow: 0 0 0 1px transparent inset, 0 0 0 0 rgba(34, 36, 38, 0.15) inset;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;-webkit-transition: opacity 0.1s ease, background-color 0.1s ease, color 0.1s ease, background 0.1s ease, -webkit-box-shadow 0.1s ease;transition: opacity 0.1s ease, background-color 0.1s ease, color 0.1s ease, background 0.1s ease, -webkit-box-shadow 0.1s ease;transition: opacity 0.1s ease, background-color 0.1s ease, color 0.1s ease, box-shadow 0.1s ease, background 0.1s ease;transition: opacity 0.1s ease, background-color 0.1s ease, color 0.1s ease, box-shadow 0.1s ease, background 0.1s ease, -webkit-box-shadow 0.1s ease;will-change: auto;-webkit-tap-highlight-color: transparent;}.ui.button:hover {background-color: #BDDCD1;background-image: none;-webkit-box-shadow: 0 0 0 1px transparent inset, 0 0 0 0 rgba(34, 36, 38, 0.15) inset;box-shadow: 0 0 0 1px transparent inset, 0 0 0 0 rgba(34, 36, 38, 0.15) inset;color: rgba(0, 0, 0, 0.8);}.ui.button:hover .icon {opacity: 0.85;}.ui[class*="left floated"].buttons, .ui[class*="left floated"].button {float: left;margin-left: 0;margin-right: 0.25em;}.ui[class*="right floated"].buttons, .ui[class*="right floated"].button {float: right;margin-right: 0;margin-left: 0.25em;}.ui.buttons .button, .ui.buttons .or, .ui.button {font-size: 1rem;}.ui.mini.buttons .dropdown, .ui.mini.buttons .dropdown .menu > .item, .ui.mini.buttons .button, .ui.mini.buttons .or, .ui.ui.ui.ui.mini.button {font-size: 0.78571429rem;max-height: 1em;text-align: center;line-height: 0.25em;}.ui.tiny.buttons .dropdown, .ui.tiny.buttons .dropdown .menu > .item, .ui.tiny.buttons .button, .ui.tiny.buttons .or, .ui.ui.ui.ui.tiny.button {font-size: 0.85714286rem;}.ui.small.buttons .dropdown, .ui.small.buttons .dropdown .menu > .item, .ui.small.buttons .button, .ui.small.buttons .or, .ui.ui.ui.ui.small.button {font-size: 0.92857143rem;}.ui.large.buttons .dropdown, .ui.large.buttons .dropdown .menu > .item, .ui.large.buttons .button, .ui.large.buttons .or, .ui.ui.ui.ui.large.button {font-size: 1.14285714rem;}.ui.big.buttons .dropdown, .ui.big.buttons .dropdown .menu > .item, .ui.big.buttons .button, .ui.big.buttons .or, .ui.ui.ui.ui.big.button {font-size: 1.28571429rem;}.ui.huge.buttons .dropdown, .ui.huge.buttons .dropdown .menu > .item, .ui.huge.buttons .button, .ui.huge.buttons .or, .ui.ui.ui.ui.huge.button {font-size: 1.42857143rem;}.ui.massive.buttons .dropdown, .ui.massive.buttons .dropdown .menu > .item, .ui.massive.buttons .button, .ui.massive.buttons .or, .ui.ui.ui.ui.massive.button {font-size: 1.71428571rem;}.ui[class*="right labeled"].icon.button {padding-right: 4.07142857em !important;padding-left: 1.5em !important;}.ui[class*="right labeled"].icon.button > .icon {left: auto;right: 0;border-radius: 0;border-top-right-radius: inherit;border-bottom-right-radius: inherit;-webkit-box-shadow: 1px 0 0 0 transparent inset;box-shadow: 1px 0 0 0 transparent inset;}.ui.labeled.icon.buttons > .button > .icon:before, .ui.labeled.icon.button > .icon:before, .ui.labeled.icon.buttons > .button > .icon:after, .ui.labeled.icon.button > .icon:after {display: block;position: relative;width: 100%;top: 0;text-align: center;}.ui.labeled.icon.buttons .button > .icon {border-radius: 0;}.ui.labeled.icon.buttons .button:first-child > .icon {border-top-left-radius: 0.28571429rem;border-bottom-left-radius: 0.28571429rem;}.ui.labeled.icon.buttons .button:last-child > .icon {border-top-right-radius: 0.28571429rem;border-bottom-right-radius: 0.28571429rem;}.ui.vertical.labeled.icon.buttons .button:first-child > .icon {border-radius: 0;border-top-left-radius: 0.28571429rem;}.ui.vertical.labeled.icon.buttons .button:last-child > .icon {border-radius: 0;border-bottom-left-radius: 0.28571429rem;}.ui[class*="left attached"].buttons .button:last-child {margin-left: -1px;border-radius: 0 0 0.28571429rem 0;}.ui[class*="right attached"].buttons {display: -webkit-inline-box;display: -ms-inline-flexbox;display: inline-flex;margin-left: 0;margin-right: -1px;border-radius: 0.28571429rem 0 0 0.28571429rem;}.ui[class*="right attached"].buttons .button:first-child {margin-left: -1px;border-radius: 0.28571429rem 0 0 0;}.ui[class*="right attached"].buttons .button:last-child {margin-left: -1px;border-radius: 0 0 0 0.28571429rem;}i.flag.py:before, i.flag.paraguay:before {background-position: -72px -754px;}i.flag.qa:before, i.flag.qatar:before {background-position: -72px -780px;}i.flag.re:before, i.flag.reunion:before {background-position: -72px -806px;}i.flag.ro:before, i.flag.romania:before {background-position: -72px -832px;}i.flag.rs:before, i.flag.serbia:before {background-position: -72px -858px;}i.flag.ru:before, i.flag.russia:before {background-position: -72px -884px;}i.flag.rw:before, i.flag.rwanda:before {background-position: -72px -910px;}i.flag.sa:before, i.flag.saudi.arabia:before {background-position: -72px -936px;}i.flag.sb:before, i.flag.solomon.islands:before {background-position: -72px -962px;}i.flag.sc:before, i.flag.seychelles:before {background-position: -72px -988px;}i.flag.gb.sct:before, i.flag.scotland:before {background-position: -72px -1014px;}i.flag.sd:before, i.flag.sudan:before {background-position: -72px -1040px;}i.flag.se:before, i.flag.sweden:before {background-position: -72px -1066px;}i.flag.sg:before, i.flag.singapore:before {background-position: -72px -1092px;}i.flag.sh:before, i.flag.saint.helena:before {background-position: -72px -1118px;}i.flag.si:before, i.flag.slovenia:before {background-position: -72px -1144px;}i.flag.sj:before, i.flag.svalbard:before, i.flag.jan.mayen:before {background-position: -72px -1170px;}i.flag.sk:before, i.flag.slovakia:before {background-position: -72px -1196px;}i.flag.sl:before, i.flag.sierra.leone:before {background-position: -72px -1222px;}i.flag.sm:before, i.flag.san.marino:before {background-position: -72px -1248px;}i.flag.sn:before, i.flag.senegal:before {background-position: -72px -1274px;}i.flag.so:before, i.flag.somalia:before {background-position: -72px -1300px;}i.flag.sr:before, i.flag.suriname:before {background-position: -72px -1326px;}i.flag.st:before, i.flag.sao.tome:before {background-position: -72px -1352px;}i.flag.sv:before, i.flag.el.salvador:before {background-position: -72px -1378px;}i.flag.sy:before, i.flag.syria:before {background-position: -72px -1404px;}i.flag.sz:before, i.flag.swaziland:before {background-position: -72px -1430px;}i.flag.tc:before, i.flag.caicos.islands:before {background-position: -72px -1456px;}i.flag.td:before, i.flag.chad:before {background-position: -72px -1482px;}i.flag.tf:before, i.flag.french.territories:before {background-position: -72px -1508px;}i.flag.tg:before, i.flag.togo:before {background-position: -72px -1534px;}i.flag.th:before, i.flag.thailand:before {background-position: -72px -1560px;}i.flag.tj:before, i.flag.tajikistan:before {background-position: -72px -1586px;}i.flag.tk:before, i.flag.tokelau:before {background-position: -72px -1612px;}i.flag.tl:before, i.flag.timorleste:before {background-position: -72px -1638px;}i.flag.tm:before, i.flag.turkmenistan:before {background-position: -72px -1664px;}i.flag.tn:before, i.flag.tunisia:before {background-position: -72px -1690px;}i.flag.to:before, i.flag.tonga:before {background-position: -72px -1716px;}i.flag.tr:before, i.flag.turkey:before {background-position: -72px -1742px;}i.flag.tt:before, i.flag.trinidad:before {background-position: -72px -1768px;}i.flag.tv:before, i.flag.tuvalu:before {background-position: -72px -1794px;}i.flag.tw:before, i.flag.taiwan:before {background-position: -72px -1820px;}i.flag.tz:before, i.flag.tanzania:before {background-position: -72px -1846px;}i.flag.ua:before, i.flag.ukraine:before {background-position: -72px -1872px;}i.flag.ug:before, i.flag.uganda:before {background-position: -72px -1898px;}i.flag.um:before, i.flag.us.minor.islands:before {background-position: -72px -1924px;}i.flag.us:before, i.flag.america:before, i.flag.united.states:before {background-position: -72px -1950px;}i.flag.uy:before, i.flag.uruguay:before {background-position: -72px -1976px;}i.flag.uz:before, i.flag.uzbekistan:before {background-position: -108px 0;}i.flag.va:before, i.flag.vatican.city:before {background-position: -108px -26px;}i.flag.vc:before, i.flag.saint.vincent:before {background-position: -108px -52px;}i.flag.ve:before, i.flag.venezuela:before {background-position: -108px -78px;}i.flag.vg:before, i.flag.british.virgin.islands:before {background-position: -108px -104px;}i.flag.vi:before, i.flag.us.virgin.islands:before {background-position: -108px -130px;}i.flag.vn:before, i.flag.vietnam:before {background-position: -108px -156px;}i.flag.vu:before, i.flag.vanuatu:before {background-position: -108px -182px;}i.flag.gb.wls:before, i.flag.wales:before {background-position: -108px -208px;}i.flag.wf:before, i.flag.wallis.and.futuna:before {background-position: -108px -234px;}i.flag.ws:before, i.flag.samoa:before {background-position: -108px -260px;}i.flag.ye:before, i.flag.yemen:before {background-position: -108px -286px;}i.flag.yt:before, i.flag.mayotte:before {background-position: -108px -312px;}i.flag.za:before, i.flag.south.africa:before {background-position: -108px -338px;}i.flag.zm:before, i.flag.zambia:before {background-position: -108px -364px;}i.flag.zw:before, i.flag.zimbabwe:before {background-position: -108px -390px;}.ui.header {border: none;margin: calc(2rem - 0.1428571428571429em) 0 1rem;padding: 0 0;font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;font-weight: bold;line-height: 1.28571429em;text-transform: none;color: rgba(0, 0, 0, 0.87);}.ui.header:first-child {margin-top: -0.14285714em;}.ui.header:last-child {margin-bottom: 0;}.ui.header .sub.header {display: block;font-weight: normal;padding: 0;margin: 0;font-size: 1rem;line-height: 1.2em;color: rgba(0, 0, 0, 0.6);}.ui.header > .icons, .ui.header > i.icon {display: table-cell;opacity: 1;font-size: 1.5em;padding-top: 0;vertical-align: middle;}.ui.header:not(.icon) > .icons:only-child, .ui.header:not(.icon) > i.icon:only-child {display: inline-block;padding: 0;margin-right: 0.75rem;}.ui.header > .image:not(.icon), .ui.header > img {display: inline-block;margin-top: 0.14285714em;width: 2.5em;height: auto;vertical-align: middle;}.ui.header > .image:not(.icon):only-child, .ui.header > img:only-child {margin-right: 0.75rem;}.ui.header .content {display: inline-block;vertical-align: top;}.ui.header > img + .content, .ui.header > .image + .content {padding-left: 0.75rem;vertical-align: middle;}.ui.header:not(.icon):not(.centered):not(.aligned) > .icons + .content, .ui.header:not(.icon):not(.centered):not(.aligned) > i.icon + .content {padding-left: 0.75rem;display: table-cell;vertical-align: middle;}.ui.header .ui.label {font-size: '';margin-left: 0.5rem;vertical-align: middle;}.ui.header + p {margin-top: 0;}h1.ui.header {font-size: 2rem;}h1.ui.header .sub.header {font-size: 1.14285714rem;}h2.ui.header {font-size: 1.71428571rem;}h2.ui.header .sub.header {font-size: 1.14285714rem;}h3.ui.header {font-size: 1.28571429rem;}h3.ui.header .sub.header {font-size: 1rem;}h4.ui.header {font-size: 1.07142857rem;}h4.ui.header .sub.header {font-size: 1rem;}h5.ui.header {font-size: 1rem;}h5.ui.header .sub.header {font-size: 0.92857143rem;}h6.ui.header {font-size: 0.85714286rem;}h6.ui.header .sub.header {font-size: 0.92857143rem;}.ui.mini.header {font-size: 0.85714286em;}.ui.mini.header .sub.header {font-size: 0.92857143rem;}.ui.mini.sub.header {font-size: 0.78571429em;}.ui.tiny.header {font-size: 1em;}.ui.tiny.header .sub.header {font-size: 0.92857143rem;}.ui.tiny.sub.header {font-size: 0.78571429em;}.ui.small.header {font-size: 1.07142857em;}.ui.small.header .sub.header {font-size: 1rem;}.ui.small.sub.header {font-size: 0.78571429em;}.ui.large.header {font-size: 1.71428571em;}.ui.large.header .sub.header {font-size: 1.14285714rem;}.ui.large.sub.header {font-size: 0.92857143em;}.ui.big.header {font-size: 1.85714286em;}.ui.big.header .sub.header {font-size: 1.14285714rem;}.ui.big.sub.header {font-size: 1em;}.ui.huge.header {font-size: 2em;min-height: 1em;}.ui.huge.header .sub.header {font-size: 1.14285714rem;}.ui.huge.sub.header {font-size: 1em;}.ui.massive.header {font-size: 2.28571429em;min-height: 1em;}.ui.massive.header .sub.header {font-size: 1.42857143rem;}.ui.massive.sub.header {font-size: 1.14285714em;}.ui.sub.header {padding: 0;margin-bottom: 0.14285714rem;font-weight: bold;font-size: 0.85714286em;text-transform: uppercase;color: '';}.ui.icon.header {display: inline-block;text-align: center;margin: 2rem 0 1rem;}.ui.icon.header:after {content: '';display: block;height: 0;clear: both;visibility: hidden;}.ui.icon.header:first-child {margin-top: 0;}.ui.icon.header > .icons, .ui.icon.header > i.icon {float: none;display: block;width: auto;height: auto;line-height: 1;padding: 0;font-size: 3em;margin: 0 auto 0.5rem;opacity: 1;}.ui.icon.header .corner.icon {font-size: calc(3em * 0.45);}.ui.icon.header .content {display: block;padding: 0;}.ui.icon.header > i.circular {font-size: 2em;}.ui.icon.header > i.square {font-size: 2em;}.ui.block.icon.header > .icons, .ui.block.icon.header > i.icon {margin-bottom: 0;}.ui.icon.header.aligned {margin-left: auto;margin-right: auto;display: block;}.ui.disabled.header {opacity: 0.45;}.ui.inverted.header {color: #FFFFFF;}.ui.inverted.header .sub.header {color: rgba(255, 255, 255, 0.8);}.ui.inverted.attached.header {background: #1B1C1D;-webkit-box-shadow: none;box-shadow: none;border-color: transparent;}.ui.inverted.block.header {background: #545454 -webkit-gradient(linear, left top, left bottom, from(transparent), to(rgba(0, 0, 0, 0.05)));background: #545454 -webkit-linear-gradient(transparent, rgba(0, 0, 0, 0.05));background: #545454 linear-gradient(transparent, rgba(0, 0, 0, 0.05));-webkit-box-shadow: none;box-shadow: none;border-bottom: none;}.ui.primary.header {color: #2185D0;}a.ui.primary.header:hover {color: #1678c2;}.ui.primary.dividing.header {border-bottom: 2px solid #2185D0;}.ui.inverted.primary.header.header.header {color: #54C8FF;}a.ui.inverted.primary.header.header.header:hover {color: #21b8ff;}.ui.inverted.primary.dividing.header {border-bottom: 2px solid #54C8FF;}.ui.secondary.header {color: #1B1C1D;}a.ui.secondary.header:hover {color: #27292a;}.ui.secondary.dividing.header {border-bottom: 2px solid #1B1C1D;}.ui.inverted.secondary.header.header.header {color: #545454;}a.ui.inverted.secondary.header.header.header:hover {color: #6e6e6e;}.ui.inverted.secondary.dividing.header {border-bottom: 2px solid #545454;}.ui.red.header {color: #DB2828;}a.ui.red.header:hover {color: #d01919;}.ui.red.dividing.header {border-bottom: 2px solid #DB2828;}.ui.inverted.red.header.header.header {color: #FF695E;}a.ui.inverted.red.header.header.header:hover {color: #ff392b;}.ui.inverted.red.dividing.header {border-bottom: 2px solid #FF695E;}.ui.orange.header {color: #F2711C;}a.ui.orange.header:hover {color: #f26202;}.ui.orange.dividing.header {border-bottom: 2px solid #F2711C;}.ui.inverted.orange.header.header.header {color: #FF851B;}a.ui.inverted.orange.header.header.header:hover {color: #e76b00;}.ui.inverted.orange.dividing.header {border-bottom: 2px solid #FF851B;}.ui.yellow.header {color: #FBBD08;}a.ui.yellow.header:hover {color: #eaae00;}.ui.yellow.dividing.header {border-bottom: 2px solid #FBBD08;}.ui.inverted.yellow.header.header.header {color: #FFE21F;}a.ui.inverted.yellow.header.header.header:hover {color: #ebcd00;}.ui.inverted.yellow.dividing.header {border-bottom: 2px solid #FFE21F;}.ui.olive.header {color: #B5CC18;}a.ui.olive.header:hover {color: #a7bd0d;}.ui.olive.dividing.header {border-bottom: 2px solid #B5CC18;}.ui.inverted.olive.header.header.header {color: #D9E778;}a.ui.inverted.olive.header.header.header:hover {color: #d2e745;}.ui.inverted.olive.dividing.header {border-bottom: 2px solid #D9E778;}.ui.green.header {color: #21BA45;}a.ui.green.header:hover {color: #16ab39;}.ui.green.dividing.header {border-bottom: 2px solid #21BA45;}.ui.inverted.green.header.header.header {color: #2ECC40;}a.ui.inverted.green.header.header.header:hover {color: #1ea92e;}.ui.inverted.green.dividing.header {border-bottom: 2px solid #2ECC40;}.ui.teal.header {color: #00B5AD;}a.ui.teal.header:hover {color: #009c95;}.ui.teal.dividing.header {border-bottom: 2px solid #00B5AD;}.ui.inverted.teal.header.header.header {color: #6DFFFF;}a.ui.inverted.teal.header.header.header:hover {color: #3affff;}.ui.inverted.teal.dividing.header {border-bottom: 2px solid #6DFFFF;}.ui.blue.header {color: #2185D0;}a.ui.blue.header:hover {color: #1678c2;}.ui.blue.dividing.header {border-bottom: 2px solid #2185D0;}.ui.inverted.blue.header.header.header {color: #54C8FF;}a.ui.inverted.blue.header.header.header:hover {color: #21b8ff;}.ui.inverted.blue.dividing.header {border-bottom: 2px solid #54C8FF;}.ui.violet.header {color: #6435C9;}a.ui.violet.header:hover {color: #5829bb;}.ui.violet.dividing.header {border-bottom: 2px solid #6435C9;}.ui.inverted.violet.header.header.header {color: #A291FB;}a.ui.inverted.violet.header.header.header:hover {color: #745aff;}.ui.inverted.violet.dividing.header {border-bottom: 2px solid #A291FB;}.ui.purple.header {color: #A333C8;}a.ui.purple.header:hover {color: #9627ba;}.ui.purple.dividing.header {border-bottom: 2px solid #A333C8;}.ui.inverted.purple.header.header.header {color: #DC73FF;}a.ui.inverted.purple.header.header.header:hover {color: #cf40ff;}.ui.inverted.purple.dividing.header {border-bottom: 2px solid #DC73FF;}.ui.pink.header {color: #E03997;}a.ui.pink.header:hover {color: #e61a8d;}.ui.pink.dividing.header {border-bottom: 2px solid #E03997;}.ui.inverted.pink.header.header.header {color: #FF8EDF;}a.ui.inverted.pink.header.header.header:hover {color: #ff5bd1;}.ui.inverted.pink.dividing.header {border-bottom: 2px solid #FF8EDF;}.ui.brown.header {color: #A5673F;}a.ui.brown.header:hover {color: #975b33;}.ui.brown.dividing.header {border-bottom: 2px solid #A5673F;}.ui.inverted.brown.header.header.header {color: #D67C1C;}a.ui.inverted.brown.header.header.header:hover {color: #b0620f;}.ui.inverted.brown.dividing.header {border-bottom: 2px solid #D67C1C;}.ui.grey.header {color: #767676;}a.ui.grey.header:hover {color: #838383;}.ui.grey.dividing.header {border-bottom: 2px solid #767676;}.ui.inverted.grey.header.header.header {color: #DCDDDE;}a.ui.inverted.grey.header.header.header:hover {color: #c2c4c5;}.ui.inverted.grey.dividing.header {border-bottom: 2px solid #DCDDDE;}.ui.black.header {color: #1B1C1D;}a.ui.black.header:hover {color: #27292a;}.ui.black.dividing.header {border-bottom: 2px solid #1B1C1D;}.ui.inverted.black.header.header.header {color: #545454;}a.ui.inverted.black.header.header.header:hover {color: #000000;}.ui.inverted.black.dividing.header {border-bottom: 2px solid #545454;}.ui.left.aligned.header {text-align: left;}.ui.right.aligned.header {text-align: right;}.ui.centered.header, .ui.center.aligned.header {text-align: center;}.ui.justified.header {text-align: justify;}.ui.justified.header:after {display: inline-block;content: '';width: 100%;}.ui.floated.header, .ui[class*="left floated"].header {float: left;margin-top: 0;margin-right: 0.5em;}.ui[class*="right floated"].header {float: right;margin-top: 0;margin-left: 0.5em;}.ui.fitted.header {padding: 0;}.ui.dividing.header {padding-bottom: 0.21428571rem;border-bottom: 1px solid rgba(34, 36, 38, 0.15);}.ui.dividing.header .sub.header {padding-bottom: 0.21428571rem;}.ui.dividing.header i.icon {margin-bottom: 0;}.ui.inverted.dividing.header {border-bottom-color: rgba(255, 255, 255, 0.1);}.ui.block.header {background: #F3F4F5;padding: 0.78571429rem 1rem;-webkit-box-shadow: none;box-shadow: none;border: 1px solid #D4D4D5;border-radius: 0.28571429rem;}.ui.block.header:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6) {font-size: 1rem;}.ui.mini.block.header {font-size: 0.78571429rem;}.ui.tiny.block.header {font-size: 0.85714286rem;}.ui.small.block.header {font-size: 0.92857143rem;}.ui.large.block.header {font-size: 1.14285714rem;}.ui.big.block.header {font-size: 1.28571429rem;}.ui.huge.block.header {font-size: 1.42857143rem;}.ui.massive.block.header {font-size: 1.71428571rem;}.ui.attached.header {background: #FFFFFF;padding: 0.78571429rem 1rem;margin: 0 -1px 0 -1px;-webkit-box-shadow: none;box-shadow: none;border: 1px solid #D4D4D5;border-radius: 0;}.ui.attached.block.header {background: #F3F4F5;}.ui.attached:not(.top).header {border-top: none;}.ui.top.attached.header {border-radius: 0.28571429rem 0.28571429rem 0 0;}.ui.bottom.attached.header {border-radius: 0 0 0.28571429rem 0.28571429rem;}.ui.attached.header:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6) {font-size: 1em;}.ui.mini.attached.header {font-size: 0.78571429em;}.ui.tiny.attached.header {font-size: 0.85714286em;}.ui.small.attached.header {font-size: 0.92857143em;}.ui.large.attached.header {font-size: 1.14285714em;}.ui.big.attached.header {font-size: 1.28571429em;}.ui.huge.attached.header {font-size: 1.42857143em;}.ui.massive.attached.header {font-size: 1.71428571em;}.ui.header:not(h1):not(h2):not(h3):not(h4):not(h5):not(h6) {font-size: 1.28571429em;}.ui.form {position: relative;max-width: 100%;}.ui.form > p {margin: 1em 0;}.ui.form .field {clear: both;margin: 0 0 1em;}.ui.form .fields .fields, .ui.form .field:last-child, .ui.form .fields:last-child .field {margin-bottom: 0;}.ui.form .fields .field {clear: both;margin: 0;}.ui.form .field > label {display: block;margin: 0 0 0.28571429rem 0;color: rgba(0, 0, 0, 0.87);font-size: 0.92857143em;font-weight: bold;text-transform: none;}.ui.form textarea, .ui.form input:not([type]), .ui.form input[type="date"], .ui.form input[type="datetime-local"], .ui.form input[type="email"], .ui.form input[type="number"], .ui.form input[type="password"], .ui.form input[type="search"], .ui.form input[type="tel"], .ui.form input[type="time"], .ui.form input[type="text"], .ui.form input[type="file"], .ui.form input[type="url"] {width: 100%;vertical-align: top;}.ui.form ::-webkit-datetime-edit, .ui.form ::-webkit-inner-spin-button {height: 1.21428571em;}.ui.form input:not([type]), .ui.form input[type="date"], .ui.form input[type="datetime-local"], .ui.form input[type="email"], .ui.form input[type="number"], .ui.form input[type="password"], .ui.form input[type="search"], .ui.form input[type="tel"], .ui.form input[type="time"], .ui.form input[type="text"], .ui.form input[type="file"], .ui.form input[type="url"] {font-family: 'Lato', 'Helvetica Neue', Arial, Helvetica, sans-serif;margin: 0;outline: none;-webkit-appearance: none;-webkit-tap-highlight-color: rgba(255, 255, 255, 0);line-height: 1.21428571em;padding: 0.67857143em 1em;font-size: 1em;background: #FFFFFF;border: 1px solid rgba(34, 36, 38, 0.15);color: rgba(0, 0, 0, 0.87);border-radius: 0.28571429rem;-webkit-box-shadow: 0 0 0 0 transparent inset;box-shadow: 0 0 0 0 transparent inset;-webkit-transition: color 0.1s ease, border-color 0.1s ease;transition: color 0.1s ease, border-color 0.1s ease;}
\ No newline at end of file
diff --git a/public/dist/semantic.min.js b/public/dist/semantic.min.js
new file mode 100644
index 000000000..729182c3c
--- /dev/null
+++ b/public/dist/semantic.min.js
@@ -0,0 +1,11 @@
+/*
+ * # Fomantic UI - 2.8.8
+ * https://github.com/fomantic/Fomantic-UI
+ * http://fomantic-ui.com/
+ *
+ * Copyright 2021 Contributors
+ * Released under the MIT license
+ * http://opensource.org/licenses/MIT
+ *
+ */
+!function(p,h,v,b){p.isFunction=p.isFunction||function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},p.site=p.fn.site=function(e){var s,l,i=(new Date).getTime(),o=[],t=e,n="string"==typeof t,c=[].slice.call(arguments,1),u=p.isPlainObject(e)?p.extend(!0,{},p.site.settings,e):p.extend({},p.site.settings),a=u.namespace,d=u.error,r="module-"+a,f=p(v),m=this,g=f.data(r);return s={initialize:function(){s.instantiate()},instantiate:function(){s.verbose("Storing instance of site",s),g=s,f.data(r,s)},normalize:function(){s.fix.console(),s.fix.requestAnimationFrame()},fix:{console:function(){s.debug("Normalizing window.console"),console!==b&&console.log!==b||(s.verbose("Console not available, normalizing events"),s.disable.console()),void 0!==console.group&&void 0!==console.groupEnd&&void 0!==console.groupCollapsed||(s.verbose("Console group not available, normalizing events"),h.console.group=function(){},h.console.groupEnd=function(){},h.console.groupCollapsed=function(){}),void 0===console.markTimeline&&(s.verbose("Mark timeline not available, normalizing events"),h.console.markTimeline=function(){})},consoleClear:function(){s.debug("Disabling programmatic console clearing"),h.console.clear=function(){}},requestAnimationFrame:function(){s.debug("Normalizing requestAnimationFrame"),h.requestAnimationFrame===b&&(s.debug("RequestAnimationFrame not available, normalizing event"),h.requestAnimationFrame=h.requestAnimationFrame||h.mozRequestAnimationFrame||h.webkitRequestAnimationFrame||h.msRequestAnimationFrame||function(e){setTimeout(e,0)})}},moduleExists:function(e){return p.fn[e]!==b&&p.fn[e].settings!==b},enabled:{modules:function(e){var n=[];return e=e||u.modules,p.each(e,function(e,t){s.moduleExists(t)&&n.push(t)}),n}},disabled:{modules:function(e){var n=[];return e=e||u.modules,p.each(e,function(e,t){s.moduleExists(t)||n.push(t)}),n}},change:{setting:function(o,a,e,r){e="string"==typeof e?"all"===e?u.modules:[e]:e||u.modules,r=r===b||r,p.each(e,function(e,t){var n,i=!s.moduleExists(t)||(p.fn[t].settings.namespace||!1);s.moduleExists(t)&&(s.verbose("Changing default setting",o,a,t),p.fn[t].settings[o]=a,r&&i&&0<(n=p(":data(module-"+i+")")).length&&(s.verbose("Modifying existing settings",n),n[t]("setting",o,a)))})},settings:function(i,e,o){e="string"==typeof e?[e]:e||u.modules,o=o===b||o,p.each(e,function(e,t){var n;s.moduleExists(t)&&(s.verbose("Changing default setting",i,t),p.extend(!0,p.fn[t].settings,i),o&&a&&0<(n=p(":data(module-"+a+")")).length&&(s.verbose("Modifying existing settings",n),n[t]("setting",i)))})}},enable:{console:function(){s.console(!0)},debug:function(e,t){e=e||u.modules,s.debug("Enabling debug for modules",e),s.change.setting("debug",!0,e,t)},verbose:function(e,t){e=e||u.modules,s.debug("Enabling verbose debug for modules",e),s.change.setting("verbose",!0,e,t)}},disable:{console:function(){s.console(!1)},debug:function(e,t){e=e||u.modules,s.debug("Disabling debug for modules",e),s.change.setting("debug",!1,e,t)},verbose:function(e,t){e=e||u.modules,s.debug("Disabling verbose debug for modules",e),s.change.setting("verbose",!1,e,t)}},console:function(e){if(e){if(g.cache.console===b)return void s.error(d.console);s.debug("Restoring console function"),h.console=g.cache.console}else s.debug("Disabling console function"),g.cache.console=h.console,h.console={clear:function(){},error:function(){},group:function(){},groupCollapsed:function(){},groupEnd:function(){},info:function(){},log:function(){},markTimeline:function(){},warn:function(){}}},destroy:function(){s.verbose("Destroying previous site for",f),f.removeData(r)},cache:{},setting:function(e,t){if(p.isPlainObject(e))p.extend(!0,u,e);else{if(t===b)return u[e];u[e]=t}},internal:function(e,t){if(p.isPlainObject(e))p.extend(!0,s,e);else{if(t===b)return s[e];s[e]=t}},debug:function(){u.debug&&(u.performance?s.performance.log(arguments):(s.debug=Function.prototype.bind.call(console.info,console,u.name+":"),s.debug.apply(console,arguments)))},verbose:function(){u.verbose&&u.debug&&(u.performance?s.performance.log(arguments):(s.verbose=Function.prototype.bind.call(console.info,console,u.name+":"),s.verbose.apply(console,arguments)))},error:function(){s.error=Function.prototype.bind.call(console.error,console,u.name+":"),s.error.apply(console,arguments)},performance:{log:function(e){var t,n;u.performance&&(n=(t=(new Date).getTime())-(i||t),i=t,o.push({Element:m,Name:e[0],Arguments:[].slice.call(e,1)||"","Execution Time":n})),clearTimeout(s.performance.timer),s.performance.timer=setTimeout(s.performance.display,500)},display:function(){var e=u.name+":",n=0;i=!1,clearTimeout(s.performance.timer),p.each(o,function(e,t){n+=t["Execution Time"]}),e+=" "+n+"ms",(console.group!==b||console.table!==b)&&0 ")},fields:function(e){var n=M();return M.each(e,function(e,t){n=n.add(v.get.field(t))}),n},validation:function(i){var o,a;return!!l&&(M.each(l,function(e,n){a=n.identifier||e,M.each(v.get.field(a),function(e,t){if(t==i[0])return n.identifier=a,o=n,!1})}),o||!1)},value:function(e){var t=[];return t.push(e),v.get.values.call(b,t)[e]},values:function(e){var t=Array.isArray(e)?v.get.fields(e):n,m={};return t.each(function(e,t){var n=M(t),i=n.closest(p.uiCalendar),o=n.prop("name"),a=n.val(),r=n.is(p.checkbox),s=n.is(p.radio),l=-1!==o.indexOf("[]"),c=0"+t+""}),M(n+="")},prompt:function(e,t){return M("
").addClass(t).html(e[0])}},formatter:{date:function(e){return Intl.DateTimeFormat("en-GB").format(e)},datetime:function(e){return Intl.DateTimeFormat("en-GB",{year:"numeric",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",second:"2-digit"}).format(e)},time:function(e){return Intl.DateTimeFormat("en-GB",{hour:"2-digit",minute:"2-digit",second:"2-digit"}).format(e)},month:function(e){return Intl.DateTimeFormat("en-GB",{month:"2-digit",year:"numeric"}).format(e)},year:function(e){return Intl.DateTimeFormat("en-GB",{year:"numeric"}).format(e)}},rules:{empty:function(e){return!(e===L||""===e||Array.isArray(e)&&0===e.length)},checked:function(){return 0=t},length:function(e,t){return e!==L&&e.length>=t},exactLength:function(e,t){return e!==L&&e.length==t},maxLength:function(e,t){return e!==L&&e.length<=t},match:function(e,t,n){var i,o;return 0<(o=n.find('[data-validate="'+t+'"]')).length?i=o.val():0<(o=n.find("#"+t)).length?i=o.val():0<(o=n.find('[name="'+t+'"]')).length?i=o.val():0<(o=n.find('[name="'+t+'[]"]')).length&&(i=o),i!==L&&e.toString()==i.toString()},different:function(e,t,n){var i,o;return 0<(o=n.find('[data-validate="'+t+'"]')).length?i=o.val():0<(o=n.find("#"+t)).length?i=o.val():0<(o=n.find('[name="'+t+'"]')).length?i=o.val():0<(o=n.find('[name="'+t+'[]"]')).length&&(i=o),i!==L&&e.toString()!==i.toString()},creditCard:function(n,e){var t,i,o={visa:{pattern:/^4/,length:[16]},amex:{pattern:/^3[47]/,length:[15]},mastercard:{pattern:/^5[1-5]/,length:[16]},discover:{pattern:/^(6011|622(12[6-9]|1[3-9][0-9]|[2-8][0-9]{2}|9[0-1][0-9]|92[0-5]|64[4-9])|65)/,length:[16]},unionPay:{pattern:/^(62|88)/,length:[16,17,18,19]},jcb:{pattern:/^35(2[89]|[3-8][0-9])/,length:[16]},maestro:{pattern:/^(5018|5020|5038|6304|6759|676[1-3])/,length:[12,13,14,15,16,17,18,19]},dinersClub:{pattern:/^(30[0-5]|^36)/,length:[14]},laser:{pattern:/^(6304|670[69]|6771)/,length:[16,17,18,19]},visaElectron:{pattern:/^(4026|417500|4508|4844|491(3|7))/,length:[16]}},a={},r=!1,s="string"==typeof e&&e.split(",");if("string"==typeof n&&0!==n.length){if(n=n.replace(/[\s\-]/g,""),s&&(M.each(s,function(e,t){(i=o[t])&&(a={length:-1!==M.inArray(n.length,i.length),pattern:-1!==n.search(i.pattern)}).length&&a.pattern&&(r=!0)}),!r))return!1;if((t={number:-1!==M.inArray(n.length,o.unionPay.length),pattern:-1!==n.search(o.unionPay.pattern)}).number&&t.pattern)return!0;for(var l=n.length,c=0,u=[[0,1,2,3,4,5,6,7,8,9],[0,2,4,6,8,1,3,5,7,9]],d=0;l--;)d+=u[c][parseInt(n.charAt(l),10)],c^=1;return d%10==0&&0=t)},exactCount:function(e,t){return 0==t?""===e:1==t?""!==e&&-1===e.search(","):e.split(",").length==t},maxCount:function(e,t){return 0!=t&&(1==t?-1===e.search(","):e.split(",").length<=t)}}}}(jQuery,window,document),function(k,T,e,S){"use strict";k.isFunction=k.isFunction||function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},T=void 0!==T&&T.Math==Math?T:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),k.fn.accordion=function(a){var v,r=k(this),b=(new Date).getTime(),y=[],x=a,C="string"==typeof x,w=[].slice.call(arguments,1);return r.each(function(){var e,c,u=k.isPlainObject(a)?k.extend(!0,{},k.fn.accordion.settings,a):k.extend({},k.fn.accordion.settings),d=u.className,t=u.namespace,f=u.selector,s=u.error,n="."+t,i="module-"+t,o=r.selector||"",m=k(this),g=m.find(f.title),p=m.find(f.content),l=this,h=m.data(i);c={initialize:function(){c.debug("Initializing",m),c.bind.events(),u.observeChanges&&c.observeChanges(),c.instantiate()},instantiate:function(){h=c,m.data(i,c)},destroy:function(){c.debug("Destroying previous instance",m),m.off(n).removeData(i)},refresh:function(){g=m.find(f.title),p=m.find(f.content)},observeChanges:function(){"MutationObserver"in T&&((e=new MutationObserver(function(e){c.debug("DOM tree modified, updating selector cache"),c.refresh()})).observe(l,{childList:!0,subtree:!0}),c.debug("Setting up mutation observer",e))},bind:{events:function(){c.debug("Binding delegated events"),m.on(u.on+n,f.trigger,c.event.click)}},event:{click:function(){c.toggle.call(this)}},toggle:function(e){var t=e!==S?"number"==typeof e?g.eq(e):k(e).closest(f.title):k(this).closest(f.title),n=t.next(p),i=n.hasClass(d.animating),o=n.hasClass(d.active),a=o&&!i,r=!o&&i;c.debug("Toggling visibility of content",t),a||r?u.collapsible?c.close.call(t):c.debug("Cannot close accordion content collapsing is disabled"):c.open.call(t)},open:function(e){var t=e!==S?"number"==typeof e?g.eq(e):k(e).closest(f.title):k(this).closest(f.title),n=t.next(p),i=n.hasClass(d.animating);n.hasClass(d.active)||i?c.debug("Accordion already open, skipping",n):(c.debug("Opening accordion content",t),u.onOpening.call(n),u.onChanging.call(n),u.exclusive&&c.closeOthers.call(t),t.addClass(d.active),n.stop(!0,!0).addClass(d.animating),u.animateChildren&&(k.fn.transition!==S&&m.transition("is supported")?n.children().transition({animation:"fade in",queue:!1,useFailSafe:!0,debug:u.debug,verbose:u.verbose,duration:u.duration,skipInlineHidden:!0,onComplete:function(){n.children().removeClass(d.transition)}}):n.children().stop(!0,!0).animate({opacity:1},u.duration,c.resetOpacity)),n.slideDown(u.duration,u.easing,function(){n.removeClass(d.animating).addClass(d.active),c.reset.display.call(this),u.onOpen.call(this),u.onChange.call(this)}))},close:function(e){var t=e!==S?"number"==typeof e?g.eq(e):k(e).closest(f.title):k(this).closest(f.title),n=t.next(p),i=n.hasClass(d.animating),o=n.hasClass(d.active);!o&&!(!o&&i)||o&&i||(c.debug("Closing accordion content",n),u.onClosing.call(n),u.onChanging.call(n),t.removeClass(d.active),n.stop(!0,!0).addClass(d.animating),u.animateChildren&&(k.fn.transition!==S&&m.transition("is supported")?n.children().transition({animation:"fade out",queue:!1,useFailSafe:!0,debug:u.debug,verbose:u.verbose,duration:u.duration,skipInlineHidden:!0}):n.children().stop(!0,!0).animate({opacity:0},u.duration,c.resetOpacity)),n.slideUp(u.duration,u.easing,function(){n.removeClass(d.animating).removeClass(d.active),c.reset.display.call(this),u.onClose.call(this),u.onChange.call(this)}))},closeOthers:function(e){var t,n,i,o=e!==S?g.eq(e):k(this).closest(f.title),a=o.parents(f.content).prev(f.title),r=o.closest(f.accordion),s=f.title+"."+d.active+":visible",l=f.content+"."+d.active+":visible";i=u.closeNested?(t=r.find(s).not(a)).next(p):(t=r.find(s).not(a),n=r.find(l).find(s).not(a),(t=t.not(n)).next(p)),0").addClass(ue.popup)[t](e)}ge.addClass(ue.calendar),pe&&ge.addClass(ue.inverted);var n=function(){return le.refreshTooltips(),ce.onVisible.apply(ge,arguments)},i=ce.onHidden;c.length||(ge.attr("tabindex","0"),n=function(){return le.refreshTooltips(),le.focus(),ce.onVisible.apply(ge,arguments)},i=function(){return le.blur(),ce.onHidden.apply(ge,arguments)});var o=le.setting("on"),a=ve.extend({},ce.popupOptions,{popup:ge,on:o,hoverable:"hover"===o,closable:"click"===o,onShow:function(){return le.set.focusDate(le.get.date()),le.set.mode(le.get.validatedMode(ce.startMode)),ce.onShow.apply(ge,arguments)},onVisible:n,onHide:ce.onHide,onHidden:i});le.popup(a)}else le.error(s.popup)},inline:function(){u.length&&!ce.inline||(ce.inline=!0,ge=ve("
").addClass(ue.calendar).appendTo(l),c.length||ge.attr("tabindex","0"))},input:function(){ce.touchReadonly&&c.length&&f&&c.prop("readonly",!0),le.check.disabled()},date:function(){var e;ce.initialDate?e=n.date(ce.initialDate,ce):l.data(fe.date)!==be?e=n.date(l.data(fe.date),ce):c.length&&(e=n.date(c.val(),ce)),le.set.date(e,ce.formatInput,!1),le.set.mode(le.get.mode(),!1)}},trigger:{change:function(){var e=c[0];if(e){var t=D.createEvent("HTMLEvents");le.verbose("Triggering native change event"),t.initEvent("change",!0,!1),e.dispatchEvent(t)}}},create:{calendar:function(){var e,t,n,i,o,a,r,s=le.get.mode(),l=new Date,c=le.get.date(),u=le.get.focusDate(),d=le.helper.dateInRange(u||c||ce.initialDate||l);u||(u=d,le.set.focusDate(u,!1,!1));var f="year"===s,m="month"===s,g="day"===s,p="hour"===s,h="minute"===s,v="time"===ce.type,b=Math.max(ce.multiMonth,1),y=g?le.get.monthOffset():0,x=d.getMinutes(),C=d.getHours(),w=d.getDate(),k=d.getMonth()+y,T=d.getFullYear(),S=g?ce.showWeekNumbers?8:7:p?4:me.column,D=g||p?6:me.row,A=g?b:1,E=ge,F=E.hasClass("left")?"right center":"left center";for(E.empty(),1 ").addClass(ue.grid).appendTo(E)),i=0;i ").addClass(ue.column).appendTo(r);var P=k+i,O=(new Date(T,P,1).getDay()-ce.firstDayOfWeek%7+7)%7;if(!ce.constantHeight&&g){var R=new Date(T,P+1,0).getDate()+O;D=Math.ceil(R/7)}var M=f?10:m?1:0,I=g?1:0,j=p||h?1:0,L=p||h?w:1,V=new Date(T-M,P-I,L-j,C),q=new Date(T+M,P+I,L+j,C),z=f?new Date(10*Math.ceil(T/10)-9,0,0):m?new Date(T,0,0):g?new Date(T,P,0):new Date(T,P,w,-1),N=f?new Date(10*Math.ceil(T/10)+1,0,1):m?new Date(T+1,0,1):g?new Date(T,P+1,1):new Date(T,P,w+1),H=s;g&&ce.showWeekNumbers&&(H+=" andweek");var U=ve("").addClass(ue.table).addClass(H).addClass(he[S]+" column").appendTo(E);pe&&U.addClass(ue.inverted);var B=S;if(!v){var W=ve(" ").appendTo(U);o=ve(" ").appendTo(W),a=ve(" ").attr("colspan",""+S).appendTo(o);var Y=f||m?new Date(T,0,1):g?new Date(T,P,1):new Date(T,P,w,C,x),Q=ve(" ").addClass(ue.link).appendTo(a);Q.text(de.header(Y,s,ce));var X=m?ce.disableYear?"day":"year":g?ce.disableMonth?"year":"month":"day";if(Q.data(fe.mode,X),0===i){var K=ve(" ").addClass(ue.prev).appendTo(a);K.data(fe.focusDate,V),K.toggleClass(ue.disabledCell,!le.helper.isDateInRange(z,s)),ve(" ").addClass(ue.prevIcon).appendTo(K)}if(i===A-1){var $=ve(" ").addClass(ue.next).appendTo(a);$.data(fe.focusDate,q),$.toggleClass(ue.disabledCell,!le.helper.isDateInRange(N,s)),ve(" ").addClass(ue.nextIcon).appendTo($)}if(g)for(o=ve(" ").appendTo(W),ce.showWeekNumbers&&((a=ve(" ").appendTo(o)).text(ce.text.weekNo),a.addClass(ue.weekCell),B--),e=0;e ").appendTo(o)).text(de.dayColumnHeader((e+ce.firstDayOfWeek)%7,ce))}var G=ve(" ").appendTo(U);for(e=f?10*Math.ceil(T/10)-9:g?1-O:0,t=0;t ").appendTo(G),g&&ce.showWeekNumbers&&((a=ve(" ").appendTo(o)).text(le.get.weekOfYear(T,P,e+1-ce.firstDayOfWeek)),a.addClass(ue.weekCell)),n=0;n ").addClass(ue.cell).appendTo(o)).text(Z),a.data(fe.date,J);var _,ee=g&&J.getMonth()!==(P+12)%12,te=!ce.selectAdjacentDays&&ee||!le.helper.isDateInRange(J,s)||ce.isDisabled(J,s)||le.helper.isDisabled(J,s)||!le.helper.isEnabled(J,s);if(te){var ne=le.helper.findDayAsObject(J,s,ce.disabledDates);null!==ne&&ne[fe.message]&&(a.attr("data-tooltip",ne[fe.message]),a.attr("data-position",ne[fe.position]||F),(ne[fe.inverted]||pe&&ne[fe.inverted]===be)&&a.attr("data-inverted",""),ne[fe.variation]&&a.attr("data-variation",ne[fe.variation]))}else null!==(_=le.helper.findDayAsObject(J,s,ce.eventDates))&&(a.addClass(_[fe.class]||ce.eventClass),_[fe.message]&&(a.attr("data-tooltip",_[fe.message]),a.attr("data-position",_[fe.position]||F),(_[fe.inverted]||pe&&_[fe.inverted]===be)&&a.attr("data-inverted",""),_[fe.variation]&&a.attr("data-variation",_[fe.variation])));var ie=le.helper.dateEqual(J,c,s),oe=le.helper.dateEqual(J,l,s);a.toggleClass(ue.adjacentCell,ee&&!_),a.toggleClass(ue.disabledCell,te),a.toggleClass(ue.activeCell,ie&&!(ee&&te)),p||h||a.toggleClass(ue.todayCell,!ee&&oe);var ae={mode:s,adjacent:ee,disabled:te,active:ie,today:oe};de.cell(a,J,ae),le.helper.dateEqual(J,u,s)&&le.set.focusDate(J,!1,!1)}if(ce.today){var re=ve(" ").appendTo(G),se=ve(" ").attr("colspan",""+S).addClass(ue.today).appendTo(re);se.text(de.today(ce)),se.data(fe.date,l)}le.update.focus(!1,U),ce.inline&&le.refreshTooltips()}}},update:{focus:function(e,t){t=t||ge;var s=le.get.mode(),n=le.get.date(),l=le.get.focusDate(),c=le.get.startDate(),u=le.get.endDate(),d=(e?l:null)||n||(f?null:l);t.find("td").each(function(){var e=ve(this),t=e.data(fe.date);if(t){var n=e.hasClass(ue.disabledCell),i=e.hasClass(ue.activeCell),o=e.hasClass(ue.adjacentCell),a=le.helper.dateEqual(t,l,s),r=!!d&&(!!c&&le.helper.isDateInRange(t,s,c,d)||!!u&&le.helper.isDateInRange(t,s,d,u));e.toggleClass(ue.focusCell,a&&(!f||g)&&(!o||ce.selectAdjacentDays&&o)&&!n),le.helper.isTodayButton(e)||e.toggleClass(ue.rangeCell,r&&!i&&!n)}})}},refresh:function(){le.create.calendar()},refreshTooltips:function(){var o=ve(S).width();ge.find("td[data-position]").each(function(){var e=ve(this),t=S.getComputedStyle(e[0],":after").width.replace(/[^0-9\.]/g,""),n=e.attr("data-position"),i=o-e.width()-(parseInt(t,10)||250)>e.offset().left?"right":"left";-1===n.indexOf(i)&&e.attr("data-position",n.replace(/(left|right)/,i))})},bind:{events:function(){le.debug("Binding events"),ge.on("mousedown"+i,le.event.mousedown),ge.on("touchstart"+i,le.event.mousedown),ge.on("mouseup"+i,le.event.mouseup),ge.on("touchend"+i,le.event.mouseup),ge.on("mouseover"+i,le.event.mouseover),c.length?(c.on("input"+i,le.event.inputChange),c.on("focus"+i,le.event.inputFocus),c.on("blur"+i,le.event.inputBlur),c.on("keydown"+i,le.event.keydown)):ge.on("keydown"+i,le.event.keydown)}},unbind:{events:function(){le.debug("Unbinding events"),ge.off(i),c.length&&c.off(i)}},event:{mouseover:function(e){var t=ve(e.target).data(fe.date),n=1===e.buttons;t&&le.set.focusDate(t,!1,!0,n)},mousedown:function(e){c.length&&e.preventDefault(),g=0<=e.type.indexOf("touch");var t=ve(e.target).data(fe.date);t&&le.set.focusDate(t,!1,!0,!0)},mouseup:function(e){le.focus(),e.preventDefault(),e.stopPropagation(),g=!1;var t=ve(e.target);if(!t.hasClass("disabled")){var n=t.parent();(n.data(fe.date)||n.data(fe.focusDate)||n.data(fe.mode))&&(t=n);var i=t.data(fe.date),o=t.data(fe.focusDate),a=t.data(fe.mode);if(i&&!1!==ce.onSelect.call(d,i,le.get.mode())){var r=t.hasClass(ue.today);le.selectDate(i,r)}else o?le.set.focusDate(o):a&&le.set.mode(a)}},keydown:function(e){var t=e.which;if(27!==t&&9!==t||le.popup("hide"),le.popup("is visible"))if(37===t||38===t||39===t||40===t){var n="day"===(d=le.get.mode())?7:"hour"===d?4:"minute"===d?me.column:3,i=37===t?-1:38===t?-n:39==t?1:n;i*="minute"===d?ce.minTimeGap:1;var o=le.get.focusDate()||le.get.date()||new Date,a=o.getFullYear()+("year"===d?i:0),r=o.getMonth()+("month"===d?i:0),s=o.getDate()+("day"===d?i:0),l=o.getHours()+("hour"===d?i:0),c=o.getMinutes()+("minute"===d?i:0),u=new Date(a,r,s,l,c);"time"===ce.type&&(u=le.helper.mergeDateTime(o,u)),le.helper.isDateInRange(u,d)&&le.set.focusDate(u)}else if(13===t){var d=le.get.mode(),f=le.get.focusDate();f&&!ce.isDisabled(f,d)&&!le.helper.isDisabled(f,d)&&le.helper.isEnabled(f,d)&&le.selectDate(f),e.preventDefault(),e.stopPropagation()}38!==t&&40!==t||(e.preventDefault(),le.popup("show"))},inputChange:function(){var e=c.val(),t=n.date(e,ce);le.set.date(t,!1)},inputFocus:function(){ge.addClass(ue.active)},inputBlur:function(){if(ge.removeClass(ue.active),ce.formatInput){var e=le.get.date(),t=de.datetime(e,ce);c.val(t)}a&&(le.trigger.change(),a=!1)},class:{mutation:function(e){e.forEach(function(e){"class"===e.attributeName&&le.check.disabled()})}}},observeChanges:function(){"MutationObserver"in S&&(e=new MutationObserver(le.event.class.mutation),le.debug("Setting up mutation observer",e),le.observe.class())},disconnect:{classObserver:function(){c.length&&e&&e.disconnect()}},observe:{class:function(){c.length&&e&&e.observe(l[0],{attributes:!0})}},is:{disabled:function(){return l.hasClass(ue.disabled)}},check:{disabled:function(){c.attr("tabindex",le.is.disabled()?-1:0)}},get:{weekOfYear:function(e,t,n){var i,o,a;return i=Date.UTC(e,t,n+3)/864e5,o=Math.floor(i/7),a=new Date(6048e5*o).getUTCFullYear(),o-Math.floor(Date.UTC(a,0,7)/6048e5)+1},date:function(){return le.helper.sanitiseDate(l.data(fe.date))||null},inputDate:function(){return c.val()},focusDate:function(){return l.data(fe.focusDate)||null},startDate:function(){var e=le.get.calendarModule(ce.startCalendar);return(e?e.get.date():l.data(fe.startDate))||null},endDate:function(){var e=le.get.calendarModule(ce.endCalendar);return(e?e.get.date():l.data(fe.endDate))||null},minDate:function(){return l.data(fe.minDate)||null},maxDate:function(){return l.data(fe.maxDate)||null},monthOffset:function(){return l.data(fe.monthOffset)||0},mode:function(){var e=l.data(fe.mode)||ce.startMode;return le.get.validatedMode(e)},validatedMode:function(e){var t=le.get.validModes();return 0<=ve.inArray(e,t)?e:"time"===ce.type?"hour":"month"===ce.type?"month":"year"===ce.type?"year":"day"},type:function(){return l.data(fe.type)||ce.type},validModes:function(){var e=[];return"time"!==ce.type&&(ce.disableYear&&"year"!==ce.type||e.push("year"),(ce.disableMonth||"year"===ce.type)&&"month"!==ce.type||e.push("month"),0<=ce.type.indexOf("date")&&e.push("day")),0<=ce.type.indexOf("time")&&(e.push("hour"),ce.disableMinute||e.push("minute")),e},isTouch:function(){try{return D.createEvent("TouchEvent"),!0}catch(e){return!1}},calendarModule:function(e){return e?(e instanceof ve||(e=ve(e).first()),e.data(o)):null}},set:{date:function(e,t,n){t=!1!==t,n=!1!==n,e=le.helper.sanitiseDate(e),e=le.helper.dateInRange(e);var i=le.get.mode(),o=de.datetime(e,ce);if(n&&!1===ce.onBeforeChange.call(d,e,o,i))return!1;if(le.set.focusDate(e),ce.isDisabled(e,i))return!1;var a=le.get.endDate();a&&e&&a=e?le.verbose("Unable to set maxDate variable lower that minDate variable",e,ce.minDate):(le.setting("maxDate",e),le.set.dataKeyValue(fe.maxDate,e))},monthOffset:function(e,t){var n=Math.max(ce.multiMonth,1);e=Math.max(1-n,Math.min(0,e)),le.set.dataKeyValue(fe.monthOffset,e,t)},mode:function(e,t){le.set.dataKeyValue(fe.mode,e,t)},dataKeyValue:function(e,t,n){var i=l.data(e),o=i===t||i<=t&&t<=i;return t?l.data(e,t):l.removeData(e),(n=!1!==n&&!o)&&le.refresh(),!o}},selectDate:function(e,t){le.verbose("New date selection",e);var n=le.get.mode();if(t||"minute"===n||ce.disableMinute&&"hour"===n||"date"===ce.type&&"day"===n||"month"===ce.type&&"month"===n||"year"===ce.type&&"year"===n){if(!(!1===le.set.date(e))&&(a=!0,ce.closable)){le.popup("hide");var i=le.get.calendarModule(ce.endCalendar);i&&("focus"!==i.setting("on")&&i.popup("show"),i.focus())}}else{var o="year"===n?ce.disableMonth?"day":"month":"month"===n?"day":"day"===n?"hour":"minute";le.set.mode(o),"hour"===n||"day"===n&&le.get.date()?le.set.date(e,!0,!1):le.set.focusDate(e)}},changeDate:function(e){le.set.date(e)},clear:function(){le.set.date(be)},popup:function(){return u.popup.apply(u,arguments)},focus:function(){c.length?c.focus():ge.focus()},blur:function(){c.length?c.blur():ge.blur()},helper:{isDisabled:function(n,i){return("day"===i||"month"===i||"year"===i)&&("day"===i&&-1!==ce.disabledDaysOfWeek.indexOf(n.getDay())||ce.disabledDates.some(function(e){if("string"==typeof e&&(e=le.helper.sanitiseDate(e)),e instanceof Date)return le.helper.dateEqual(n,e,i);if(null!==e&&"object"==typeof e)if(e[fe.year]){if("number"==typeof e[fe.year])return n.getFullYear()==e[fe.year];if(Array.isArray(e[fe.year]))return-1=t.centuryBreak&&n===b.length-1){i<=99&&(i+=t.currentCentury-100),m=i,b.splice(n,1);break}if(f<0)for(n=0;n adjusting invoked element"),h=h.closest(p.checkbox),m.refresh())}},setup:function(){m.set.initialLoad(),m.is.indeterminate()?(m.debug("Initial value is indeterminate"),m.indeterminate()):m.is.checked()?(m.debug("Initial value is checked"),m.check()):(m.debug("Initial value is unchecked"),m.uncheck()),m.remove.initialLoad()},refresh:function(){a=h.children(p.label),v=h.children(p.input),b=v[0]},hide:{input:function(){m.verbose("Modifying z-index to be unselectable"),v.addClass(t.hidden)}},show:{input:function(){m.verbose("Modifying z-index to be selectable"),v.removeClass(t.hidden)}},observeChanges:function(){"MutationObserver"in D&&((e=new MutationObserver(function(e){m.debug("DOM tree modified, updating selector cache"),m.refresh()})).observe(c,{childList:!0,subtree:!0}),m.debug("Setting up mutation observer",e))},attachEvents:function(e,t){var n=S(e);t=S.isFunction(m[t])?m[t]:m.toggle,0").insertAfter(v),m.debug("Creating label",a))}},has:{label:function(){return 0 .ui.dimmer",content:".ui.dimmer > .content, .ui.dimmer > .content > .center"},template:{dimmer:function(e){var t,n=k("
").addClass("ui dimmer");return e.displayLoader&&(t=k("
").addClass(e.className.loader).addClass(e.loaderVariation),e.loaderText&&(t.text(e.loaderText),t.addClass("text")),n.append(t)),n}}}}(jQuery,window,document),function(te,ne,ie,oe){"use strict";te.isFunction=te.isFunction||function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},ne=void 0!==ne&&ne.Math==Math?ne:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),te.fn.dropdown=function(B){var W,Y=te(this),Q=te(ie),X=Y.selector||"",K="ontouchstart"in ie.documentElement,$=K?"touchstart":"click",G=(new Date).getTime(),J=[],Z=B,_="string"==typeof Z,ee=[].slice.call(arguments,1);return Y.each(function(n){var d,e,t,i,o,a,r,s,l,p,g=te.isPlainObject(B)?te.extend(!0,{},te.fn.dropdown.settings,B):te.extend({},te.fn.dropdown.settings),h=g.className,f=g.message,c=g.fields,v=g.keys,b=g.metadata,u=g.namespace,m=g.regExp,y=g.selector,x=g.error,C=g.templates,w="."+u,k="module-"+u,T=te(this),S=te(g.context),D=T.find(y.text),A=T.find(y.search),E=T.find(y.sizer),F=T.find(y.input),P=T.find(y.icon),O=T.find(y.clearIcon),R=0 ").html(o).attr("data-"+b.value,t).attr("data-"+b.text,t).addClass(h.addition).addClass(h.item),g.hideAdditions&&i.addClass(h.hidden),n=n===oe?i:n.add(i),p.verbose("Creating user choices for value",t,i))}),n)},userLabels:function(e){var t=p.get.userValues();t&&(p.debug("Adding user labels",t),te.each(t,function(e,t){p.verbose("Adding custom user value"),p.add.label(t,t)}))},menu:function(){M=te("
").addClass(h.menu).appendTo(T)},sizer:function(){E=te(" ").addClass(h.sizer).insertAfter(A)}},search:function(e){e=e!==oe?e:p.get.query(),p.verbose("Searching for query",e),!1===g.fireOnInit&&p.is.initialLoad()?p.verbose("Skipping callback on initial load",g.onSearch):p.has.minCharacters(e)&&!1!==g.onSearch.call(N,e)?p.filter(e):p.hide(null,!0)},select:{firstUnfiltered:function(){p.verbose("Selecting first non-filtered element"),p.remove.selectedItem(),I.not(y.unselectable).not(y.addition+y.hidden).eq(0).addClass(h.selected)},nextAvailable:function(e){var t=(e=e.eq(0)).nextAll(y.item).not(y.unselectable).eq(0),n=e.prevAll(y.item).not(y.unselectable).eq(0);0 ").addClass("remove icon").insertBefore(D)),p.is.search()&&!p.has.search()&&(p.verbose("Adding search input"),A=te(" ").addClass(h.search).prop("autocomplete",p.is.chrome()?"fomantic-search":"off").insertBefore(D)),p.is.multiple()&&p.is.searchSelection()&&!p.has.sizer()&&p.create.sizer(),g.allowTab&&p.set.tabbable()},select:function(){var e=p.get.selectValues();p.debug("Dropdown initialized on a select",e),T.is("select")&&(F=T),0 ").attr("class",F.attr("class")).addClass(h.selection).addClass(h.dropdown).html(C.dropdown(e,c,g.preserveHTML,g.className)).insertBefore(F),F.hasClass(h.multiple)&&!1===F.prop("multiple")&&(p.error(x.missingMultiple),F.prop("multiple",!0)),F.is("[multiple]")&&p.set.multiple(),F.prop("disabled")&&(p.debug("Disabling dropdown"),T.addClass(h.disabled)),F.removeAttr("required").removeAttr("class").detach().prependTo(T)),p.refresh()},menu:function(e){M.html(C.menu(e,c,g.preserveHTML,g.className)),I=M.find(y.item),j=g.hideDividers?I.parent().children(y.divider):te()},reference:function(){p.debug("Dropdown behavior was called on select, replacing with closest dropdown"),T=T.parent(y.dropdown),U=T.data(k),N=T.get(0),p.refresh(),p.setup.returnedObject()},returnedObject:function(){var e=Y.slice(0,n),t=Y.slice(n+1);Y=e.add(T).add(t)}},refresh:function(){p.refreshSelectors(),p.refreshData()},refreshItems:function(){I=M.find(y.item),j=g.hideDividers?I.parent().children(y.divider):te()},refreshSelectors:function(){p.verbose("Refreshing selector cache"),D=T.find(y.text),A=T.find(y.search),F=T.find(y.input),P=T.find(y.icon),R=0 "),te.each(e,function(e,t){var n=g.templates.deQuote(t[c.value]),i=g.templates.escape(t[c.name]||"",g.preserveHTML);F.append(''+i+" ")}),p.observe.select())}},event:{change:function(){q||(p.debug("Input changed, updating selection"),p.set.selected())},focus:function(){g.showOnFocus&&!L&&p.is.hidden()&&!t&&(H=!0,p.show())},blur:function(e){t=ie.activeElement===this,L||t||(p.remove.activeLabel(),p.hide())},mousedown:function(){p.is.searchSelection()?i=!0:L=!0},mouseup:function(){p.is.searchSelection()?i=!1:L=!1},click:function(e){te(e.target).is(T)&&(p.is.focusedOnSearch()?p.show():p.focusSearch())},search:{focus:function(e){L=!0,p.is.multiple()&&p.remove.activeLabel(),H||p.is.active()||!(g.showOnFocus||"focus"!==e.type&&"focusin"!==e.type)||(H=!0,p.search())},blur:function(e){t=ie.activeElement===this,p.is.searchSelection()&&!i&&(V||t||(g.forceSelection?p.forceSelection():g.allowAdditions||p.remove.searchTerm(),p.hide())),i=!1}},clearIcon:{click:function(e){p.clear(),p.is.searchSelection()&&p.remove.searchTerm(),p.hide(),e.stopPropagation()}},icon:{click:function(e){z=!0,p.has.search()?p.is.active()?p.blurSearch():g.showOnFocus?p.focusSearch():p.toggle():p.toggle(),e.stopPropagation()}},text:{focus:function(e){L=!0,p.focusSearch()}},input:function(e){(p.is.multiple()||p.is.searchSelection())&&p.set.filtered(),clearTimeout(p.timer),p.timer=setTimeout(p.search,g.delay.search)},label:{click:function(e){var t=te(this),n=T.find(y.label),i=n.filter("."+h.active),o=t.nextAll("."+h.active),a=t.prevAll("."+h.active),r=0 modified, recreating menu"),p.is.selectMutation(e)&&(p.disconnect.selectObserver(),p.refresh(),p.setup.select(),p.set.selected(),p.observe.select())}},menu:{mutation:function(e){var t=e[0],n=t.addedNodes?te(t.addedNodes[0]):te(!1),i=t.removedNodes?te(t.removedNodes[0]):te(!1),o=n.add(i),a=o.is(y.addition)||0=g.maxSelections?(p.debug("Maximum selection count reached"),g.useLabels&&(I.addClass(h.filtered),p.add.message(f.maxSelections)),!0):(p.verbose("No longer at maximum selection count"),p.remove.message(),p.remove.filteredItem(),p.is.searchSelection()&&p.filterItems(),!1))},disabled:function(){A.attr("tabindex",p.is.disabled()?-1:0)}},restore:{defaults:function(e){p.clear(e),p.restore.defaultText(),p.restore.defaultValue()},defaultText:function(){var e=p.get.defaultText();e===p.get.placeholderText?(p.debug("Restoring default placeholder text",e),p.set.placeholderText(e)):(p.debug("Restoring default text",e),p.set.text(e))},placeholderText:function(){p.set.placeholderText()},defaultValue:function(){var e=p.get.defaultValue();e!==oe&&(p.debug("Restoring default value",e),""!==e?(p.set.value(e),p.set.selected()):(p.remove.activeItem(),p.remove.selectedItem()))},labels:function(){g.allowAdditions&&(g.useLabels||(p.error(x.labels),g.useLabels=!0),p.debug("Restoring selected values"),p.create.userLabels()),p.check.maxSelections()},selected:function(){p.restore.values(),p.is.multiple()?(p.debug("Restoring previously selected values and labels"),p.restore.labels()):p.debug("Restoring previously selected values")},values:function(){p.set.initialLoad(),g.apiSettings&&g.saveRemoteData&&p.get.remoteValues()?p.restore.remoteValues():p.set.selected();var e=p.get.value();!e||""===e||Array.isArray(e)&&0===e.length?F.addClass(h.noselection):F.removeClass(h.noselection),p.remove.initialLoad()},remoteValues:function(){var e=p.get.remoteValues();p.debug("Recreating selected from session data",e),e&&(p.is.single()?te.each(e,function(e,t){p.set.text(t)}):te.each(e,function(e,t){p.add.label(e,t)}))}},read:{remoteData:function(e){var t;if(ne.Storage!==oe)return(t=sessionStorage.getItem(e))!==oe&&t;p.error(x.noStorage)}},save:{defaults:function(){p.save.defaultText(),p.save.placeholderText(),p.save.defaultValue()},defaultValue:function(){var e=p.get.value();p.verbose("Saving default value as",e),T.data(b.defaultValue,e)},defaultText:function(){var e=p.get.text();p.verbose("Saving default text as",e),T.data(b.defaultText,e)},placeholderText:function(){var e;!1!==g.placeholder&&D.hasClass(h.placeholder)&&(e=p.get.text(),p.verbose("Saving placeholder text as",e),T.data(b.placeholderText,e))},remoteData:function(e,t){ne.Storage!==oe?(p.verbose("Saving remote data to session storage",t,e),sessionStorage.setItem(t,e)):p.error(x.noStorage)}},clear:function(e){p.is.multiple()&&g.useLabels?p.remove.labels(T.find(y.label),e):(p.remove.activeItem(),p.remove.selectedItem(),p.remove.filteredItem()),p.set.placeholderText(),p.clearValue(e)},clearValue:function(e){p.set.value("",null,null,e)},scrollPage:function(e,t){var n,i,o=t||p.get.selectedItem(),a=o.closest(y.menu),r=a.outerHeight(),s=a.scrollTop(),l=I.eq(0).outerHeight(),c=Math.floor(r/l),u=(a.prop("scrollHeight"),"up"==e?s-l*c:s+l*c),d=I.not(y.unselectable);i="up"==e?d.index(o)-c:d.index(o)+c,0<(n=("up"==e?0<=i:i ").addClass(h.label).attr("data-"+b.value,a).html(C.label(a,t,g.preserveHTML,g.className)),i=g.onLabelCreate.call(i,a,t),p.has.label(e)?p.debug("User selection already exists, skipping",a):(g.label.variation&&i.addClass(g.label.variation),!0===n?(p.debug("Animating in label",i),i.addClass(h.hidden).insertBefore(o).transition({animation:g.label.transition,debug:g.debug,verbose:g.verbose,duration:g.label.duration})):(p.debug("Adding selection label",i),i.insertBefore(o)))},message:function(e){var t=M.children(y.message),n=g.templates.message(p.add.variables(e));0 ").html(n).addClass(h.message).appendTo(M)},optionValue:function(e){var t=p.escape.value(e);0 ").prop("value",t).addClass(h.addition).html(e).appendTo(F),p.verbose("Adding user addition as an ",e),p.observe.select())},userSuggestion:function(e){var t,n=M.children(y.addition),i=p.get.item(e),o=i&&i.not(y.addition).length,a=0",t),r&&r.observe(F[0],{childList:!0,subtree:!0}))},message:function(){M.children(y.message).remove()},searchWidth:function(){A.css("width","")},searchTerm:function(){p.verbose("Cleared search term"),A.val(""),p.set.filtered()},userAddition:function(){I.filter(y.addition).remove()},selected:function(e,t,i){if(!(t=g.allowAdditions?t||p.get.itemWithAdditions(e):t||p.get.item(e)))return!1;t.each(function(){var e=te(this),t=p.get.choiceText(e),n=p.get.choiceValue(e,t);p.is.multiple()?g.useLabels?(p.remove.value(n,t,e,i),p.remove.label(n)):(p.remove.value(n,t,e,i),0===p.get.selectionCount()?p.set.placeholderText():p.set.text(p.add.variables(f.count))):p.remove.value(n,t,e,i),e.removeClass(h.filtered).removeClass(h.active),g.useLabels&&e.removeClass(h.selected)})},selectedItem:function(){I.removeClass(h.selected)},value:function(e,t,n,i){var o,a=p.get.values();e=p.escape.htmlEntities(e),p.has.selectInput()?(p.verbose("Input is removing selected option",e),o=p.remove.arrayValue(e,a),p.remove.optionValue(e)):(p.verbose("Removing from delimited values",e),o=(o=p.remove.arrayValue(e,a)).join(g.delimiter)),!1===g.fireOnInit&&p.is.initialLoad()?p.verbose("No callback on initial load",g.onRemove):g.onRemove.call(N,e,t,n),p.set.value(o,t,n,i),p.check.maxSelections()},arrayValue:function(t,e){return Array.isArray(e)||(e=[e]),e=te.grep(e,function(e){return t!=e}),p.verbose("Removed value from delimited string",t,e),e},label:function(e,t){var n=p.escape.value(e),i=T.find(y.label).filter("[data-"+b.value+'="'+p.escape.string(g.ignoreCase?n.toLowerCase():n)+'"]');p.verbose("Removing label",i),i.remove()},activeLabels:function(e){e=e||T.find(y.label).filter("."+h.active),p.verbose("Removing active label selections",e),p.remove.labels(e)},labels:function(e,o){e=e||T.find(y.label),p.verbose("Removing labels",e),e.each(function(){var e=te(this),t=e.data(b.value),n=t!==oe?String(t):t,i=p.is.userValue(n);!1!==g.onLabelRemove.call(e,t)?(p.remove.message(),i?(p.remove.value(n,n,p.get.item(n),o),p.remove.label(n)):p.remove.selected(n,!1,o)):p.debug("Label remove callback cancelled removal")})},tabbable:function(){p.is.searchSelection()?(p.debug("Searchable dropdown initialized"),A.removeAttr("tabindex")):(p.debug("Simple selection dropdown initialized"),T.removeAttr("tabindex")),M.removeAttr("tabindex")},diacritics:function(e){return g.ignoreDiacritics?e.normalize("NFD").replace(/[\u0300-\u036f]/g,""):e}},has:{menuSearch:function(){return p.has.search()&&0=g.minCharacters:!(z=!1)},firstLetter:function(e,t){var n;return!(!e||0===e.length||"string"!=typeof t)&&(n=p.get.choiceText(e,!1),(t=t.toLowerCase())==String(n).charAt(0).toLowerCase())},input:function(){return 0=g.maxSelections},allResultsFiltered:function(){var e=I.not(y.addition);return e.filter(y.unselectable).length===e.length},userSuggestion:function(){return 0=n.menu.offset.top-n.context.offset.top+n.menu.height}).below?(p.verbose("Dropdown can fit in context downward",t),!0):t.below||t.above?(p.verbose("Dropdown cannot fit below, opening upward",t),!1):(p.verbose("Dropdown cannot fit in either direction, favoring downward",t),!0),i.removeClass(h.loading),o},openRightward:function(e){var t,n,i=e||M,o=!0;return i.addClass(h.loading),n={context:{offset:S.get(0)===ne?{top:0,left:0}:S.offset(),scrollLeft:S.scrollLeft(),width:S.outerWidth()},menu:{offset:i.offset(),width:i.outerWidth()}},p.is.horizontallyScrollableContext()&&(n.menu.offset.left+=n.context.scrollLeft),(t=n.menu.offset.left-n.context.offset.left+n.menu.width>=n.context.scrollLeft+n.context.width)&&(p.verbose("Dropdown cannot fit in context rightward",t),o=!1),i.removeClass(h.loading),o},click:function(){return K||"click"==g.on},extendSelect:function(){return g.allowAdditions||g.apiSettings},show:function(){return!p.is.disabled()&&(p.has.items()||p.has.message())},useAPI:function(){return te.fn.api!==oe}},animate:{show:function(e,t){var n,i=t||M,o=t?function(){}:function(){p.hideSubMenus(),p.hideOthers(),p.set.active()};e=te.isFunction(e)?e:function(){},p.verbose("Doing menu show animation",i),p.set.direction(t),n=g.transition.showMethod||p.get.transition(t),p.is.selection()&&p.set.scrollPosition(p.get.selectedItem(),!0),(p.is.hidden(i)||p.is.animating(i))&&("none"===n?(o(),i.transition({displayType:p.get.displayType()}).transition("show"),e.call(N)):te.fn.transition!==oe&&T.transition("is supported")?i.transition({animation:n+" in",debug:g.debug,verbose:g.verbose,duration:g.transition.showDuration||g.duration,queue:!0,onStart:o,displayType:p.get.displayType(),onComplete:function(){e.call(N)}}):p.error(x.noTransition,n))},hide:function(e,t){var n=t||M,i=t?function(){}:function(){p.can.click()&&p.unbind.intent(),p.remove.active()},o=g.transition.hideMethod||p.get.transition(t);e=te.isFunction(e)?e:function(){},(p.is.visible(n)||p.is.animating(n))&&(p.verbose("Doing menu hide animation",n),"none"===o?(i(),n.transition({displayType:p.get.displayType()}).transition("hide"),e.call(N)):te.fn.transition!==oe&&T.transition("is supported")?n.transition({animation:o+" out",duration:g.transition.hideDuration||g.duration,debug:g.debug,verbose:g.verbose,queue:!1,onStart:i,displayType:p.get.displayType(),onComplete:function(){e.call(N)}}):p.error(x.transition))}},hideAndClear:function(){p.remove.searchTerm(),p.has.maxSelections()||(p.has.search()?p.hide(function(){p.remove.filteredItem()}):p.hide())},delay:{show:function(){p.verbose("Delaying show event to ensure user intent"),clearTimeout(p.timer),p.timer=setTimeout(p.show,g.delay.show)},hide:function(){p.verbose("Delaying hide event to ensure user intent"),clearTimeout(p.timer),p.timer=setTimeout(p.hide,g.delay.hide)}},escape:{value:function(e){var t=Array.isArray(e),n="string"==typeof e,i=!n&&!t,o=n&&-1!==e.search(m.quote),a=[];return i||!o?e:(p.debug("Encoding quote values for use in select",e),t?(te.each(e,function(e,t){a.push(t.replace(m.quote,"""))}),a):e.replace(m.quote,"""))},string:function(e){return(e=String(e)).replace(m.escape,"\\$&")},htmlEntities:function(e){var t={"<":"<",">":">",'"':""","'":"'","`":"`"};return/[&<>"'`]/.test(e)?(e=e.replace(/&(?![a-z0-9#]{1,6};)/,"&")).replace(/[<>"'`]/g,function(e){return t[e]}):e}},setting:function(e,t){if(p.debug("Changing setting",e,t),te.isPlainObject(e))te.extend(!0,g,e);else{if(t===oe)return g[e];te.isPlainObject(g[e])?te.extend(!0,g[e],t):g[e]=t}},internal:function(e,t){if(te.isPlainObject(e))te.extend(!0,p,e);else{if(t===oe)return p[e];p[e]=t}},debug:function(){!g.silent&&g.debug&&(g.performance?p.performance.log(arguments):(p.debug=Function.prototype.bind.call(console.info,console,g.name+":"),p.debug.apply(console,arguments)))},verbose:function(){!g.silent&&g.verbose&&g.debug&&(g.performance?p.performance.log(arguments):(p.verbose=Function.prototype.bind.call(console.info,console,g.name+":"),p.verbose.apply(console,arguments)))},error:function(){g.silent||(p.error=Function.prototype.bind.call(console.error,console,g.name+":"),p.error.apply(console,arguments))},performance:{log:function(e){var t,n;g.performance&&(n=(t=(new Date).getTime())-(G||t),G=t,J.push({Name:e[0],Arguments:[].slice.call(e,1)||"",Element:N,"Execution Time":n})),clearTimeout(p.performance.timer),p.performance.timer=setTimeout(p.performance.display,500)},display:function(){var e=g.name+":",n=0;G=!1,clearTimeout(p.performance.timer),te.each(J,function(e,t){n+=t["Execution Time"]}),e+=" "+n+"ms",X&&(e+=" '"+X+"'"),(console.group!==oe||console.table!==oe)&&0{term}",count:"{count} selected",maxSelections:"Max {maxCount} selections",noResults:"No results found.",serverError:"There was an error contacting the server"},error:{action:"You called a dropdown action that was not defined",alreadySetup:"Once a select has been initialized behaviors must be called on the created ui dropdown",labels:"Allowing user additions currently requires the use of labels.",missingMultiple:" requires multiple property to be set to correctly preserve multiple values",method:"The method you called is not defined.",noAPI:"The API module is required to load resources remotely",noStorage:"Saving remote data requires session storage",noTransition:"This module requires ui transitions ",noNormalize:'"ignoreDiacritics" setting will be ignored. Browser does not support String().normalize(). You may consider including as a polyfill.'},regExp:{escape:/[-[\]{}()*+?.,\\^$|#\s:=@]/g,quote:/"/g},metadata:{defaultText:"defaultText",defaultValue:"defaultValue",placeholderText:"placeholder",text:"text",value:"value"},fields:{remoteValues:"results",values:"values",disabled:"disabled",name:"name",description:"description",descriptionVertical:"descriptionVertical",value:"value",text:"text",type:"type",image:"image",imageClass:"imageClass",icon:"icon",iconClass:"iconClass",class:"class",divider:"divider"},keys:{backspace:8,delimiter:188,deleteKey:46,enter:13,escape:27,pageUp:33,pageDown:34,leftArrow:37,upArrow:38,rightArrow:39,downArrow:40},selector:{addition:".addition",divider:".divider, .header",dropdown:".ui.dropdown",hidden:".hidden",icon:"> .dropdown.icon",input:'> input[type="hidden"], > select',item:".item",label:"> .label",remove:"> .label > .delete.icon",siblingLabel:".label",menu:".menu",message:".message",menuIcon:".dropdown.icon",search:"input.search, .menu > .search > input, .menu input.search",sizer:"> span.sizer",text:"> .text:not(.icon)",unselectable:".disabled, .filtered",clearIcon:"> .remove.icon"},className:{active:"active",addition:"addition",animating:"animating",description:"description",descriptionVertical:"vertical",disabled:"disabled",empty:"empty",dropdown:"ui dropdown",filtered:"filtered",hidden:"hidden transition",icon:"icon",image:"image",item:"item",label:"ui label",loading:"loading",menu:"menu",message:"message",multiple:"multiple",placeholder:"default",sizer:"sizer",search:"search",selected:"selected",selection:"selection",text:"text",upward:"upward",leftward:"left",visible:"visible",clearable:"clearable",noselection:"noselection",delete:"delete",header:"header",divider:"divider",groupIcon:"",unfilterable:"unfilterable"}},te.fn.dropdown.settings.templates={deQuote:function(e,t){return String(e).replace(/"/g,t?""":"")},escape:function(e,t){if(t)return e;var n={"<":"<",">":">",'"':""","'":"'","`":"`"};return/[&<>"'`]/.test(e)?(e=e.replace(/&(?![a-z0-9#]{1,6};)/,"&")).replace(/[<>"'`]/g,function(e){return n[e]}):e},dropdown:function(e,t,n,i){var o=e.placeholder||!1,a="",r=te.fn.dropdown.settings.templates.escape;return a+=' ',a+=o?''+r(o,n)+"
":'
',a+='"},menu:function(e,u,d,f){var t=e[u.values]||[],m="",g=te.fn.dropdown.settings.templates.escape,p=te.fn.dropdown.settings.templates.deQuote;return te.each(t,function(e,t){var n=t[u.type]?t[u.type]:"item",i=-1!==n.indexOf("menu");if("item"===n||i){var o=t[u.text]?' data-text="'+p(t[u.text],!0)+'"':"",a=t[u.disabled]?f.disabled+" ":"",r=t[u.descriptionVertical]?f.descriptionVertical+" ":"",s=""!=g(t[u.description]||"",d);m+='",i&&(m+='
'),t[u.image]&&(m+='
'),t[u.icon]&&(m+='
'),s&&(m+='
'+g(t[u.description]||"",d)+" ",m+=i?"":'
'),i&&(m+=''),m+=g(t[u.name]||"",d),i?(m+=" ",m+='',m+=te.fn.dropdown.settings.templates.menu(t,u,d,f),m+="
"):s&&(m+=" "),m+="
"}else if("header"===n){var l=g(t[u.name]||"",d),c=t[u.icon]?p(t[u.icon]):f.groupIcon;""===l&&""===c||(m+='"),t[u.divider]&&(m+='
')}}),m},label:function(e,t,n,i){return(0,te.fn.dropdown.settings.templates.escape)(t,n)+' '},message:function(e){return e},addition:function(e){return e}}}(jQuery,window,document),function(T,e,t,S){"use strict";T.isFunction=T.isFunction||function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},e=void 0!==e&&e.Math==Math?e:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),T.fn.embed=function(p){var h,v=T(this),b=v.selector||"",y=(new Date).getTime(),x=[],C=p,w="string"==typeof C,k=[].slice.call(arguments,1);return v.each(function(){var s,i=T.isPlainObject(p)?T.extend(!0,{},T.fn.embed.settings,p):T.extend({},T.fn.embed.settings),e=i.selector,t=i.className,o=i.sources,l=i.error,a=i.metadata,n=i.namespace,r=i.templates,c="."+n,u="module-"+n,d=T(this),f=(d.find(e.placeholder),d.find(e.icon),d.find(e.embed)),m=this,g=d.data(u);s={initialize:function(){s.debug("Initializing embed"),s.determine.autoplay(),s.create(),s.bind.events(),s.instantiate()},instantiate:function(){s.verbose("Storing instance of module",s),g=s,d.data(u,s)},destroy:function(){s.verbose("Destroying previous instance of embed"),s.reset(),d.removeData(u).off(c)},refresh:function(){s.verbose("Refreshing selector cache"),d.find(e.placeholder),d.find(e.icon),f=d.find(e.embed)},bind:{events:function(){s.has.placeholder()&&(s.debug("Adding placeholder events"),d.on("click"+c,e.placeholder,s.createAndShow).on("click"+c,e.icon,s.createAndShow))}},create:function(){s.get.placeholder()?s.createPlaceholder():s.createAndShow()},createPlaceholder:function(e){var t=s.get.icon(),n=s.get.url();s.generate.embed(n);e=e||s.get.placeholder(),d.html(r.placeholder(e,t)),s.debug("Creating placeholder for embed",e,t)},createEmbed:function(e){s.refresh(),e=e||s.get.url(),f=T("
").addClass(t.embed).html(s.generate.embed(e)).appendTo(d),i.onCreate.call(m,e),s.debug("Creating embed object",f)},changeEmbed:function(e){f.html(s.generate.embed(e))},createAndShow:function(){s.createEmbed(),s.show()},change:function(e,t,n){s.debug("Changing video to ",e,t,n),d.data(a.source,e).data(a.id,t),n?d.data(a.url,n):d.removeData(a.url),s.has.embed()?s.changeEmbed():s.create()},reset:function(){s.debug("Clearing embed and showing placeholder"),s.remove.data(),s.remove.active(),s.remove.embed(),s.showPlaceholder(),i.onReset.call(m)},show:function(){s.debug("Showing embed"),s.set.active(),i.onDisplay.call(m)},hide:function(){s.debug("Hiding embed"),s.showPlaceholder()},showPlaceholder:function(){s.debug("Showing placeholder image"),s.remove.active(),i.onPlaceholderDisplay.call(m)},get:{id:function(){return i.id||d.data(a.id)},placeholder:function(){return i.placeholder||d.data(a.placeholder)},icon:function(){return i.icon?i.icon:d.data(a.icon)!==S?d.data(a.icon):s.determine.icon()},source:function(e){return i.source?i.source:d.data(a.source)!==S?d.data(a.source):s.determine.source()},type:function(){var e=s.get.source();return o[e]!==S&&o[e].type},url:function(){return i.url?i.url:d.data(a.url)!==S?d.data(a.url):s.determine.url()}},determine:{autoplay:function(){s.should.autoplay()&&(i.autoplay=!0)},source:function(n){var i=!1;return(n=n||s.get.url())&&T.each(o,function(e,t){if(-1!==n.search(t.domain))return i=e,!1}),i},icon:function(){var e=s.get.source();return o[e]!==S&&o[e].icon},url:function(){var e,t=i.id||d.data(a.id),n=i.source||d.data(a.source);return(e=o[n]!==S&&o[n].url.replace("{id}",t))&&d.data(a.url,e),e}},set:{active:function(){d.addClass(t.active)}},remove:{data:function(){d.removeData(a.id).removeData(a.icon).removeData(a.placeholder).removeData(a.source).removeData(a.url)},active:function(){d.removeClass(t.active)},embed:function(){f.empty()}},encode:{parameters:function(e){var t,n=[];for(t in e)n.push(encodeURIComponent(t)+"="+encodeURIComponent(e[t]));return n.join("&")}},generate:{embed:function(e){s.debug("Generating embed html");var t,n,i=s.get.source();return(e=s.get.url(e))?(n=s.generate.parameters(i),t=r.iframe(e,n)):s.error(l.noURL,d),t},parameters:function(e,t){var n=o[e]&&o[e].parameters!==S?o[e].parameters(i):{};return(t=t||i.parameters)&&(n=T.extend({},n,t)),n=i.onEmbed(n),s.encode.parameters(n)}},has:{embed:function(){return 0'},placeholder:function(e,t){var n="";return t&&(n+=' '),e&&(n+=' '),n}},api:!1,onPause:function(){},onPlay:function(){},onStop:function(){}}}(jQuery,window,document),function(z,N,H,U){"use strict";z.isFunction=z.isFunction||function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},N=void 0!==N&&N.Math==Math?N:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),z.fn.modal=function(A){var E,e=z(this),F=z(N),P=z(H),O=z("body"),R=e.selector||"",M=(new Date).getTime(),I=[],j=A,L="string"==typeof j,V=[].slice.call(arguments,1),q=N.requestAnimationFrame||N.mozRequestAnimationFrame||N.webkitRequestAnimationFrame||N.msRequestAnimationFrame||function(e){setTimeout(e,0)};return e.each(function(){var o,a,e,i,n,r,s,t,l,c,u,d=z.isPlainObject(A)?z.extend(!0,{},z.fn.modal.settings,A):z.extend({},z.fn.modal.settings),f=d.selector,m=d.className,g=d.namespace,p=d.fields,h=d.error,v="."+g,b="module-"+g,y=z(this),x=z(d.context),C=y.find(f.close),w=this,k=y.hasClass("modal")?y.data(b):U,T=!1,S="",D="";u={initialize:function(){if(y.hasClass("modal")||(u.create.modal(),z.isFunction(d.onHidden)||(d.onHidden=function(){u.destroy(),y.remove()})),y.addClass(d.class),""!==d.title&&y.find(f.title).html(u.helpers.escape(d.title,d.preserveHTML)).addClass(d.classTitle),""!==d.content&&y.find(f.content).html(u.helpers.escape(d.content,d.preserveHTML)).addClass(d.classContent),u.has.configActions()){var a=y.find(f.actions).addClass(d.classActions);0===a.length?a=z("
",{class:m.actions+" "+(d.classActions||"")}).appendTo(y):a.empty(),d.actions.forEach(function(e){var t=e[p.icon]?' ':"",n=u.helpers.escape(e[p.text]||"",d.preserveHTML),i=u.helpers.deQuote(e[p.class]||""),o=e[p.click]&&z.isFunction(e[p.click])?e[p.click]:function(){};a.append(z(" ",{html:t+n,class:m.button+" "+i,click:function(){!1!==o.call(w,y)&&u.hide()}}))})}u.cache={},u.verbose("Initializing dimmer",x),u.create.id(),u.create.dimmer(),d.allowMultiple&&u.create.innerDimmer(),d.centered||y.addClass("top aligned"),u.refreshModals(),u.bind.events(),d.observeChanges&&u.observeChanges(),u.instantiate(),d.autoShow&&u.show()},instantiate:function(){u.verbose("Storing instance of modal"),k=u,y.data(b,k)},create:{modal:function(){y=z("
",{class:m.modal}),d.closeIcon&&(C=z(" ",{class:m.close}),y.append(C)),""!==d.title&&z("
",{class:m.title}).appendTo(y),""!==d.content&&z("
",{class:m.content}).appendTo(y),u.has.configActions()&&z("
",{class:m.actions}).appendTo(y),x.append(y)},dimmer:function(){var e={debug:d.debug,dimmerName:"modals"},t=z.extend(!0,e,d.dimmerSettings);z.fn.dimmer!==U?(u.debug("Creating dimmer"),i=x.dimmer(t),d.detachable?(u.verbose("Modal is detachable, moving content into dimmer"),i.dimmer("add content",y)):u.set.undetached(),n=i.dimmer("get dimmer")):u.error(h.dimmer)},id:function(){l=(Math.random().toString(16)+"000000000").substr(2,8),t="."+l,u.verbose("Creating unique id for element",l)},innerDimmer:function(){0==y.find(f.dimmer).length&&y.prepend('
')}},destroy:function(){c&&c.disconnect(),u.verbose("Destroying previous modal"),y.removeData(b).off(v),F.off(t),n.off(t),C.off(v),x.dimmer("destroy")},observeChanges:function(){"MutationObserver"in N&&((c=new MutationObserver(function(e){u.debug("DOM tree modified, refreshing"),u.refresh()})).observe(w,{childList:!0,subtree:!0}),u.debug("Setting up mutation observer",c))},refresh:function(){u.remove.scrolling(),u.cacheSizes(),u.can.useFlex()||u.set.modalOffset(),u.set.screenHeight(),u.set.type()},refreshModals:function(){a=y.siblings(f.modal),o=a.add(y)},attachEvents:function(e,t){var n=z(e);t=z.isFunction(u[t])?u[t]:u.toggle,0=e.clientX))&&u.verbose("Mouse down event registered inside the scrollbar")},mouseup:function(e){if(d.closable)if(r)u.debug("Dimmer clicked but mouse down was initially registered inside the modal");else if(s)u.debug("Dimmer clicked but mouse down was initially registered inside the scrollbar");else{var t=0":">",'"':""","'":"'","`":"`"};return/[&<>"'`]/.test(e)?(e=e.replace(/&(?![a-z0-9#]{1,6};)/,"&")).replace(/[<>"'`]/g,function(e){return n[e]}):e}},can:{leftBodyScrollbar:function(){return u.cache.leftBodyScrollbar===U&&(u.cache.leftBodyScrollbar=u.is.rtl()&&(u.is.iframe&&!u.is.firefox()||u.is.safari()||u.is.edge()||u.is.ie())),u.cache.leftBodyScrollbar},useFlex:function(){return"auto"===d.useFlex?d.detachable&&!u.is.ie():(d.useFlex&&u.is.ie()?u.debug("useFlex true is not supported in IE"):d.useFlex&&!d.detachable&&u.debug("useFlex true in combination with detachable false is not supported"),d.useFlex)},fit:function(){var e=u.cache.contextHeight,t=u.cache.contextHeight/2,n=u.cache.topOffset,i=u.cache.scrollHeight,o=u.cache.height,a=d.padding;return o .header",content:"> .content",actions:"> .actions",close:"> .close",approve:".actions .positive, .actions .approve, .actions .ok",deny:".actions .negative, .actions .deny, .actions .cancel",modal:".ui.modal",dimmer:"> .ui.dimmer",bodyFixed:"> .ui.fixed.menu, > .ui.right.toast-container, > .ui.right.sidebar, > .ui.fixed.nag, > .ui.fixed.nag > .close",prompt:".ui.input > input"},error:{dimmer:"UI Dimmer, a required component is not included in this page",method:"The method you called is not defined.",notFound:"The element you specified could not be found"},className:{active:"active",animating:"animating",blurring:"blurring",inverted:"inverted",legacy:"legacy",loading:"loading",scrolling:"scrolling",undetached:"undetached",front:"front",close:"close icon",button:"ui button",modal:"ui modal",title:"header",content:"content",actions:"actions",template:"ui tiny modal",ok:"positive",cancel:"negative",prompt:"ui fluid input"},text:{ok:"Ok",cancel:"Cancel"}},z.fn.modal.settings.templates={getArguments:function(e){var t=[].slice.call(e);return z.isPlainObject(t[0])?z.extend({handler:function(){},content:"",title:""},t[0]):(z.isFunction(t[t.length-1])||t.push(function(){}),{handler:t.pop(),content:t.pop()||"",title:t.pop()||""})},alert:function(){var e=this.get.settings(),t=e.templates.getArguments(arguments);return{title:t.title,content:t.content,actions:[{text:e.text.ok,class:e.className.ok,click:t.handler}]}},confirm:function(){var e=this.get.settings(),t=e.templates.getArguments(arguments);return{title:t.title,content:t.content,actions:[{text:e.text.ok,class:e.className.ok,click:function(){t.handler(!0)}},{text:e.text.cancel,class:e.className.cancel,click:function(){t.handler(!1)}}]}},prompt:function(){var n=this,e=this.get.settings(),i=e.templates.getArguments(arguments);return 0===z(z.parseHTML(i.content)).filter(".ui.input").length&&(i.content+='
'),{title:i.title,content:i.content,actions:[{text:e.text.ok,class:e.className.ok,click:function(){var e=n.get.settings(),t=n.get.element().find(e.selector.prompt)[0];i.handler(z(t).val())}},{text:e.text.cancel,class:e.className.cancel,click:function(){i.handler(null)}}]}}}}(jQuery,window,document),function(x,C,w,k){"use strict";x.isFunction=x.isFunction||function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},C=void 0!==C&&C.Math==Math?C:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),x.fn.nag=function(f){var m,e=x(this),g=e.selector||"",p=(new Date).getTime(),h=[],v=f,b="string"==typeof v,y=[].slice.call(arguments,1);return e.each(function(){var i,s,o=x.isPlainObject(f)?x.extend(!0,{},x.fn.nag.settings,f):x.extend({},x.fn.nag.settings),e=o.selector,l=o.error,t=o.namespace,n="."+t,a=t+"-module",r=x(this),c=o.context?x(o.context):x("body"),u=this,d=r.data(a);s={initialize:function(){s.verbose("Initializing element"),i=s.get.storage(),r.on("click"+n,e.close,s.dismiss).data(a,s),o.detachable&&r.parent()[0]!==c[0]&&r.detach().prependTo(c),0 .close.icon"},duration:500,easing:"easeOutQuad",onShow:function(){},onVisible:function(){},onHide:function(){},onHidden:function(){}},x.extend(x.easing,{easeOutQuad:function(e,t,n,i,o){return-i*(t/=o)*(t-2)+n}})}(jQuery,window,document),function(L,V,q,z){"use strict";L.isFunction=L.isFunction||function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},V=void 0!==V&&V.Math==Math?V:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),L.fn.popup=function(T){var S,e=L(this),D=L(q),A=L(V),E=L("body"),F=e.selector||"",P="ontouchstart"in q.documentElement?"touchstart":"click",O=(new Date).getTime(),R=[],M=T,I="string"==typeof M,j=[].slice.call(arguments,1);return e.each(function(){var u,d,e,t,n,f,m=L.isPlainObject(T)?L.extend(!0,{},L.fn.popup.settings,T):L.extend({},L.fn.popup.settings),o=m.selector,g=m.className,p=m.error,h=m.metadata,i=m.namespace,a="."+m.namespace,r="module-"+i,v=L(this),s=L(m.context),l=L(m.scrollContext),b=L(m.boundary),y=m.target?L(m.target):v,x=0,c=!1,C=!1,w=this,k=v.data(r);f={initialize:function(){f.debug("Initializing",v),f.createID(),f.bind.events(),!f.exists()&&m.preserve&&f.create(),m.observeChanges&&f.observeChanges(),f.instantiate()},instantiate:function(){f.verbose("Storing instance",f),k=f,v.data(r,k)},observeChanges:function(){"MutationObserver"in V&&((e=new MutationObserver(f.event.documentChanged)).observe(q,{childList:!0,subtree:!0}),f.debug("Setting up mutation observer",e))},refresh:function(){m.popup?u=L(m.popup).eq(0):m.inline&&(u=y.nextAll(o.popup).eq(0),m.popup=u),m.popup?(u.addClass(g.loading),d=f.get.offsetParent(),u.removeClass(g.loading),m.movePopup&&f.has.popup()&&f.get.offsetParent(u)[0]!==d[0]&&(f.debug("Moving popup to the same offset parent as target"),u.detach().appendTo(d))):d=m.inline?f.get.offsetParent(y):f.has.popup()?f.get.offsetParent(u):E,d.is("html")&&d[0]!==E[0]&&(f.debug("Setting page as offset parent"),d=E),f.get.variation()&&f.set.variation()},reposition:function(){f.refresh(),f.set.position()},destroy:function(){f.debug("Destroying previous module"),e&&e.disconnect(),u&&!m.preserve&&f.removePopup(),clearTimeout(f.hideTimer),clearTimeout(f.showTimer),f.unbind.close(),f.unbind.events(),v.removeData(r)},event:{start:function(e){var t=L.isPlainObject(m.delay)?m.delay.show:m.delay;clearTimeout(f.hideTimer),(!C||C&&m.addTouchEvents)&&(f.showTimer=setTimeout(f.show,t))},end:function(){var e=L.isPlainObject(m.delay)?m.delay.hide:m.delay;clearTimeout(f.showTimer),f.hideTimer=setTimeout(f.hide,e)},touchstart:function(e){C=!0,m.addTouchEvents&&f.show()},resize:function(){f.is.visible()&&f.set.position()},documentChanged:function(e){[].forEach.call(e,function(e){e.removedNodes&&[].forEach.call(e.removedNodes,function(e){(e==w||0 ").addClass(g.popup).data(h.activator,v).html(e),m.inline?(f.verbose("Inserting popup element inline",u),u.insertAfter(v)):(f.verbose("Appending popup element to body",u),u.appendTo(s)),f.refresh(),f.set.variation(),m.hoverable&&f.bind.popup(),m.onCreate.call(u,w)):m.popup?(L(m.popup).data(h.activator,v),f.verbose("Used popup specified in settings"),f.refresh(),m.hoverable&&f.bind.popup()):0!==y.next(o.popup).length?(f.verbose("Pre-existing popup found"),m.inline=!0,m.popup=y.next(o.popup).data(h.activator,v),f.refresh(),m.hoverable&&f.bind.popup()):f.debug("No content specified skipping display",w)},createID:function(){n=(Math.random().toString(16)+"000000000").substr(2,8),t="."+n,f.verbose("Creating unique id for element",n)},toggle:function(){f.debug("Toggling pop-up"),f.is.hidden()?(f.debug("Popup is hidden, showing pop-up"),f.unbind.close(),f.show()):(f.debug("Popup is visible, hiding pop-up"),f.hide())},show:function(e){if(e=e||function(){},f.debug("Showing pop-up",m.transition),f.is.hidden()&&(!f.is.active()||!f.is.dropdown())){if(f.exists()||f.create(),!1===m.onShow.call(u,w))return void f.debug("onShow callback returned false, cancelling popup animation");m.preserve||m.popup||f.refresh(),u&&f.set.position()&&(f.save.conditions(),m.exclusive&&f.hideAll(),f.animate.show(e))}},hide:function(e){if(e=e||function(){},f.is.visible()||f.is.animating()){if(!1===m.onHide.call(u,w))return void f.debug("onHide callback returned false, cancelling popup animation");f.remove.visible(),f.unbind.close(),f.restore.conditions(),f.animate.hide(e)}},hideAll:function(){L(o.popup).filter("."+g.popupVisible).each(function(){L(this).data(h.activator).popup("hide")})},exists:function(){return!!u&&(m.inline||m.popup?f.has.popup():1<=u.closest(s).length)},removePopup:function(){f.has.popup()&&!m.popup&&(f.debug("Removing popup",u),u.remove(),u=z,m.onRemove.call(u,w))},save:{conditions:function(){f.cache={title:v.attr("title")},f.cache.title&&v.removeAttr("title"),f.verbose("Saving original attributes",f.cache.title)}},restore:{conditions:function(){return f.cache&&f.cache.title&&(v.attr("title",f.cache.title),f.verbose("Restoring original attributes",f.cache.title)),!0}},supports:{svg:function(){return"undefined"!=typeof SVGGraphicsElement}},animate:{show:function(e){e=L.isFunction(e)?e:function(){},m.transition&&L.fn.transition!==z&&v.transition("is supported")?(f.set.visible(),u.transition({animation:(m.transition.showMethod||m.transition)+" in",queue:!1,debug:m.debug,verbose:m.verbose,duration:m.transition.showDuration||m.duration,onComplete:function(){f.bind.close(),e.call(u,w),m.onVisible.call(u,w)}})):f.error(p.noTransition)},hide:function(e){e=L.isFunction(e)?e:function(){},f.debug("Hiding pop-up"),m.transition&&L.fn.transition!==z&&v.transition("is supported")?u.transition({animation:(m.transition.hideMethod||m.transition)+" out",queue:!1,duration:m.transition.hideDuration||m.duration,debug:m.debug,verbose:m.verbose,onComplete:function(){f.reset(),e.call(u,w),m.onHidden.call(u,w)}}):f.error(p.noTransition)}},change:{content:function(e){u.html(e)}},get:{html:function(){return v.removeData(h.html),v.data(h.html)||m.html},title:function(){return v.removeData(h.title),v.data(h.title)||m.title},content:function(){return v.removeData(h.content),v.data(h.content)||m.content||v.attr("title")},variation:function(){return v.removeData(h.variation),v.data(h.variation)||m.variation},popup:function(){return u},popupOffset:function(){return u.offset()},calculations:function(){var e,t=f.get.offsetParent(u),n=y[0],i=b[0]==V,o=y.offset(),a=m.inline||m.popup&&m.movePopup?y.offsetParent().offset():{top:0,left:0},r=i?{top:0,left:0}:b.offset(),s={},l=i?{top:A.scrollTop(),left:A.scrollLeft()}:{top:0,left:0};if(s={target:{element:y[0],width:y.outerWidth(),height:y.outerHeight(),top:o.top-a.top,left:o.left-a.left,margin:{}},popup:{width:u.outerWidth(),height:u.outerHeight()},parent:{width:d.outerWidth(),height:d.outerHeight()},screen:{top:r.top,left:r.left,scroll:{top:l.top,left:l.left},width:b.width(),height:b.height()}},t.get(0)!==d.get(0)){var c=t.offset();s.target.top-=c.top,s.target.left-=c.left,s.parent.width=t.outerWidth(),s.parent.height=t.outerHeight()}return m.setFluidWidth&&f.is.fluid()&&(s.container={width:u.parent().outerWidth()},s.popup.width=s.container.width),s.target.margin.top=m.inline?parseInt(V.getComputedStyle(n).getPropertyValue("margin-top"),10):0,s.target.margin.left=m.inline?f.is.rtl()?parseInt(V.getComputedStyle(n).getPropertyValue("margin-right"),10):parseInt(V.getComputedStyle(n).getPropertyValue("margin-left"),10):0,e=s.screen,s.boundary={top:e.top+e.scroll.top,bottom:e.top+e.scroll.top+e.height,left:e.left+e.scroll.left,right:e.left+e.scroll.left+e.width},s},id:function(){return n},startEvent:function(){return"hover"==m.on?"mouseenter":"focus"==m.on&&"focus"},scrollEvent:function(){return"scroll"},endEvent:function(){return"hover"==m.on?"mouseleave":"focus"==m.on&&"blur"},distanceFromBoundary:function(e,t){var n,i,o={};return n=(t=t||f.get.calculations()).popup,i=t.boundary,e&&(o={top:e.top-i.top,left:e.left-i.left,right:i.right-(e.left+n.width),bottom:i.bottom-(e.top+n.height)},f.verbose("Distance from boundaries determined",e,o)),o},offsetParent:function(e){var t=(e!==z?e[0]:y[0]).parentNode,n=L(t);if(t)for(var i="none"===n.css("transform"),o="static"===n.css("position"),a=n.is("body");t&&!a&&o&&i;)t=t.parentNode,i="none"===(n=L(t)).css("transform"),o="static"===n.css("position"),a=n.is("body");return n&&0",notFound:"The target or popup you specified does not exist on the page"},metadata:{activator:"activator",content:"content",html:"html",offset:"offset",position:"position",title:"title",variation:"variation"},className:{active:"active",basic:"basic",animating:"animating",dropdown:"dropdown",fluid:"fluid",loading:"loading",popup:"ui popup",position:"top left center bottom right",visible:"visible",popupVisible:"visible"},selector:{popup:".ui.popup"},templates:{escape:function(e){var t={"<":"<",">":">",'"':""","'":"'","`":"`"};return/[&<>"'`]/.test(e)?(e=e.replace(/&(?![a-z0-9#]{1,6};)/,"&")).replace(/[<>"'`]/g,function(e){return t[e]}):e},popup:function(e){var t="",n=L.fn.popup.settings.templates.escape;return typeof e!==z&&(typeof e.title!==z&&e.title&&(e.title=n(e.title),t+='"),typeof e.content!==z&&e.content&&(e.content=n(e.content),t+=''+e.content+"
")),t}}}}(jQuery,window,document),function(T,e,S,D){"use strict";T.isFunction=T.isFunction||function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},e=void 0!==e&&e.Math==Math?e:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),T.fn.progress=function(h){var v,e=T(this),b=e.selector||"",y=(new Date).getTime(),x=[],C=h,w="string"==typeof C,k=[].slice.call(arguments,1);return e.each(function(){var c,s=T.isPlainObject(h)?T.extend(!0,{},T.fn.progress.settings,h):T.extend({},T.fn.progress.settings),n=s.className,t=s.metadata,e=s.namespace,i=s.selector,l=s.error,o="."+e,a="module-"+e,u=T(this),d=T(this).find(i.bar),r=T(this).find(i.progress),f=T(this).find(i.label),m=this,g=u.data(a),p=!1;c={helper:{sum:function(e){return Array.isArray(e)?e.reduce(function(e,t){return e+Number(t)},0):0},derivePrecision:function(e,t){for(var n=0,i=1,o=e/t;n<10&&!(1<(o*=i));)i=Math.pow(10,n++);return i},forceArray:function(e){return Array.isArray(e)?e:isNaN(e)?"string"==typeof e?e.split(","):[]:[e]}},initialize:function(){c.set.duration(),c.set.transitionEvent(),c.debug(m),c.read.metadata(),c.read.settings(),c.instantiate()},instantiate:function(){c.verbose("Storing instance of progress",c),g=c,u.data(a,c)},destroy:function(){c.verbose("Destroying previous progress for",u),clearInterval(g.interval),c.remove.state(),u.removeData(a),g=D},reset:function(){c.remove.nextValue(),c.update.progress(0)},complete:function(e){(c.percent===D||c.percent<100)&&(c.remove.progressPoll(),!0!==e&&c.set.percent(100))},read:{metadata:function(){var e={percent:c.helper.forceArray(u.data(t.percent)),total:u.data(t.total),value:c.helper.forceArray(u.data(t.value))};e.total!==D&&(c.debug("Total value set from metadata",e.total),c.set.total(e.total)),0c.total)return c.debug("Value cannot increment above total",c.total),c.total}else if(100c.total)c.error(l.sumExceedsTotal,o,c.total);else if(!i&&100 .bar",label:"> .label",progress:".bar > .progress"},text:{active:!1,error:!1,success:!1,warning:!1,percent:"{percent}%",ratio:"{value} of {total}",bars:[""]},className:{active:"active",error:"error",success:"success",warning:"warning"}}}(jQuery,window,document),function(U,t,B,W){"use strict";t=void 0!==t&&t.Math==Math?t:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),U.fn.slider=function(O){var R,e=U(this),M=U(t),I=e.selector||"",j=(new Date).getTime(),L=[],V=O,q="string"==typeof V,z=[].slice.call(arguments,1),N=["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"],H=0;return e.each(function(){var m,s,l,e,g,r,t,c,p,h,v,u,n,d,f,b,y,x=U.isPlainObject(O)?U.extend(!0,{},U.fn.slider.settings,O):U.extend({},U.fn.slider.settings),i=x.className,o=x.metadata,a=x.namespace,C=x.error,w=x.keys,k=x.interpretLabel,T=!1,S="."+a,D="module-"+a,A=U(this),E=this,F=A.data(D),P=1;y={initialize:function(){y.debug("Initializing slider",x),b=!0,t=H+=1,n=y.setup.testOutTouch(),y.setup.layout(),y.setup.labels(),y.is.disabled()||y.bind.events(),y.read.metadata(),y.read.settings(),b=!1,y.instantiate()},instantiate:function(){y.verbose("Storing instance of slider",y),F=y,A.data(D,y)},destroy:function(){y.verbose("Destroying previous slider for",A),clearInterval(F.interval),y.unbind.events(),y.unbind.slidingEvents(),A.removeData(D),F=W},setup:{layout:function(){A.attr("tabindex")===W&&A.attr("tabindex",0),0==A.find(".inner").length&&A.append(""),u=y.get.precision(),s=A.find(".thumb:not(.second)"),m=s,y.is.range()&&(0==A.find(".thumb.second").length&&A.find(".inner").append("
"),l=A.find(".thumb.second")),e=A.find(".track"),g=A.find(".track-fill"),v=s.width()/2},labels:function(){y.is.labeled()&&(0!=(r=A.find(".labels:not(.auto)")).length?y.setup.customLabel():y.setup.autoLabel(),x.showLabelTicks&&A.addClass(i.ticked))},testOutTouch:function(){try{return B.createEvent("TouchEvent"),!0}catch(e){return!1}},customLabel:function(){var n,e=r.find(".label"),i=e.length,o=y.get.min(),a=y.get.max();e.each(function(e){var t=U(this).attr("data-value");n=t?((t=a').find(".labels");for(var e=0,t=y.get.numLabels();e<=t;e++){var n=y.get.label(e),i=""!==n?e%y.get.gapRatio()?U(' '):U(''+n+" "):null,o=e/t;i&&(y.update.labelPosition(o,i),r.append(i))}}},bind:{events:function(){y.bind.globalKeyboardEvents(),y.bind.keyboardEvents(),y.bind.mouseEvents(),y.is.touch()&&y.bind.touchEvents(),x.autoAdjustLabels&&y.bind.windowEvents()},keyboardEvents:function(){y.verbose("Binding keyboard events"),A.on("keydown"+S,y.event.keydown)},globalKeyboardEvents:function(){U(B).on("keydown"+S+t,y.event.activateFocus)},mouseEvents:function(){y.verbose("Binding mouse events"),A.find(".track, .thumb, .inner").on("mousedown"+S,function(e){e.stopImmediatePropagation(),e.preventDefault(),y.event.down(e)}),A.on("mousedown"+S,y.event.down),A.on("mouseenter"+S,function(e){T=!0}),A.on("mouseleave"+S,function(e){T=!1})},touchEvents:function(){y.verbose("Binding touch events"),A.find(".track, .thumb, .inner").on("touchstart"+S,function(e){e.stopImmediatePropagation(),e.preventDefault(),y.event.down(e)}),A.on("touchstart"+S,y.event.down)},slidingEvents:function(){y.verbose("Binding page wide events while handle is being draged"),y.is.touch()?(U(B).on("touchmove"+S,y.event.move),U(B).on("touchend"+S,y.event.up)):(U(B).on("mousemove"+S,y.event.move),U(B).on("mouseup"+S,y.event.up))},windowEvents:function(){M.on("resize"+S,y.event.resize)}},unbind:{events:function(){A.find(".track, .thumb, .inner").off("mousedown"+S),A.find(".track, .thumb, .inner").off("touchstart"+S),A.off("mousedown"+S),A.off("mouseenter"+S),A.off("mouseleave"+S),A.off("touchstart"+S),A.off("keydown"+S),A.off("focusout"+S),U(B).off("keydown"+S+t,y.event.activateFocus),M.off("resize"+S)},slidingEvents:function(){y.is.touch()?(U(B).off("touchmove"+S),U(B).off("touchend"+S)):(U(B).off("mousemove"+S),U(B).off("mouseup"+S))}},event:{down:function(e){if(e.preventDefault(),y.is.range()){var t=y.determine.eventPos(e),n=y.determine.pos(t);m=x.preventCrossover&&y.is.range()&&y.thumbVal===y.secondThumbVal?(f=n,W):y.determine.closestThumb(n),d===W&&(d=y.get.currentThumbValue())}else d===W&&(d=y.get.value());y.is.disabled()||y.bind.slidingEvents()},move:function(e){e.preventDefault();var t=y.determine.valueFromEvent(e);if(m===W){var n=y.determine.eventPos(e),i=y.determine.pos(n);m=iy.get.trackOffset()+y.get.trackLength()?y.is.reversed()?y.get.min():y.get.max():y.determine.value(n)},smoothValueFromEvent:function(e){var t,n=y.get.min(),i=y.get.max(),o=y.get.trackLength(),a=y.determine.eventPos(e)-y.get.trackOffset();return t=(a=a<0?0:o ',n++;return i}}}}(jQuery,window,document),function(F,P,O,R){"use strict";F.isFunction=F.isFunction||function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},P=void 0!==P&&P.Math==Math?P:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),F.fn.search=function(c){var C,w=F(this),k=w.selector||"",T=(new Date).getTime(),S=[],D=c,A="string"==typeof D,E=[].slice.call(arguments,1);return F(this).each(function(){var f,u=F.isPlainObject(c)?F.extend(!0,{},F.fn.search.settings,c):F.extend({},F.fn.search.settings),m=u.className,d=u.metadata,i=u.regExp,a=u.fields,g=u.selector,p=u.error,e=u.namespace,o="."+e,t=e+"-module",h=F(this),v=h.find(g.prompt),n=h.find(g.searchButton),r=h.find(g.results),s=h.find(g.result),b=(h.find(g.category),this),l=h.data(t),y=!1,x=!1;f={initialize:function(){f.verbose("Initializing module"),f.get.settings(),f.determine.searchFields(),f.bind.events(),f.set.type(),f.create.results(),f.instantiate()},instantiate:function(){f.verbose("Storing instance of module",f),l=f,h.data(t,f)},destroy:function(){f.verbose("Destroying instance"),h.off(o).removeData(t)},refresh:function(){f.debug("Refreshing selector cache"),v=h.find(g.prompt),n=h.find(g.searchButton),h.find(g.category),r=h.find(g.results),s=h.find(g.result)},refreshResults:function(){r=h.find(g.results),s=h.find(g.result)},bind:{events:function(){f.verbose("Binding events to search"),u.automatic&&(h.on(f.get.inputEvent()+o,g.prompt,f.event.input),v.attr("autocomplete",f.is.chrome()?"fomantic-search":"off")),h.on("focus"+o,g.prompt,f.event.focus).on("blur"+o,g.prompt,f.event.blur).on("keydown"+o,g.prompt,f.handleKeyboard).on("click"+o,g.searchButton,f.query).on("mousedown"+o,g.results,f.event.result.mousedown).on("mouseup"+o,g.results,f.event.result.mouseup).on("click"+o,g.result,f.event.result.click)}},determine:{searchFields:function(){c&&c.searchFields!==R&&(u.searchFields=c.searchFields)}},event:{input:function(){u.searchDelay?(clearTimeout(f.timer),f.timer=setTimeout(function(){f.is.focused()&&f.query()},u.searchDelay)):f.query()},focus:function(){f.set.focus(),u.searchOnFocus&&f.has.minimumCharacters()&&f.query(function(){f.can.show()&&f.showResults()})},blur:function(e){function t(){f.cancel.query(),f.remove.focus(),f.timer=setTimeout(f.hideResults,u.hideDelay)}var n=O.activeElement===this;n||(x=!1,f.resultsClicked?(f.debug("Determining if user action caused search to close"),h.one("click.close"+o,g.results,function(e){f.is.inMessage(e)||y?v.focus():(y=!1,f.is.animating()||f.is.hidden()||t())})):(f.debug("Input blurred without user action, closing results"),t()))},result:{mousedown:function(){f.resultsClicked=!0},mouseup:function(){f.resultsClicked=!1},click:function(e){f.debug("Search result selected");var t=F(this),n=t.find(g.title).eq(0),i=t.is("a[href]")?t:t.find("a[href]").eq(0),o=i.attr("href")||!1,a=i.attr("target")||!1,r=0=u.minCharacters},results:function(){return 0!==r.length&&""!=r.html()}},clear:{cache:function(e){var t=h.data(d.cache);e?e&&t&&t[e]&&(f.debug("Removing value from cache",e),delete t[e],h.data(d.cache,t)):(f.debug("Clearing cache",e),h.removeData(d.cache))}},read:{cache:function(e){var t=h.data(d.cache);return!!u.cache&&(f.verbose("Checking cache for generated html for query",e),"object"==typeof t&&t[e]!==R&&t[e])}},create:{categoryResults:function(e){var n={};return F.each(e,function(e,t){t.category&&(n[t.category]===R?(f.verbose("Creating new category of results",t.category),n[t.category]={name:t.category,results:[t]}):n[t.category].results.push(t))}),n},id:function(e,t){var n,i=e+1;return t!==R?(n=String.fromCharCode(97+t)+i,f.verbose("Creating category result id",n)):(n=i,f.verbose("Creating result id",n)),n},results:function(){0===r.length&&(r=F("
").addClass(m.results).appendTo(h))}},inject:{result:function(e,t,n){f.verbose("Injecting result into results");var i=n!==R?r.children().eq(n).children(g.results).first().children(g.result).eq(t):r.children(g.result).eq(t);f.verbose("Injecting results metadata",i),i.data(d.result,e)},id:function(e){f.debug("Injecting unique ids into results");var n=0,i=0;return"category"===u.type?F.each(e,function(e,t){0 as a polyfill.'},metadata:{cache:"cache",results:"results",result:"result"},regExp:{escape:/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g,beginsWith:"(?:s|^)"},fields:{categories:"results",categoryName:"name",categoryResults:"results",description:"description",image:"image",price:"price",results:"results",title:"title",url:"url",action:"action",actionText:"text",actionURL:"url"},selector:{prompt:".prompt",searchButton:".search.button",results:".results",message:".results > .message",category:".category",result:".result",title:".title, .name"},templates:{escape:function(e,t){if(t)return e;var n={"<":"<",">":">",'"':""","'":"'","`":"`"};return/[&<>"'`]/.test(e)?(e=e.replace(/&(?![a-z0-9#]{1,6};)/,"&")).replace(/[<>"'`]/g,function(e){return n[e]}):e},message:function(e,t,n){var i="";return e!==R&&t!==R&&(i+='',n&&(i+='"),i+='
'+e+"
",i+="
"),i},category:function(e,n,i){var o="",a=F.fn.search.settings.templates.escape;return e[n.categoryResults]!==R&&(F.each(e[n.categoryResults],function(e,t){t[n.results]!==R&&0',t[n.categoryName]!==R&&(o+=''+a(t[n.categoryName],i)+"
"),o+='',F.each(t.results,function(e,t){t[n.url]?o+='
':o+=' ',t[n.image]!==R&&(o+=''),o+='',t[n.price]!==R&&(o+='
'+a(t[n.price],i)+"
"),t[n.title]!==R&&(o+='
'+a(t[n.title],i)+"
"),t[n.description]!==R&&(o+='
'+a(t[n.description],i)+"
"),o+="
",o+=" "}),o+="
",o+="")}),e[n.action]&&(!1===n.actionURL?o+=''+a(e[n.action][n.actionText],i)+"
":o+=''+a(e[n.action][n.actionText],i)+" "),o)},standard:function(e,n,i){var o="",a=F.fn.search.settings.templates.escape;return e[n.results]!==R&&(F.each(e[n.results],function(e,t){t[n.url]?o+='':o+=' ',t[n.image]!==R&&(o+=''),o+='',t[n.price]!==R&&(o+='
'+a(t[n.price],i)+"
"),t[n.title]!==R&&(o+='
'+a(t[n.title],i)+"
"),t[n.description]!==R&&(o+='
'+a(t[n.description],i)+"
"),o+="
",o+=" "}),e[n.action]&&(!1===n.actionURL?o+=''+a(e[n.action][n.actionText],i)+"
":o+=''+a(e[n.action][n.actionText],i)+" "),o)}}}}(jQuery,window,document),function(A,e,E,F){"use strict";A.isFunction=A.isFunction||function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},e=void 0!==e&&e.Math==Math?e:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),A.fn.shape=function(b){var y,x=A(this),C=(new Date).getTime(),w=[],k=b,T="string"==typeof k,S=[].slice.call(arguments,1),D=e.requestAnimationFrame||e.mozRequestAnimationFrame||e.webkitRequestAnimationFrame||e.msRequestAnimationFrame||function(e){setTimeout(e,0)};return x.each(function(){var i,o,r,t=x.selector||"",s=A.isPlainObject(b)?A.extend(!0,{},A.fn.shape.settings,b):A.extend({},A.fn.shape.settings),e=s.namespace,l=s.selector,n=s.error,c=s.className,a="."+e,u="module-"+e,d=A(this),f=d.find(">"+l.sides),m=f.find(">"+l.side),g=!1,p=this,h=d.data(u);if(r={initialize:function(){r.verbose("Initializing module for",p),r.set.defaultSide(),r.instantiate()},instantiate:function(){r.verbose("Storing instance of module",r),h=r,d.data(u,h)},destroy:function(){r.verbose("Destroying previous module for",p),d.removeData(u).off(a)},refresh:function(){r.verbose("Refreshing selector cache for",p),d=A(p),f=A(this).find(l.sides),m=A(this).find(l.side)},repaint:function(){r.verbose("Forcing repaint event");(f[0]||E.createElement("div")).offsetWidth},animate:function(e,t){r.verbose("Animating box with properties",e),t=t||function(e){r.verbose("Executing animation callback"),e!==F&&e.stopPropagation(),r.reset(),r.set.active()},s.beforeChange.call(o[0]),r.get.transitionEvent()?(r.verbose("Starting CSS animation"),d.addClass(c.animating),f.css(e).one(r.get.transitionEvent(),t),r.set.duration(s.duration),D(function(){d.addClass(c.animating),i.addClass(c.hidden)})):t()},queue:function(e){r.debug("Queueing animation of",e),f.one(r.get.transitionEvent(),function(){r.debug("Executing queued animation"),setTimeout(function(){d.shape(e)},0)})},reset:function(){r.verbose("Animating states reset"),d.removeClass(c.animating).attr("style","").removeAttr("style"),f.attr("style","").removeAttr("style"),m.attr("style","").removeAttr("style").removeClass(c.hidden),o.removeClass(c.animating).attr("style","").removeAttr("style")},is:{complete:function(){return m.filter("."+c.active)[0]==o[0]},animating:function(){return d.hasClass(c.animating)},hidden:function(){return 0"+l.sides+">"+l.side),n=t.filter("."+s.className.active),i=g?t.eq(g):0=b.scrollHeight&&(b.scrollTop=b.scrollHeight-b.offsetHeight-1)},scroll:function(e){0===M(e.target).closest(n.sidebar).length&&e.preventDefault()}},bind:{clickaway:function(){c.verbose("Adding clickaway events to context",p),p.on("click"+s,c.event.clickaway).on("touchend"+s,c.event.clickaway)},scrollLock:function(){u.scrollLock&&(c.debug("Disabling page scroll"),w.on("DOMMouseScroll"+s,c.event.scroll)),c.verbose("Adding events to contain sidebar scroll"),k.on("touchmove"+s,c.event.touch),g.on("scroll"+f,c.event.containScroll)}},unbind:{clickaway:function(){c.verbose("Removing clickaway events from context",p),p.off(s)},scrollLock:function(){c.verbose("Removing scroll lock from page"),k.off(s),w.off(s),g.off("scroll"+f)}},add:{inlineCSS:function(){var e,t=c.cache.width||g.outerWidth(),n=c.cache.height||g.outerHeight(),i=c.is.rtl(),o=c.get.direction(),a={left:t,right:-t,top:n,bottom:-n};i&&(c.verbose("RTL detected, flipping widths"),a.left=-t,a.right=t),e="").appendTo(S),c.debug("Adding sizing css to head",r)}},refresh:function(){c.verbose("Refreshing selector cache"),p=M(u.context),h=p.children(n.sidebar),v=p.children(n.pusher),p.children(n.fixed),c.clear.cache()},refreshSidebars:function(){c.verbose("Refreshing other sidebars"),h=p.children(n.sidebar)},repaint:function(){c.verbose("Forcing repaint event"),b.style.display="none";b.offsetHeight;b.scrollTop=b.scrollTop,b.style.display=""},setup:{cache:function(){c.cache={width:g.outerWidth(),height:g.outerHeight()}},layout:function(){0===p.children(n.pusher).length&&(c.debug("Adding wrapper element for sidebar"),c.error(d.pusher),v=M('
'),p.children().not(n.omitted).not(h).wrapAll(v),c.refresh()),0!==g.nextAll(n.pusher).length&&g.nextAll(n.pusher)[0]===v[0]||(c.debug("Moved sidebar to correct parent element"),c.error(d.movedSidebar,b),g.detach().prependTo(p),c.refresh()),c.clear.cache(),c.set.pushable(),c.set.direction()}},attachEvents:function(e,t){var n=M(e);t=M.isFunction(c[t])?c[t]:c.toggle,0d.cache.context.height)return d.reset(),void d.error(r.elementSize,c)},bind:{events:function(){u.on("load"+s,d.event.load).on("resize"+s,d.event.resize),m.off("scroll"+s).on("scroll"+s,d.event.scroll).on("scrollchange"+s,d.event.scrollchange)}},event:{changed:function(e){clearTimeout(d.timer),d.timer=setTimeout(function(){d.verbose("DOM tree modified, updating sticky menu",e),d.refresh()},100)},documentChanged:function(e){[].forEach.call(e,function(e){e.removedNodes&&[].forEach.call(e.removedNodes,function(e){(e==h||0");return e.addClass(o.supported),e.css("position").match("sticky")}},save:{lastScroll:function(e){d.lastScroll=e},elementScroll:function(e){d.elementScroll=e},positions:function(){var e={height:m.height()},t={margin:{top:parseInt(c.css("margin-top"),10),bottom:parseInt(c.css("margin-bottom"),10)},offset:c.offset(),width:c.outerWidth(),height:c.outerHeight()},n={offset:i.offset(),height:i.outerHeight()};d.is.standardScroll()||(d.debug("Non-standard scroll. Removing scroll offset from element offset"),e.top=m.scrollTop(),e.left=m.scrollLeft(),t.offset.top+=e.top,n.offset.top+=e.top,t.offset.left+=e.left,n.offset.left+=e.left),d.cache={fits:t.height+f.offset<=e.height,sameHeight:t.height==n.height,scrollContext:{height:e.height},element:{margin:t.margin,top:t.offset.top-t.margin.top,left:t.offset.left,width:t.width,height:t.height,bottom:t.offset.top+t.height},context:{top:n.offset.top,height:n.height,bottom:n.offset.top+n.height}},d.set.containerSize(),d.stick(),d.debug("Caching element positions",d.cache)}},get:{direction:function(e){var t="down";return e=e||m.scrollTop(),d.lastScroll!==E&&(d.lastScrolle&&(t="up")),t},scrollChange:function(e){return e=e||m.scrollTop(),d.lastScroll?e-d.lastScroll:0},currentElementScroll:function(){return d.elementScroll?d.elementScroll:d.is.top()?Math.abs(parseInt(c.css("top"),10))||0:Math.abs(parseInt(c.css("bottom"),10))||0},elementScroll:function(e){e=e||m.scrollTop();var t=d.cache.element,n=d.cache.scrollContext,i=d.get.scrollChange(e),o=t.height-n.height+f.offset,a=d.get.currentElementScroll(),r=a+i;return a=d.cache.fits||r<0?0:of.jitter&&(d.debug("Context has padding, specifying exact height for container",d.cache.context.height),t.css({height:d.cache.context.height}))},minimumSize:function(){var e=d.cache.element;t.css("min-height",e.height)},scroll:function(e){d.debug("Setting scroll on element",e),d.elementScroll!=e&&(d.is.top()&&c.css("bottom","").css("top",-e),d.is.bottom()&&c.css("top","").css("bottom",e))},size:function(){0!==d.cache.element.height&&0!==d.cache.element.width&&(h.style.setProperty("width",d.cache.element.width+"px","important"),h.style.setProperty("height",d.cache.element.height+"px","important"))}},is:{standardScroll:function(){return m[0]==D},top:function(){return c.hasClass(o.top)},bottom:function(){return c.hasClass(o.bottom)},initialPosition:function(){return!d.is.fixed()&&!d.is.bound()},hidden:function(){return!c.is(":visible")},bound:function(){return c.hasClass(o.bound)},fixed:function(){return c.hasClass(o.fixed)}},stick:function(e){var t=e||m.scrollTop(),n=d.cache,i=n.fits,o=n.sameHeight,a=n.element,r=n.scrollContext,s=n.context,l=d.is.bottom()&&f.pushing?f.bottomOffset:f.offset,c=(e={top:t+l,bottom:t+l+r.height},i?0:d.get.elementScroll(e.top)),u=!i;0===a.height||o||(d.is.initialPosition()?e.top>=s.bottom?(d.debug("Initial element position is bottom of container"),d.bindBottom()):e.top>a.top&&(a.height+e.top-c>=s.bottom?(d.debug("Initial element position is bottom of container"),d.bindBottom()):(d.debug("Initial element position is fixed"),d.fixTop())):d.is.fixed()?d.is.top()?e.top<=a.top?(d.debug("Fixed element reached top of container"),d.setInitialPosition()):a.height+e.top-c>=s.bottom?(d.debug("Fixed element reached bottom of container"),d.bindBottom()):u&&(d.set.scroll(c),d.save.lastScroll(e.top),d.save.elementScroll(c)):d.is.bottom()&&(e.bottom-a.height<=a.top?(d.debug("Bottom fixed rail has reached top of container"),d.setInitialPosition()):e.bottom>=s.bottom?(d.debug("Bottom fixed rail has reached bottom of container"),d.bindBottom()):u&&(d.set.scroll(c),d.save.lastScroll(e.top),d.save.elementScroll(c))):d.is.bottom()&&(e.top<=a.top?(d.debug("Jumped from bottom fixed to top fixed, most likely used home/end button"),d.setInitialPosition()):f.pushing?d.is.bound()&&e.bottom<=s.bottom&&(d.debug("Fixing bottom attached element to bottom of browser."),d.fixBottom()):d.is.bound()&&e.top<=s.bottom-a.height&&(d.debug("Fixing bottom attached element to top of browser."),d.fixTop())))},bindTop:function(){d.debug("Binding element to top of parent container"),d.remove.offset(),c.css({left:"",top:"",marginBottom:""}).removeClass(o.fixed).removeClass(o.bottom).addClass(o.bound).addClass(o.top),f.onTop.call(h),f.onUnstick.call(h)},bindBottom:function(){d.debug("Binding element to bottom of parent container"),d.remove.offset(),c.css({left:"",top:""}).removeClass(o.fixed).removeClass(o.top).addClass(o.bound).addClass(o.bottom),f.onBottom.call(h),f.onUnstick.call(h)},setInitialPosition:function(){d.debug("Returning to initial position"),d.unfix(),d.unbind()},fixTop:function(){d.debug("Fixing element to top of page"),f.setSize&&d.set.size(),d.set.minimumSize(),d.set.offset(),c.css({left:d.cache.element.left,bottom:"",marginBottom:""}).removeClass(o.bound).removeClass(o.bottom).addClass(o.fixed).addClass(o.top),f.onStick.call(h)},fixBottom:function(){d.debug("Sticking element to bottom of page"),f.setSize&&d.set.size(),d.set.minimumSize(),d.set.offset(),c.css({left:d.cache.element.left,bottom:"",marginBottom:""}).removeClass(o.bound).removeClass(o.top).addClass(o.fixed).addClass(o.bottom),f.onStick.call(h)},unbind:function(){d.is.bound()&&(d.debug("Removing container bound position on element"),d.remove.offset(),c.removeClass(o.bound).removeClass(o.top).removeClass(o.bottom))},unfix:function(){d.is.fixed()&&(d.debug("Removing fixed position on element"),d.remove.minimumSize(),d.remove.offset(),c.removeClass(o.fixed).removeClass(o.top).removeClass(o.bottom),f.onUnstick.call(h))},reset:function(){d.debug("Resetting elements position"),d.unbind(),d.unfix(),d.resetCSS(),d.remove.offset(),d.remove.lastScroll()},resetCSS:function(){c.css({width:"",height:""}),t.css({height:""})},setting:function(e,t){if(S.isPlainObject(e))S.extend(!0,f,e);else{if(t===E)return f[e];f[e]=t}},internal:function(e,t){if(S.isPlainObject(e))S.extend(!0,d,e);else{if(t===E)return d[e];d[e]=t}},debug:function(){!f.silent&&f.debug&&(f.performance?d.performance.log(arguments):(d.debug=Function.prototype.bind.call(console.info,console,f.name+":"),d.debug.apply(console,arguments)))},verbose:function(){!f.silent&&f.verbose&&f.debug&&(f.performance?d.performance.log(arguments):(d.verbose=Function.prototype.bind.call(console.info,console,f.name+":"),d.verbose.apply(console,arguments)))},error:function(){f.silent||(d.error=Function.prototype.bind.call(console.error,console,f.name+":"),d.error.apply(console,arguments))},performance:{log:function(e){var t,n;f.performance&&(n=(t=(new Date).getTime())-(x||t),x=t,C.push({Name:e[0],Arguments:[].slice.call(e,1)||"",Element:h,"Execution Time":n})),clearTimeout(d.performance.timer),d.performance.timer=setTimeout(d.performance.display,0)},display:function(){var e=f.name+":",n=0;x=!1,clearTimeout(d.performance.timer),S.each(C,function(e,t){n+=t["Execution Time"]}),e+=" "+n+"ms",y&&(e+=" '"+y+"'"),(console.group!==E||console.table!==E)&&0"},regExp:{escape:/[-[\]{}()*+?.,\\^$|#\s:=@]/g},metadata:{tab:"tab",loaded:"loaded",promise:"promise"},className:{loading:"loading",active:"active"},selector:{tabs:".ui.tab",ui:".ui"}}}(jQuery,window,document),function(F,e,t,P){"use strict";F.isFunction=F.isFunction||function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},e=void 0!==e&&e.Math==Math?e:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),F.fn.toast=function(C){var w,e=F(this),k=e.selector||"",T=(new Date).getTime(),S=[],D=C,A="string"==typeof D,E=[].slice.call(arguments,1);return e.each(function(){var i,o,a,r,s,l,c,u,d=F.isPlainObject(C)?F.extend(!0,{},F.fn.toast.settings,C):F.extend({},F.fn.toast.settings),f=d.className,m=d.selector,g=d.error,e=d.namespace,p=d.fields,t="."+e,n=e+"-module",h=F(this),v=d.context?F(d.context):F("body"),b=h.hasClass("toast")||h.hasClass("message")||h.hasClass("card"),y=this,x=b?h.data(n):P;u={initialize:function(){u.verbose("Initializing element"),u.has.container()||u.create.container(),(b||""!==d.message||""!==d.title||""!==u.get.iconClass()||d.showImage||u.has.configActions())&&("string"==typeof d.showProgress&&-1!==[f.top,f.bottom].indexOf(d.showProgress)||(d.showProgress=!1),u.create.toast(),d.closeOnClick&&(d.closeIcon||0 ",{class:d.position+" "+f.container+" "+(d.horizontal?f.horizontal:"")}))},toast:function(){i=F("
",{class:f.box});var e=u.get.iconClass();if(b)o=d.cloneModule?h.clone().removeAttr("id"):h,c=o.find("> i"+u.helpers.toClass(f.close)),d.closeIcon=0 ");var t=F("
",{class:f.content});""!==e&&o.append(F(" ",{class:e+" "+f.icon})),d.showImage&&o.append(F(" ",{class:f.image+" "+d.classImage,src:d.showImage})),""!==d.title&&t.append(F("
",{class:f.title,text:d.title})),t.append(F("
",{class:f.message,html:u.helpers.escape(d.message,d.preserveHTML)})),o.addClass(d.class+" "+f.toast).append(t),o.css("opacity",d.opacity),d.closeIcon&&((c=F(" ",{class:f.close+" "+("string"==typeof d.closeIcon?d.closeIcon:"")})).hasClass(f.left)?o.prepend(c):o.append(c))}if(o.hasClass(f.compact)&&(d.compact=!0),o.hasClass("card")&&(d.compact=!1),a=o.find(".actions"),u.has.configActions()&&(0===a.length&&(a=F("
",{class:f.actions+" "+(d.classActions||"")}).appendTo(o)),o.hasClass("card")&&!a.hasClass(f.attached)&&(a.addClass(f.extraContent),a.hasClass(f.vertical)&&(a.removeClass(f.vertical),u.error(g.verticalCard))),d.actions.forEach(function(e){var t=e[p.icon]?' ':"",n=u.helpers.escape(e[p.text]||"",d.preserveHTML),i=u.helpers.deQuote(e[p.class]||""),o=e[p.click]&&F.isFunction(e[p.click])?e[p.click]:function(){};a.append(F(" ",{html:t+n,class:f.button+" "+i,click:function(){!1!==o.call(y,h)&&u.close()}}))})),a&&a.hasClass(f.vertical)&&o.addClass(f.vertical),0 ",{class:f.vertical+" "+f.attached+" "+(d.compact?f.compact:"")})),a.hasClass(f.left)?o.addClass(f.left).parent().addClass(f.left).prepend(a):o.parent().append(a)):a.hasClass(f.top)?(i.prepend(a),o.addClass(f.bottom)):(i.append(a),o.addClass(f.top))),h!==o&&(y=(h=o)[0]),0 ",{class:f.progress+" "+(d.classProgress||d.class),"data-percent":""}),d.classProgress||(o.hasClass("toast")&&!o.hasClass(f.inverted)?r.addClass(f.inverted):r.removeClass(f.inverted)),s=F("
",{class:"bar "+(d.progressUp?"up ":"down ")+n}),r.addClass(d.showProgress).append(s),r.hasClass(f.top)?i.prepend(r):i.append(r),s.css("animation-duration",d.displayTime/1e3+"s")),(l=F(" ",{class:"wait "+n})).css("animation-duration",d.displayTime/1e3+"s"),l.appendTo(o)}d.compact&&(i.addClass(f.compact),o.addClass(f.compact),r&&r.addClass(f.compact)),d.newestOnTop?i.prependTo(u.get.container()):i.appendTo(u.get.container())}},bind:{events:function(){u.debug("Binding events to toast"),(d.closeOnClick||d.closeIcon)&&(d.closeIcon?c:o).on("click"+t,u.event.click),l&&l.on("animationend"+t,u.close),i.on("click"+t,m.approve,u.event.approve).on("click"+t,m.deny,u.event.deny)}},unbind:{events:function(){u.debug("Unbinding events to toast"),(d.closeOnClick||d.closeIcon)&&(d.closeIcon?c:o).off("click"+t),l&&l.off("animationend"+t),i.off("click"+t)}},animate:{show:function(e){e=F.isFunction(e)?e:function(){},d.transition&&u.can.useElement("transition")&&h.transition("is supported")&&(u.set.visible(),i.transition({animation:d.transition.showMethod+" in",queue:!1,debug:d.debug,verbose:d.verbose,duration:d.transition.showDuration,onComplete:function(){e.call(i,y),d.onVisible.call(i,y)}}))},close:function(e){e=F.isFunction(e)?e:function(){},u.debug("Closing toast"),!1!==d.onHide.call(i,y)?d.transition&&F.fn.transition!==P&&h.transition("is supported")?i.transition({animation:d.transition.hideMethod+" out",queue:!1,duration:d.transition.hideDuration,debug:d.debug,verbose:d.verbose,interval:50,onBeforeHide:function(e){e=F.isFunction(e)?e:function(){},""!==d.transition.closeEasing?i&&(i.css("opacity",0),i.wrap("
").parent().hide(d.transition.closeDuration,d.transition.closeEasing,function(){i&&(i.parent().remove(),e.call(i))})):e.call(i)},onComplete:function(){e.call(i,y),d.onHidden.call(i,y),u.destroy()}}):u.error(g.noTransition):u.debug("onHide callback returned false, cancelling toast animation")},pause:function(){l.css("animationPlayState","paused"),s&&s.css("animationPlayState","paused")},continue:function(){l.css("animationPlayState","running"),s&&s.css("animationPlayState","running")}},has:{container:function(){return u.verbose("Determining if there is already a container"),0":">",'"':""","'":"'","`":"`"};return/[&<>"'`]/.test(e)?(e=e.replace(/&(?![a-z0-9#]{1,6};)/,"&")).replace(/[<>"'`]/g,function(e){return n[e]}):e}},can:{useElement:function(e){return F.fn[e]!==P||(u.error(g.noElement.replace("{element}",e)),!1)}},setting:function(e,t){if(u.debug("Changing setting",e,t),F.isPlainObject(e))F.extend(!0,d,e);else{if(t===P)return d[e];F.isPlainObject(d[e])?F.extend(!0,d[e],t):d[e]=t}},internal:function(e,t){if(F.isPlainObject(e))F.extend(!0,u,e);else{if(t===P)return u[e];u[e]=t}},debug:function(){!d.silent&&d.debug&&(d.performance?u.performance.log(arguments):(u.debug=Function.prototype.bind.call(console.info,console,d.name+":"),u.debug.apply(console,arguments)))},verbose:function(){!d.silent&&d.verbose&&d.debug&&(d.performance?u.performance.log(arguments):(u.verbose=Function.prototype.bind.call(console.info,console,d.name+":"),u.verbose.apply(console,arguments)))},error:function(){d.silent||(u.error=Function.prototype.bind.call(console.error,console,d.name+":"),u.error.apply(console,arguments))},performance:{log:function(e){var t,n;d.performance&&(n=(t=(new Date).getTime())-(T||t),T=t,S.push({Name:e[0],Arguments:[].slice.call(e,1)||"",Element:y,"Execution Time":n})),clearTimeout(u.performance.timer),u.performance.timer=setTimeout(u.performance.display,500)},display:function(){var e=d.name+":",n=0;T=!1,clearTimeout(u.performance.timer),F.each(S,function(e,t){n+=t["Execution Time"]}),e+=" "+n+"ms",k&&(e+=" '"+k+"'"),(console.group!==P||console.table!==P)&&0 img.image, > .image > img",icon:"> i.icon",input:'input:not([type="hidden"]), textarea, select, button, .ui.button, ui.dropdown',approve:".actions .positive, .actions .approve, .actions .ok",deny:".actions .negative, .actions .deny, .actions .cancel"},fields:{class:"class",text:"text",icon:"icon",click:"click"},onShow:function(){},onVisible:function(){},onClick:function(){},onHide:function(){},onHidden:function(){},onRemove:function(){},onApprove:function(){},onDeny:function(){}},F.extend(F.easing,{easeOutBounce:function(e,t,n,i,o){return(t/=o)<1/2.75?i*(7.5625*t*t)+n:t<2/2.75?i*(7.5625*(t-=1.5/2.75)*t+.75)+n:t<2.5/2.75?i*(7.5625*(t-=2.25/2.75)*t+.9375)+n:i*(7.5625*(t-=2.625/2.75)*t+.984375)+n},easeOutCubic:function(e){return--e*e*e+1}})}(jQuery,window,document),function(C,e,w,k){"use strict";C.isFunction=C.isFunction||function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},e=void 0!==e&&e.Math==Math?e:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")(),C.fn.transition=function(){var c,r=C(this),g=r.selector||"",p=(new Date).getTime(),h=[],v=arguments,b=v[0],y=[].slice.call(arguments,1),x="string"==typeof b;return r.each(function(i){var u,s,t,d,n,o,e,a,f,m=C(this),l=this;(f={initialize:function(){u=f.get.settings.apply(l,v),d=u.className,t=u.error,n=u.metadata,a="."+u.namespace,e="module-"+u.namespace,s=m.data(e)||f,o=f.get.animationEndEvent(),!1===(x=x&&f.invoke(b))&&(f.verbose("Converted arguments into settings object",u),u.interval?f.delay(u.animate):f.animate(),f.instantiate())},instantiate:function(){f.verbose("Storing instance of module",f),s=f,m.data(e,s)},destroy:function(){f.verbose("Destroying previous module for",l),m.removeData(e)},refresh:function(){f.verbose("Refreshing display type on next animation"),delete f.displayType},forceRepaint:function(){f.verbose("Forcing element repaint");var e=m.parent(),t=m.next();0===t.length?m.detach().appendTo(e):m.detach().insertBefore(t)},repaint:function(){f.verbose("Repainting element");l.offsetWidth},delay:function(e){var t,n=f.get.animationDirection();n=n||(f.can.transition()?f.get.direction():"static"),e=e!==k?e:u.interval,t="auto"==u.reverse&&n==d.outward||1==u.reverse?(r.length-i)*u.interval:i*u.interval,f.debug("Delaying animation by",t),setTimeout(f.animate,t)},animate:function(e){if(u=e||u,!f.is.supported())return f.error(t.support),!1;if(f.debug("Preparing animation",u.animation),f.is.animating()){if(u.queue)return!u.allowRepeats&&f.has.direction()&&f.is.occurring()&&!0!==f.queuing?f.debug("Animation is currently occurring, preventing queueing same animation",u.animation):f.queue(u.animation),!1;if(!u.allowRepeats&&f.is.occurring())return f.debug("Animation is already occurring, will not execute repeated animation",u.animation),!1;f.debug("New animation started, completing previous early",u.animation),s.complete()}f.can.animate()?f.set.animating(u.animation):f.error(t.noAnimation,u.animation,l)},reset:function(){f.debug("Resetting animation to beginning conditions"),f.remove.animationCallbacks(),f.restore.conditions(),f.remove.animating()},queue:function(e){f.debug("Queueing animation of",e),f.queuing=!0,m.one(o+".queue"+a,function(){f.queuing=!1,f.repaint(),f.animate.apply(this,u)})},complete:function(e){e&&e.target===l&&e.stopPropagation(),f.debug("Animation complete",u.animation),f.remove.completeCallback(),f.remove.failSafe(),f.is.looping()||(f.is.outward()?(f.verbose("Animation is outward, hiding element"),f.restore.conditions(),f.hide()):f.is.inward()?(f.verbose("Animation is outward, showing element"),f.restore.conditions(),f.show()):(f.verbose("Static animation completed"),f.restore.conditions(),u.onComplete.call(l)))},force:{visible:function(){var e=m.attr("style"),t=f.get.userStyle(e),n=f.get.displayType(),i=t+"display: "+n+" !important;",o=m[0].style.display;return!n||"none"===o&&u.skipInlineHidden||m[0].tagName.match(/(script|link|style)/i)?(f.remove.transition(),!1):(f.verbose("Overriding default display to show element",n),m.attr("style",i),!0)},hidden:function(){var e=m.attr("style"),t=m.css("display"),n=e===k||""===e;"none"===t||f.is.hidden()?n&&m.removeAttr("style"):(f.verbose("Overriding default display to hide element"),m.css("display","none"))}},has:{direction:function(e){var n=!1;return"string"==typeof(e=e||u.animation)&&(e=e.split(" "),C.each(e,function(e,t){t!==d.inward&&t!==d.outward||(n=!0)})),n},inlineDisplay:function(){var e=m.attr("style")||"";return Array.isArray(e.match(/display.*?;/,""))}},set:{animating:function(e){f.remove.completeCallback(),e=e||u.animation;var t=f.get.animationClass(e);f.save.animation(t),f.force.visible()&&(f.remove.hidden(),f.remove.direction(),f.start.animation(t))},duration:function(e,t){!(t="number"==typeof(t=t||u.duration)?t+"ms":t)&&0!==t||(f.verbose("Setting animation duration",t),m.css({"animation-duration":t}))},direction:function(e){(e=e||f.get.direction())==d.inward?f.set.inward():f.set.outward()},looping:function(){f.debug("Transition set to loop"),m.addClass(d.looping)},hidden:function(){m.addClass(d.transition).addClass(d.hidden)},inward:function(){f.debug("Setting direction to inward"),m.removeClass(d.outward).addClass(d.inward)},outward:function(){f.debug("Setting direction to outward"),m.removeClass(d.inward).addClass(d.outward)},visible:function(){m.addClass(d.transition).addClass(d.visible)}},start:{animation:function(e){e=e||f.get.animationClass(),f.debug("Starting tween",e),m.addClass(e).one(o+".complete"+a,f.complete),u.useFailSafe&&f.add.failSafe(),f.set.duration(u.duration),u.onStart.call(l)}},save:{animation:function(e){f.cache||(f.cache={}),f.cache.animation=e},displayType:function(e){"none"!==e&&m.data(n.displayType,e)},transitionExists:function(e,t){C.fn.transition.exists[e]=t,f.verbose("Saving existence of transition",e,t)}},restore:{conditions:function(){var e=f.get.currentAnimation();e&&(m.removeClass(e),f.verbose("Removing animation class",f.cache)),f.remove.duration()}},add:{failSafe:function(){var e=f.get.duration();f.timer=setTimeout(function(){m.triggerHandler(o)},e+u.failSafeDelay),f.verbose("Adding fail safe timer",f.timer)}},remove:{animating:function(){m.removeClass(d.animating)},animationCallbacks:function(){f.remove.queueCallback(),f.remove.completeCallback()},queueCallback:function(){m.off(".queue"+a)},completeCallback:function(){m.off(".complete"+a)},display:function(){m.css("display","")},direction:function(){m.removeClass(d.inward).removeClass(d.outward)},duration:function(){m.css("animation-duration","")},failSafe:function(){f.verbose("Removing fail safe timer",f.timer),f.timer&&clearTimeout(f.timer)},hidden:function(){m.removeClass(d.hidden)},visible:function(){m.removeClass(d.visible)},looping:function(){f.debug("Transitions are no longer looping"),f.is.looping()&&(f.reset(),m.removeClass(d.looping))},transition:function(){m.removeClass(d.transition).removeClass(d.visible).removeClass(d.hidden)}},get:{settings:function(e,t,n){return"object"==typeof e?C.extend(!0,{},C.fn.transition.settings,e):"function"==typeof n?C.extend({},C.fn.transition.settings,{animation:e,onComplete:n,duration:t}):"string"==typeof t||"number"==typeof t?C.extend({},C.fn.transition.settings,{animation:e,duration:t}):"object"==typeof t?C.extend({},C.fn.transition.settings,t,{animation:e}):"function"==typeof t?C.extend({},C.fn.transition.settings,{animation:e,onComplete:t}):C.extend({},C.fn.transition.settings,{animation:e})},animationClass:function(e){var t=e||u.animation,n=f.can.transition()&&!f.has.direction()?f.get.direction()+" ":"";return d.animating+" "+d.transition+" "+n+t},currentAnimation:function(){return!(!f.cache||f.cache.animation===k)&&f.cache.animation},currentDirection:function(){return f.is.inward()?d.inward:d.outward},direction:function(){return f.is.hidden()||!f.is.visible()?d.inward:d.outward},animationDirection:function(e){var n;return"string"==typeof(e=e||u.animation)&&(e=e.split(" "),C.each(e,function(e,t){t===d.inward?n=d.inward:t===d.outward&&(n=d.outward)})),n||!1},duration:function(e){return!1===(e=e||u.duration)&&(e=m.css("animation-duration")||0),"string"==typeof e?-1 ").addClass(t).insertAfter(m)).addClass(s).removeClass(d.inward).removeClass(d.outward).addClass(d.animating).addClass(d.transition).css("animationName"),a=i.addClass(d.inward).css("animationName"),c||(c=i.attr("class",t).removeAttr("style").removeClass(d.hidden).removeClass(d.visible).show().css("display"),f.verbose("Determining final display state",c),f.save.displayType(c)),i.remove(),o!=a)f.debug("Direction exists for animation",s),r=!0;else{if("none"==o||!o)return void f.debug("No animation defined in css",s);f.debug("Static animation found",s,c),r=!1}f.save.transitionExists(s,r)}return l!==k?l:r},animate:function(){return f.can.transition()!==k}},is:{animating:function(){return m.hasClass(d.animating)},inward:function(){return m.hasClass(d.inward)},outward:function(){return m.hasClass(d.outward)},looping:function(){return m.hasClass(d.looping)},occurring:function(e){return e="."+(e=e||u.animation).replace(" ","."),0=e.length&&E.isFunction(t)&&t()};n--;)(a=P.createElement("img")).onload=r,a.onerror=r,a.src=e[n],o.push(a)},enableCallbacks:function(){s.debug("Allowing callbacks to occur"),v=!1},disableCallbacks:function(){s.debug("Disabling all callbacks temporarily"),v=!0},should:{trackChanges:function(){return T?(s.debug("One time query, no need to bind events"),!1):(s.debug("Callbacks being attached"),!0)}},setup:{cache:function(){s.cache={occurred:{},screen:{},element:{}}},image:function(){var e=f.data(r.src);e&&(s.verbose("Lazy loading image",e),o.once=!0,o.observeChanges=!1,o.onOnScreen=function(){s.debug("Image on screen",h),s.precache(e,function(){s.set.image(e,function(){++A==D&&o.onAllLoaded.call(this),o.onLoad.call(this)})})})},fixed:function(){s.debug("Setting up fixed"),o.once=!1,o.observeChanges=!1,o.initialCheck=!0,o.refreshOnLoad=!0,b.transition||(o.transition=!1),s.create.placeholder(),s.debug("Added placeholder",e),o.onTopPassed=function(){s.debug("Element passed, adding fixed position",f),s.show.placeholder(),s.set.fixed(),o.transition&&E.fn.transition!==O&&f.transition(o.transition,o.duration)},o.onTopPassedReverse=function(){s.debug("Element returned to position, removing fixed",f),s.hide.placeholder(),s.remove.fixed()}}},create:{placeholder:function(){s.verbose("Creating fixed position placeholder"),e=f.clone(!1).css("display","none").addClass(i.placeholder).insertAfter(f)}},show:{placeholder:function(){s.verbose("Showing placeholder"),e.css("display","block").css("visibility","hidden")}},hide:{placeholder:function(){s.verbose("Hiding placeholder"),e.css("display","none").css("visibility","")}},set:{fixed:function(){s.verbose("Setting element to fixed position"),f.addClass(i.fixed).css({position:"fixed",top:o.offset+"px",left:"auto",zIndex:o.zIndex}),o.onFixed.call(h)},image:function(e,t){if(f.attr("src",e),o.transition)if(E.fn.transition!==O){if(f.hasClass(i.visible))return void s.debug("Transition already occurred on this image, skipping animation");f.transition(o.transition,o.duration,t)}else f.fadeIn(o.duration,t);else f.show()}},is:{onScreen:function(){return s.get.elementCalculations().onScreen},offScreen:function(){return s.get.elementCalculations().offScreen},visible:function(){return!(!s.cache||!s.cache.element)&&!(0===s.cache.element.width&&0===s.cache.element.offset.top)},verticallyScrollableContext:function(){var e=m.get(0)!==F&&m.css("overflow-y");return"auto"==e||"scroll"==e},horizontallyScrollableContext:function(){var e=m.get(0)!==F&&m.css("overflow-x");return"auto"==e||"scroll"==e}},refresh:function(){s.debug("Refreshing constants (width/height)"),"fixed"==o.type&&s.resetFixed(),s.reset(),s.save.position(),o.checkOnRefresh&&s.checkVisibility(),o.onRefresh.call(h)},resetFixed:function(){s.remove.fixed(),s.remove.occurred()},reset:function(){s.verbose("Resetting all cached values"),E.isPlainObject(s.cache)&&(s.cache.screen={},s.cache.element={})},checkVisibility:function(e){s.verbose("Checking visibility of element",s.cache.element),!v&&s.is.visible()&&(s.save.scroll(e),s.save.calculations(),s.passed(),s.passingReverse(),s.topVisibleReverse(),s.bottomVisibleReverse(),s.topPassedReverse(),s.bottomPassedReverse(),s.onScreen(),s.offScreen(),s.passing(),s.topVisible(),s.bottomVisible(),s.topPassed(),s.bottomPassed(),o.onUpdate&&o.onUpdate.call(h,s.get.elementCalculations()))},passed:function(e,t){var n=s.get.elementCalculations();if(e&&t)o.onPassed[e]=t;else{if(e!==O)return s.get.pixelsPassed(e)>n.pixelsPassed;n.passing&&E.each(o.onPassed,function(e,t){n.bottomVisible||n.pixelsPassed>s.get.pixelsPassed(e)?s.execute(t,e):o.once||s.remove.occurred(t)})}},onScreen:function(e){var t=s.get.elementCalculations(),n=e||o.onOnScreen;if(e&&(s.debug("Adding callback for onScreen",e),o.onOnScreen=e),t.onScreen?s.execute(n,"onScreen"):o.once||s.remove.occurred("onScreen"),e!==O)return t.onOnScreen},offScreen:function(e){var t=s.get.elementCalculations(),n=e||o.onOffScreen;if(e&&(s.debug("Adding callback for offScreen",e),o.onOffScreen=e),t.offScreen?s.execute(n,"offScreen"):o.once||s.remove.occurred("offScreen"),e!==O)return t.onOffScreen},passing:function(e){var t=s.get.elementCalculations(),n=e||o.onPassing;if(e&&(s.debug("Adding callback for passing",e),o.onPassing=e),t.passing?s.execute(n,"passing"):o.once||s.remove.occurred("passing"),e!==O)return t.passing},topVisible:function(e){var t=s.get.elementCalculations(),n=e||o.onTopVisible,i="topVisible";if(e&&(s.debug("Adding callback for top visible",e),o.onTopVisible=e),t.topVisible?s.execute(n,i):o.once||s.remove.occurred(i),e===O)return t.topVisible},bottomVisible:function(e){var t=s.get.elementCalculations(),n=e||o.onBottomVisible,i="bottomVisible";if(e&&(s.debug("Adding callback for bottom visible",e),o.onBottomVisible=e),t.bottomVisible?s.execute(n,i):o.once||s.remove.occurred(i),e===O)return t.bottomVisible},topPassed:function(e){var t=s.get.elementCalculations(),n=e||o.onTopPassed;if(e&&(s.debug("Adding callback for top passed",e),o.onTopPassed=e),t.topPassed?s.execute(n,"topPassed"):o.once||s.remove.occurred("topPassed"),e===O)return t.topPassed},bottomPassed:function(e){var t=s.get.elementCalculations(),n=e||o.onBottomPassed,i="bottomPassed";if(e&&(s.debug("Adding callback for bottom passed",e),o.onBottomPassed=e),t.bottomPassed?s.execute(n,i):o.once||s.remove.occurred(i),e===O)return t.bottomPassed},passingReverse:function(e){var t=s.get.elementCalculations(),n=e||o.onPassingReverse,i="passingReverse";if(e&&(s.debug("Adding callback for passing reverse",e),o.onPassingReverse=e),t.passing?o.once||s.remove.occurred(i):s.get.occurred("passing")&&s.execute(n,i),e!==O)return!t.passing},topVisibleReverse:function(e){var t=s.get.elementCalculations(),n=e||o.onTopVisibleReverse,i="topVisibleReverse";if(e&&(s.debug("Adding callback for top visible reverse",e),o.onTopVisibleReverse=e),t.topVisible?o.once||s.remove.occurred(i):s.get.occurred("topVisible")&&s.execute(n,i),e===O)return!t.topVisible},bottomVisibleReverse:function(e){var t=s.get.elementCalculations(),n=e||o.onBottomVisibleReverse,i="bottomVisibleReverse";if(e&&(s.debug("Adding callback for bottom visible reverse",e),o.onBottomVisibleReverse=e),t.bottomVisible?o.once||s.remove.occurred(i):s.get.occurred("bottomVisible")&&s.execute(n,i),e===O)return!t.bottomVisible},topPassedReverse:function(e){var t=s.get.elementCalculations(),n=e||o.onTopPassedReverse,i="topPassedReverse";if(e&&(s.debug("Adding callback for top passed reverse",e),o.onTopPassedReverse=e),t.topPassed?o.once||s.remove.occurred(i):s.get.occurred("topPassed")&&s.execute(n,i),e===O)return!t.onTopPassed},bottomPassedReverse:function(e){var t=s.get.elementCalculations(),n=e||o.onBottomPassedReverse,i="bottomPassedReverse";if(e&&(s.debug("Adding callback for bottom passed reverse",e),o.onBottomPassedReverse=e),t.bottomPassed?o.once||s.remove.occurred(i):s.get.occurred("bottomPassed")&&s.execute(n,i),e===O)return!t.bottomPassed},execute:function(e,t){var n=s.get.elementCalculations(),i=s.get.screenCalculations();(e=e||!1)&&(o.continuous?(s.debug("Callback being called continuously",t,n),e.call(h,n,i)):s.get.occurred(t)||(s.debug("Conditions met",t,n),e.call(h,n,i))),s.save.occurred(t)},remove:{fixed:function(){s.debug("Removing fixed position"),f.removeClass(i.fixed).css({position:"",top:"",left:"",zIndex:""}),o.onUnfixed.call(h)},placeholder:function(){s.debug("Removing placeholder content"),e&&e.remove()},occurred:function(e){if(e){var t=s.cache.occurred;t[e]!==O&&!0===t[e]&&(s.debug("Callback can now be called again",e),s.cache.occurred[e]=!1)}else s.cache.occurred={}}},save:{calculations:function(){s.verbose("Saving all calculations necessary to determine positioning"),s.save.direction(),s.save.screenCalculations(),s.save.elementCalculations()},occurred:function(e){e&&(s.cache.occurred[e]!==O&&!0===s.cache.occurred[e]||(s.verbose("Saving callback occurred",e),s.cache.occurred[e]=!0))},scroll:function(e){e=e+o.offset||m.scrollTop()+o.offset,s.cache.scroll=e},direction:function(){var e,t=s.get.scroll(),n=s.get.lastScroll();return e=n=t.top,t.bottomPassed=e.top>=t.bottom,t.topVisible=e.bottom>=t.top&&!t.topPassed,t.bottomVisible=e.bottom>=t.bottom&&!t.bottomPassed,t.pixelsPassed=0,t.percentagePassed=0,t.onScreen=(t.topVisible||t.passing)&&!t.bottomPassed,t.passing=t.topPassed&&!t.bottomPassed,t.offScreen=!t.onScreen,t.passing&&(t.pixelsPassed=e.top-t.top,t.percentagePassed=(e.top-t.top)/t.height),s.cache.element=t,s.verbose("Updated element calculations",t),t},screenCalculations:function(){var e=s.get.scroll();return s.save.direction(),s.cache.screen.top=e,s.cache.screen.bottom=e+s.cache.screen.height,s.cache.screen},screenSize:function(){s.verbose("Saving window position"),s.cache.screen={height:m.height()}},position:function(){s.save.screenSize(),s.save.elementPosition()}},get:{pixelsPassed:function(e){var t=s.get.elementCalculations();return-1
+
+
+
+Created by FontForge 20100429 at Thu Sep 20 22:09:47 2012
+ By root
+Copyright (C) 2012 by original authors @ fontello.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/dist/themes/basic/assets/fonts/icons.ttf b/public/dist/themes/basic/assets/fonts/icons.ttf
new file mode 100644
index 000000000..318a2643d
Binary files /dev/null and b/public/dist/themes/basic/assets/fonts/icons.ttf differ
diff --git a/public/dist/themes/basic/assets/fonts/icons.woff b/public/dist/themes/basic/assets/fonts/icons.woff
new file mode 100644
index 000000000..baba1b5eb
Binary files /dev/null and b/public/dist/themes/basic/assets/fonts/icons.woff differ
diff --git a/public/dist/themes/default/assets/fonts/brand-icons.eot b/public/dist/themes/default/assets/fonts/brand-icons.eot
new file mode 100644
index 000000000..a1bc094ab
Binary files /dev/null and b/public/dist/themes/default/assets/fonts/brand-icons.eot differ
diff --git a/public/dist/themes/default/assets/fonts/brand-icons.svg b/public/dist/themes/default/assets/fonts/brand-icons.svg
new file mode 100644
index 000000000..46ad237a6
--- /dev/null
+++ b/public/dist/themes/default/assets/fonts/brand-icons.svg
@@ -0,0 +1,3570 @@
+
+
+
+
+
+Created by FontForge 20190801 at Mon Mar 23 10:45:51 2020
+ By Robert Madole
+Copyright (c) Font Awesome
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/dist/themes/default/assets/fonts/brand-icons.ttf b/public/dist/themes/default/assets/fonts/brand-icons.ttf
new file mode 100644
index 000000000..948a2a6cc
Binary files /dev/null and b/public/dist/themes/default/assets/fonts/brand-icons.ttf differ
diff --git a/public/dist/themes/default/assets/fonts/brand-icons.woff b/public/dist/themes/default/assets/fonts/brand-icons.woff
new file mode 100644
index 000000000..2a89d521e
Binary files /dev/null and b/public/dist/themes/default/assets/fonts/brand-icons.woff differ
diff --git a/public/dist/themes/default/assets/fonts/brand-icons.woff2 b/public/dist/themes/default/assets/fonts/brand-icons.woff2
new file mode 100644
index 000000000..141a90a9e
Binary files /dev/null and b/public/dist/themes/default/assets/fonts/brand-icons.woff2 differ
diff --git a/public/dist/themes/default/assets/fonts/icons.eot b/public/dist/themes/default/assets/fonts/icons.eot
new file mode 100644
index 000000000..d3b77c223
Binary files /dev/null and b/public/dist/themes/default/assets/fonts/icons.eot differ
diff --git a/public/dist/themes/default/assets/fonts/icons.svg b/public/dist/themes/default/assets/fonts/icons.svg
new file mode 100644
index 000000000..7742838b4
--- /dev/null
+++ b/public/dist/themes/default/assets/fonts/icons.svg
@@ -0,0 +1,4938 @@
+
+
+
+
+
+Created by FontForge 20190801 at Mon Mar 23 10:45:51 2020
+ By Robert Madole
+Copyright (c) Font Awesome
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/dist/themes/default/assets/fonts/icons.ttf b/public/dist/themes/default/assets/fonts/icons.ttf
new file mode 100644
index 000000000..5b979039a
Binary files /dev/null and b/public/dist/themes/default/assets/fonts/icons.ttf differ
diff --git a/public/dist/themes/default/assets/fonts/icons.woff b/public/dist/themes/default/assets/fonts/icons.woff
new file mode 100644
index 000000000..beec79178
Binary files /dev/null and b/public/dist/themes/default/assets/fonts/icons.woff differ
diff --git a/public/dist/themes/default/assets/fonts/icons.woff2 b/public/dist/themes/default/assets/fonts/icons.woff2
new file mode 100644
index 000000000..978a681a1
Binary files /dev/null and b/public/dist/themes/default/assets/fonts/icons.woff2 differ
diff --git a/public/dist/themes/default/assets/fonts/outline-icons.eot b/public/dist/themes/default/assets/fonts/outline-icons.eot
new file mode 100644
index 000000000..38cf2517a
Binary files /dev/null and b/public/dist/themes/default/assets/fonts/outline-icons.eot differ
diff --git a/public/dist/themes/default/assets/fonts/outline-icons.svg b/public/dist/themes/default/assets/fonts/outline-icons.svg
new file mode 100644
index 000000000..48634a9ab
--- /dev/null
+++ b/public/dist/themes/default/assets/fonts/outline-icons.svg
@@ -0,0 +1,803 @@
+
+
+
+
+
+Created by FontForge 20190801 at Mon Mar 23 10:45:51 2020
+ By Robert Madole
+Copyright (c) Font Awesome
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/dist/themes/default/assets/fonts/outline-icons.ttf b/public/dist/themes/default/assets/fonts/outline-icons.ttf
new file mode 100644
index 000000000..abe99e20c
Binary files /dev/null and b/public/dist/themes/default/assets/fonts/outline-icons.ttf differ
diff --git a/public/dist/themes/default/assets/fonts/outline-icons.woff b/public/dist/themes/default/assets/fonts/outline-icons.woff
new file mode 100644
index 000000000..24de566a5
Binary files /dev/null and b/public/dist/themes/default/assets/fonts/outline-icons.woff differ
diff --git a/public/dist/themes/default/assets/fonts/outline-icons.woff2 b/public/dist/themes/default/assets/fonts/outline-icons.woff2
new file mode 100644
index 000000000..7e0118e52
Binary files /dev/null and b/public/dist/themes/default/assets/fonts/outline-icons.woff2 differ
diff --git a/public/dist/themes/default/assets/images/flags.png b/public/dist/themes/default/assets/images/flags.png
new file mode 100644
index 000000000..cdd33c3bc
Binary files /dev/null and b/public/dist/themes/default/assets/images/flags.png differ
diff --git a/public/dist/themes/github/assets/fonts/octicons-local.ttf b/public/dist/themes/github/assets/fonts/octicons-local.ttf
new file mode 100644
index 000000000..d5f4e2eca
Binary files /dev/null and b/public/dist/themes/github/assets/fonts/octicons-local.ttf differ
diff --git a/public/dist/themes/github/assets/fonts/octicons.svg b/public/dist/themes/github/assets/fonts/octicons.svg
new file mode 100644
index 000000000..d3116a69b
--- /dev/null
+++ b/public/dist/themes/github/assets/fonts/octicons.svg
@@ -0,0 +1,200 @@
+
+
+
+
+(c) 2012-2015 GitHub
+
+When using the GitHub logos, be sure to follow the GitHub logo guidelines (https://github.com/logos)
+
+Font License: SIL OFL 1.1 (http://scripts.sil.org/OFL)
+Applies to all font files
+
+Code License: MIT (http://choosealicense.com/licenses/mit/)
+Applies to all other files
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/dist/themes/github/assets/fonts/octicons.ttf b/public/dist/themes/github/assets/fonts/octicons.ttf
new file mode 100644
index 000000000..9e0910530
Binary files /dev/null and b/public/dist/themes/github/assets/fonts/octicons.ttf differ
diff --git a/public/dist/themes/github/assets/fonts/octicons.woff b/public/dist/themes/github/assets/fonts/octicons.woff
new file mode 100644
index 000000000..cc3c19f0d
Binary files /dev/null and b/public/dist/themes/github/assets/fonts/octicons.woff differ
diff --git a/public/dist/themes/material/assets/fonts/icons.eot b/public/dist/themes/material/assets/fonts/icons.eot
new file mode 100644
index 000000000..70508ebab
Binary files /dev/null and b/public/dist/themes/material/assets/fonts/icons.eot differ
diff --git a/public/dist/themes/material/assets/fonts/icons.svg b/public/dist/themes/material/assets/fonts/icons.svg
new file mode 100644
index 000000000..a449327e2
--- /dev/null
+++ b/public/dist/themes/material/assets/fonts/icons.svg
@@ -0,0 +1,2373 @@
+
+
+
+
+
+Created by FontForge 20151118 at Mon Feb 8 11:58:02 2016
+ By shyndman
+Copyright 2015 Google, Inc. All Rights Reserved.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/dist/themes/material/assets/fonts/icons.ttf b/public/dist/themes/material/assets/fonts/icons.ttf
new file mode 100644
index 000000000..7015564ad
Binary files /dev/null and b/public/dist/themes/material/assets/fonts/icons.ttf differ
diff --git a/public/dist/themes/material/assets/fonts/icons.woff b/public/dist/themes/material/assets/fonts/icons.woff
new file mode 100644
index 000000000..b648a3eea
Binary files /dev/null and b/public/dist/themes/material/assets/fonts/icons.woff differ
diff --git a/public/dist/themes/material/assets/fonts/icons.woff2 b/public/dist/themes/material/assets/fonts/icons.woff2
new file mode 100644
index 000000000..9fa211252
Binary files /dev/null and b/public/dist/themes/material/assets/fonts/icons.woff2 differ
diff --git a/public/logger.js b/public/logger.js
new file mode 100644
index 000000000..42bfe8e2d
--- /dev/null
+++ b/public/logger.js
@@ -0,0 +1,202 @@
+// client-side js, loaded by index.html
+// run by the browser each time the page is loaded
+
+console.log("hello world :o");
+
+
+// define variables that reference elements on our page
+const welcome = document.getElementById("welcome");
+
+// a helper function that creates a list item for a given chore
+function appendNewEntry(entry) {
+ const entriesList = document.getElementById("viewChores");
+ const newListItem = document.createElement("li");
+ newListItem.innerText = entry[0] +"-" + entry[1];
+ entriesList.appendChild(newListItem);
+}
+
+let displayEntries = function(entries){
+ console.log(entries);
+ console.log(entries.length);
+
+ const entryList = document.getElementById("viewChores");
+
+
+ while(entryList.firstChild){
+ entryList.removeChild(entryList.firstChild);
+ }
+
+ for(let i=0; i {
+ event.preventDefault();
+ fetch("/deleteEntry", {
+ method: "POST",
+ body: JSON.stringify({
+ hours: entries[i].hours,
+ index: i
+ }),
+ headers: {
+ "Content-Type": "application/json"
+ }
+ })
+ .then(response => response.json())
+ .then(entries => {
+ displayEntries(entries);
+ });
+ });
+
+ modifyBtn.addEventListener("click", event => {
+ event.preventDefault();
+ if(document.getElementById("hours") == null || document.querySelector('#chores option:checked') == null){
+ alert("Please enter all fields")
+ window.location.href = "/logger";
+ }
+ let newEntry = [document.getElementById("hours").value, document.querySelector('#chores option:checked').value];
+ if(newEntry[0] == ""){
+ alert("Please enter how many hours were spent completing the chore")
+ window.location.href = "/logger";
+ }
+ else if(newEntry[0].value < 0 || newEntry[0].value > 24){
+ alert("Invalid number of hours must be between 0 and 24, setting")
+ window.location.href = "/logger";
+ }
+ else{
+ fetch("/modifyEntry", {
+ method: "POST",
+ body: JSON.stringify({
+ hours: newEntry[0],
+ chore: newEntry[1],
+ index: i
+ }),
+ headers: {
+ "Content-Type": "application/json"
+ }
+ })
+ .then(response => response.json())
+ .then(entries => {
+ displayEntries(entries);
+ });
+ }
+
+ });
+
+ entryList.appendChild(entry);
+ entry.appendChild(choreInfo);
+ choreInfo.appendChild(deleteBtn);
+ choreInfo.appendChild(modifyBtn);
+ }
+}
+
+window.onload = (event) => {
+ console.log('page is fully loaded');
+
+
+ const submitBtn = document.getElementById("submitChore");
+ const logoutBtn = document.getElementById("logout");
+
+ document.getElementById("welcome").innerText = "Welcome!";
+ fetch("/uname", {
+ method: "GET",
+ headers: {
+ "Content-Type": "application/json"
+ }
+ })
+ .then(response => response.json()) // parse the JSON from the server
+ .then(json => {
+ if(json.uname){
+ document.getElementById("welcome").innerText = "Welcome " + json.uname + "!";
+ }
+ else{
+ window.alert("Please login first!");
+ window.location.href = "/";
+ }
+ });
+
+ fetch("/chores", {
+ method: "GET",
+ headers: {
+ "Content-Type": "application/json"
+ }
+ })
+ .then(response => response.json()) // parse the JSON from the server
+ .then(entries => {
+ displayEntries(entries);
+ });
+
+ submitBtn.addEventListener("click", event => {
+ event.preventDefault();
+ if(document.getElementById("hours") == null || document.querySelector('#chores option:checked') == null){
+ alert("Please enter all fields")
+ window.location.href = "/logger";
+ }
+ let newEntry = [document.getElementById("hours").value, document.querySelector('#chores option:checked').value];
+ if(newEntry[0] == "" || newEntry[1] == ""){
+ alert("Please enter how many hours were spent completing the chore")
+ window.location.href = "/logger";
+ }
+ else if(newEntry[0] < 0 || newEntry[0] > 24){
+ alert("Invalid number of hours please keep the number of hours between 0 and 24")
+ window.location.href = "/logger";
+ }
+ else{
+ fetch("/submitEntry", {
+ method: "POST",
+ body: JSON.stringify({
+ hours: newEntry[0],
+ chore: newEntry[1],
+ }),
+ headers: {
+ "Content-Type": "application/json"
+ }
+ })
+ .then(response => response.json())
+ .then(entries => {
+ displayEntries(entries);
+ });
+ }
+ });
+
+ logoutBtn.addEventListener("click", event => {
+ event.preventDefault();
+ console.log('logout')
+
+ fetch("/logout", {
+ method: "POST",
+ headers: {
+ "Content-Type": "application/json"
+ }
+ })
+ .then(response => response.json())
+ .then(json => {
+ if (json.logout) {
+ window.location.href = "/";
+ }
+ else {
+ window.alert("You are already logged out.");
+ window.location.href = "/";
+ }
+ });
+ });
+};
+
+
+
+
+
+
+
diff --git a/public/login.js b/public/login.js
new file mode 100644
index 000000000..df544d111
--- /dev/null
+++ b/public/login.js
@@ -0,0 +1,81 @@
+// client-side js, loaded by index.html
+// run by the browser each time the page is loaded
+
+console.log("hello world :o");
+
+window.onload = (event) => {
+ console.log('page is fully loaded');
+ // define variables that reference elements on our page
+ const loginBtn = document.getElementById("login");
+ const registerBtn = document.getElementById("register");
+ const loginForm = document.querySelector("form");
+
+ registerBtn.addEventListener("click", event => {
+ // stop our form submission from refreshing the page
+ event.preventDefault();
+
+ if(loginForm.elements.uname.value == "" || loginForm.elements.pwd.value == ""){
+ window.alert("Must enter a username and password.")
+ return
+ }
+
+ fetch("/register", {
+ method: "POST",
+ body: JSON.stringify({
+ uname: loginForm.elements.uname.value,
+ pwd: loginForm.elements.pwd.value,
+ entries: []
+ }),
+ headers: {
+ "Content-Type": "application/json"
+ }
+ })
+ .then(response => response.json())
+ .then(json => {
+ if (json.login) {
+ window.location.href = "/logger";
+ } else {
+ window.alert(
+ "That user already exists! Maybe try another name?"
+ );
+ }
+ });
+
+ // reset form
+ loginForm.reset();
+ });
+
+ loginBtn.addEventListener("click", event => {
+ // stop our form submission from refreshing the page
+ event.preventDefault();
+
+ if(loginForm.elements.uname.value == "" || loginForm.elements.pwd.value == ""){
+ window.alert("Neither username nor password can be an empty string.")
+ return
+ }
+
+ fetch("/login", {
+ method: "POST",
+ body: JSON.stringify({
+ uname: loginForm.elements.uname.value,
+ pwd: loginForm.elements.pwd.value
+ }),
+ headers: {
+ "Content-Type": "application/json"
+ }
+ })
+ .then(response => response.json())
+ .then(json => {
+ if (json.login) {
+ window.location.href = "/logger";
+ } else {
+ window.alert("Invalid login info.");
+ }
+ });
+
+ // reset form
+ loginForm.reset();
+ });
+
+};
+
diff --git a/public/style.css b/public/style.css
new file mode 100644
index 000000000..c36553f32
--- /dev/null
+++ b/public/style.css
@@ -0,0 +1,94 @@
+/* this file is loaded by index.html and styles the page */
+
+* {
+ box-sizing: border-box;
+}
+
+body {
+ font-family: sans-serif;
+ margin: 2em 1em;
+ line-height: 1.5em;
+}
+
+h1 {
+ font-style: italic;
+ color: #373fff;
+ max-width: calc(100% - 5rem);
+ line-height: 1.1;
+}
+
+form {
+ background-color: #eee;
+ display: grid;
+ grid-gap: 1em;
+ padding: 1em;
+ max-width: 100ch;
+}
+
+input {
+ border: 1px solid silver;
+ display: block;
+ font-size: 16px;
+ margin-bottom: 10px;
+ padding: 5px;
+ width: 100%;
+}
+
+form button {
+ background-color: #bbbbf2;
+ border: 2px solid currentColor;
+ border-radius: .25em;
+ cursor: pointer;
+ font-size: inherit;
+ line-height: 1.4em;
+ padding: 0.25em 1em;
+ max-width: 20ch;
+}
+
+form button:hover {
+ background-color: lavender;
+}
+
+footer {
+ margin-top: 3em;
+ padding-top: 1.5em;
+ border-top: 1px solid lightgrey;
+}
+
+#chores{
+ display: block;
+ text-align: left;
+ background-color: white;
+ border: 2px solid currentColor;
+ border-radius: .25em;
+ cursor: pointer;
+ font-size: inherit;
+ line-height: 1.4em;
+ padding: 0.25em 1em;
+ max-width: 20ch;
+}
+
+#viewChores{
+ display: block;
+ text-align: left;
+ background-color: white;
+ border: 2px solid currentColor;
+ border-radius: .25em;
+ cursor: pointer;
+ font-size: inherit;
+ line-height: 1.4em;
+ padding: 0.25em 1em;
+ max-width: 100ch;
+}
+
+.buttons{
+ background-color: #bbbbf2;
+ border: 2px solid currentColor;
+ border-radius: .2em;
+ cursor: pointer;
+ font-size: inherit;
+ line-height: 1em;
+ padding: 0.1em 1em;
+ max-width: 10ch;
+ float: right;
+}
diff --git a/server.js b/server.js
new file mode 100644
index 000000000..a5bb3530a
--- /dev/null
+++ b/server.js
@@ -0,0 +1,234 @@
+// server.js
+// where your node app starts
+
+// we've started you off with Express (https://expressjs.com/)
+// but feel free to use whatever libraries or frameworks you'd like through `package.json`.
+const express = require("express"),
+ mongodb = require( 'mongodb' ),
+ bodyParser = require( 'body-parser' ),
+ cookie = require('cookie-session'),
+ app = express();
+
+// our default array of dreams
+// const dreams = [
+// "Find and count some sheep",
+// "Climb a really tall mountain",
+// "Wash the dishes"
+// ];
+
+// make all the files in 'public' available
+// https://expressjs.com/en/starter/static-files.html
+app.use(express.static("public"));
+app.use( express.json() );
+app.use( express.urlencoded({ extended:true }) )
+app.use(
+ cookie({
+ name: "session",
+ keys: ["cookie1", "cookie2"]
+ })
+);
+
+const uri = "mongodb+srv://CS4241:Webware@a3cluster.klzdhtp.mongodb.net/?retryWrites=true&w=majority";
+const client = new mongodb.MongoClient( uri, { useNewUrlParser: true, useUnifiedTopology:true })
+let collection = null
+
+client.connect()
+ .then( () => {
+ // will only create collection if it doesn't exist
+ return client.db( 'yfaoua' ).collection( 'ChoreLogger' )
+ })
+ .then( __collection => {
+ // store reference to collection
+ collection = __collection
+ // blank query returns all documents
+ return collection.find({ }).toArray()
+ })
+ .then( console.log )
+
+
+// route to get all docs
+
+app.get( '/entries', (req,res) => {
+ if( collection !== null ) {
+ // get array and pass to res.json
+ collection.find({ }).toArray().then( result => res.json( result ) )
+ }
+})
+
+app.get("/uname", bodyParser.json(), (request, response) => {
+ console.log("get username");
+ console.log(request.session.login);
+ console.log(request.session.uname);
+ response.json({ uname: request.session.uname });
+});
+
+app.get("/chores", bodyParser.json(), (request, response) => {
+ console.log("get chore")
+ collection
+ .find({ uname: request.session.uname })
+ .toArray()
+ .then(result => {
+ let entries = result[0].entries;
+ console.log(result[0]);
+ console.log(entries);
+ response.json(entries);
+ });
+});
+
+
+// https://expressjs.com/en/starter/basic-routing.html
+app.get("/", (request, response) => {
+ response.sendFile(__dirname + "/views/index.html");
+});
+
+// send the default array of dreams to the webpage
+app.get("/logger", (request, response) => {
+ // express helps us take JS objects and send them as JSON
+ response.sendFile(__dirname + "/views/logger.html");
+});
+
+// listen for requests :)
+const listener = app.listen(process.env.PORT, () => {
+ console.log("Your app is listening on port " + listener.address().port);
+});
+
+app.use( (req,res,next) => {
+ if( collection !== null ) {
+ next()
+ }else{
+ res.status( 503 ).send()
+ }
+})
+
+app.post("/register", bodyParser.json(), (request, response) => {
+ console.log("create new account");
+
+ collection
+ .find({ uname: request.body.uname })
+ .toArray()
+ .then(result => {
+ if (result.length >= 1) {
+ console.log(result)
+ response.json({ login: false });
+ } else {
+ //user does not exist, create
+ let newUser = {
+ uname: request.body.uname,
+ pwd: request.body.pwd,
+ entries: []
+ };
+
+ console.log(newUser);
+ collection.insertOne(newUser);
+ collection.insertOne(newUser);
+ console.log("creating new account");
+ console.log(request.body.uname);
+ request.session.uname = request.body.uname;
+ console.log("name:");
+ console.log(request.session.uname);
+ console.log(request.session.uname);
+ request.session.login = true;
+ response.json({ login: true });
+ }
+ });
+});
+
+app.post("/login", bodyParser.json(), (request, response) => {
+ console.log("login");
+ collection
+ .find({ uname: request.body.uname, pwd: request.body.pwd })
+ .toArray()
+ .then(result => {
+ if (result.length >= 1) {
+ request.session.uname = request.body.uname;
+ request.session.login = true;
+ console.log("valid login");
+ console.log(request.session.uname);
+ response.json({ login: true });
+ } else {
+ console.log("invalid login")
+ response.json({ login: false });
+ response
+ }
+ });
+});
+
+app.post("/logout", (request, response) => {
+ if(request.session.login == true){
+ request.session.login = false;
+ console.log("logging out")
+ response.json({ logout: true });
+ }
+ else{
+ response.json({ logout: false });
+ }
+});
+
+app.post("/submitEntry", bodyParser.json(), (request, response) => {
+ collection
+ .find({ uname: request.session.uname })
+ .toArray()
+ .then(result => {
+ let entries = result[0].entries;
+ entries.push({
+ hours: request.body.hours,
+ chore: request.body.chore
+ });
+
+ collection.updateOne(
+ { _id: mongodb.ObjectId(result[0]._id) },
+ { $set: { entries: entries } }
+ );
+ response.json(entries);
+ });
+});
+
+
+app.post("/deleteEntry", bodyParser.json(), (request, response) => {
+ collection
+ .find({ uname: request.session.uname })
+ .toArray()
+ .then(result => {
+ let entries = result[0].entries;
+
+ if (entries[request.body.index]) {
+ entries.splice(request.body.index, 1);
+ }
+
+ collection.updateOne(
+ { _id: mongodb.ObjectId(result[0]._id) },
+ { $set: { entries: entries } }
+ );
+ response.json(entries);
+ });
+});
+
+app.post("/modifyEntry", bodyParser.json(), (request, response) => {
+ console.log("modify entry")
+ collection
+ .find({ uname: request.session.uname })
+ .toArray()
+ .then(result => {
+ let entries = result[0].entries;
+
+
+ console.log(request.body);
+ let modifiedEntry = {
+ hours: request.body.hours,
+ chore: request.body.chore,
+ index: request.body.index
+ };
+
+ console.log(modifiedEntry.mmCount);
+ if (entries[request.body.index]) {
+ entries[request.body.index] = modifiedEntry;
+ }
+
+ collection.updateOne(
+ { _id: mongodb.ObjectId(result[0]._id) },
+ { $set: { entries: entries } }
+ );
+
+ response.json(entries);
+ });
+});
diff --git a/shrinkwrap.yaml b/shrinkwrap.yaml
new file mode 100644
index 000000000..a9560448d
--- /dev/null
+++ b/shrinkwrap.yaml
@@ -0,0 +1,730 @@
+dependencies:
+ body-parser: 1.20.0
+ cookie-session: 2.0.0
+ express: 4.17.1
+ mongodb: 4.10.0
+packages:
+ /@types/node/18.7.18:
+ dev: false
+ resolution:
+ integrity: sha512-m+6nTEOadJZuTPkKR/SYK3A2d7FZrgElol9UP1Kae90VVU4a6mxnPuLiIW1m4Cq4gZ/nWb9GrdVXJCoCazDAbg==
+ /@types/webidl-conversions/7.0.0:
+ dev: false
+ resolution:
+ integrity: sha512-xTE1E+YF4aWPJJeUzaZI5DRntlkY3+BCVJi0axFptnjGmAoWxkyREIh/XMrfxVLejwQxMCfDXdICo0VLxThrog==
+ /@types/whatwg-url/8.2.2:
+ dependencies:
+ '@types/node': 18.7.18
+ '@types/webidl-conversions': 7.0.0
+ dev: false
+ resolution:
+ integrity: sha512-FtQu10RWgn3D9U4aazdwIE2yzphmTJREDqNdODHrbrZmmMqI0vMheC/6NE/J1Yveaj8H+ela+YwWTjq5PGmuhA==
+ /accepts/1.3.7:
+ dependencies:
+ mime-types: 2.1.25
+ negotiator: 0.6.2
+ dev: false
+ engines:
+ node: '>= 0.6'
+ resolution:
+ integrity: sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==
+ /array-flatten/1.1.1:
+ dev: false
+ resolution:
+ integrity: sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=
+ /base64-js/1.5.1:
+ dev: false
+ resolution:
+ integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+ /body-parser/1.19.0:
+ dependencies:
+ bytes: 3.1.0
+ content-type: 1.0.4
+ debug: 2.6.9
+ depd: 1.1.2
+ http-errors: 1.7.2
+ iconv-lite: 0.4.24
+ on-finished: 2.3.0
+ qs: 6.7.0
+ raw-body: 2.4.0
+ type-is: 1.6.18
+ dev: false
+ engines:
+ node: '>= 0.8'
+ resolution:
+ integrity: sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==
+ /body-parser/1.20.0:
+ dependencies:
+ bytes: 3.1.2
+ content-type: 1.0.4
+ debug: 2.6.9
+ depd: 2.0.0
+ destroy: 1.2.0
+ http-errors: 2.0.0
+ iconv-lite: 0.4.24
+ on-finished: 2.4.1
+ qs: 6.10.3
+ raw-body: 2.5.1
+ type-is: 1.6.18
+ unpipe: 1.0.0
+ dev: false
+ engines:
+ node: '>= 0.8'
+ npm: 1.2.8000 || >= 1.4.16
+ resolution:
+ integrity: sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==
+ /bson/4.7.0:
+ dependencies:
+ buffer: 5.7.1
+ dev: false
+ engines:
+ node: '>=6.9.0'
+ resolution:
+ integrity: sha512-VrlEE4vuiO1WTpfof4VmaVolCVYkYTgB9iWgYNOrVlnifpME/06fhFRmONgBhClD5pFC1t9ZWqFUQEQAzY43bA==
+ /buffer/5.7.1:
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+ dev: false
+ resolution:
+ integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
+ /bytes/3.1.0:
+ dev: false
+ engines:
+ node: '>= 0.8'
+ resolution:
+ integrity: sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==
+ /bytes/3.1.2:
+ dev: false
+ engines:
+ node: '>= 0.8'
+ resolution:
+ integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
+ /call-bind/1.0.2:
+ dependencies:
+ function-bind: 1.1.1
+ get-intrinsic: 1.1.3
+ dev: false
+ resolution:
+ integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+ /content-disposition/0.5.3:
+ dependencies:
+ safe-buffer: 5.1.2
+ dev: false
+ engines:
+ node: '>= 0.6'
+ resolution:
+ integrity: sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==
+ /content-type/1.0.4:
+ dev: false
+ engines:
+ node: '>= 0.6'
+ resolution:
+ integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
+ /cookie-session/2.0.0:
+ dependencies:
+ cookies: 0.8.0
+ debug: 3.2.7
+ on-headers: 1.0.2
+ safe-buffer: 5.2.1
+ dev: false
+ engines:
+ node: '>= 0.10'
+ resolution:
+ integrity: sha512-hKvgoThbw00zQOleSlUr2qpvuNweoqBtxrmx0UFosx6AGi9lYtLoA+RbsvknrEX8Pr6MDbdWAb2j6SnMn+lPsg==
+ /cookie-signature/1.0.6:
+ dev: false
+ resolution:
+ integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw=
+ /cookie/0.4.0:
+ dev: false
+ engines:
+ node: '>= 0.6'
+ resolution:
+ integrity: sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==
+ /cookies/0.8.0:
+ dependencies:
+ depd: 2.0.0
+ keygrip: 1.1.0
+ dev: false
+ engines:
+ node: '>= 0.8'
+ resolution:
+ integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==
+ /debug/2.6.9:
+ dependencies:
+ ms: 2.0.0
+ dev: false
+ resolution:
+ integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ /debug/3.2.7:
+ dependencies:
+ ms: 2.1.3
+ dev: false
+ resolution:
+ integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+ /denque/2.1.0:
+ dev: false
+ engines:
+ node: '>=0.10'
+ resolution:
+ integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==
+ /depd/1.1.2:
+ dev: false
+ engines:
+ node: '>= 0.6'
+ resolution:
+ integrity: sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=
+ /depd/2.0.0:
+ dev: false
+ engines:
+ node: '>= 0.8'
+ resolution:
+ integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
+ /destroy/1.0.4:
+ dev: false
+ resolution:
+ integrity: sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=
+ /destroy/1.2.0:
+ dev: false
+ engines:
+ node: '>= 0.8'
+ npm: 1.2.8000 || >= 1.4.16
+ resolution:
+ integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
+ /ee-first/1.1.1:
+ dev: false
+ resolution:
+ integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
+ /encodeurl/1.0.2:
+ dev: false
+ engines:
+ node: '>= 0.8'
+ resolution:
+ integrity: sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
+ /escape-html/1.0.3:
+ dev: false
+ resolution:
+ integrity: sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=
+ /etag/1.8.1:
+ dev: false
+ engines:
+ node: '>= 0.6'
+ resolution:
+ integrity: sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
+ /express/4.17.1:
+ dependencies:
+ accepts: 1.3.7
+ array-flatten: 1.1.1
+ body-parser: 1.19.0
+ content-disposition: 0.5.3
+ content-type: 1.0.4
+ cookie: 0.4.0
+ cookie-signature: 1.0.6
+ debug: 2.6.9
+ depd: 1.1.2
+ encodeurl: 1.0.2
+ escape-html: 1.0.3
+ etag: 1.8.1
+ finalhandler: 1.1.2
+ fresh: 0.5.2
+ merge-descriptors: 1.0.1
+ methods: 1.1.2
+ on-finished: 2.3.0
+ parseurl: 1.3.3
+ path-to-regexp: 0.1.7
+ proxy-addr: 2.0.5
+ qs: 6.7.0
+ range-parser: 1.2.1
+ safe-buffer: 5.1.2
+ send: 0.17.1
+ serve-static: 1.14.1
+ setprototypeof: 1.1.1
+ statuses: 1.5.0
+ type-is: 1.6.18
+ utils-merge: 1.0.1
+ vary: 1.1.2
+ dev: false
+ engines:
+ node: '>= 0.10.0'
+ resolution:
+ integrity: sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==
+ /finalhandler/1.1.2:
+ dependencies:
+ debug: 2.6.9
+ encodeurl: 1.0.2
+ escape-html: 1.0.3
+ on-finished: 2.3.0
+ parseurl: 1.3.3
+ statuses: 1.5.0
+ unpipe: 1.0.0
+ dev: false
+ engines:
+ node: '>= 0.8'
+ resolution:
+ integrity: sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==
+ /forwarded/0.1.2:
+ dev: false
+ engines:
+ node: '>= 0.6'
+ resolution:
+ integrity: sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=
+ /fresh/0.5.2:
+ dev: false
+ engines:
+ node: '>= 0.6'
+ resolution:
+ integrity: sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=
+ /function-bind/1.1.1:
+ dev: false
+ resolution:
+ integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+ /get-intrinsic/1.1.3:
+ dependencies:
+ function-bind: 1.1.1
+ has: 1.0.3
+ has-symbols: 1.0.3
+ dev: false
+ resolution:
+ integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==
+ /has-symbols/1.0.3:
+ dev: false
+ engines:
+ node: '>= 0.4'
+ resolution:
+ integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+ /has/1.0.3:
+ dependencies:
+ function-bind: 1.1.1
+ dev: false
+ engines:
+ node: '>= 0.4.0'
+ resolution:
+ integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ /http-errors/1.7.2:
+ dependencies:
+ depd: 1.1.2
+ inherits: 2.0.3
+ setprototypeof: 1.1.1
+ statuses: 1.5.0
+ toidentifier: 1.0.0
+ dev: false
+ engines:
+ node: '>= 0.6'
+ resolution:
+ integrity: sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==
+ /http-errors/1.7.3:
+ dependencies:
+ depd: 1.1.2
+ inherits: 2.0.4
+ setprototypeof: 1.1.1
+ statuses: 1.5.0
+ toidentifier: 1.0.0
+ dev: false
+ engines:
+ node: '>= 0.6'
+ resolution:
+ integrity: sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==
+ /http-errors/2.0.0:
+ dependencies:
+ depd: 2.0.0
+ inherits: 2.0.4
+ setprototypeof: 1.2.0
+ statuses: 2.0.1
+ toidentifier: 1.0.1
+ dev: false
+ engines:
+ node: '>= 0.8'
+ resolution:
+ integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==
+ /iconv-lite/0.4.24:
+ dependencies:
+ safer-buffer: 2.1.2
+ dev: false
+ engines:
+ node: '>=0.10.0'
+ resolution:
+ integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ /ieee754/1.2.1:
+ dev: false
+ resolution:
+ integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+ /inherits/2.0.3:
+ dev: false
+ resolution:
+ integrity: sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=
+ /inherits/2.0.4:
+ dev: false
+ resolution:
+ integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+ /ip/2.0.0:
+ dev: false
+ resolution:
+ integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==
+ /ipaddr.js/1.9.0:
+ dev: false
+ engines:
+ node: '>= 0.10'
+ resolution:
+ integrity: sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==
+ /keygrip/1.1.0:
+ dependencies:
+ tsscmp: 1.0.6
+ dev: false
+ engines:
+ node: '>= 0.6'
+ resolution:
+ integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==
+ /media-typer/0.3.0:
+ dev: false
+ engines:
+ node: '>= 0.6'
+ resolution:
+ integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=
+ /memory-pager/1.5.0:
+ dev: false
+ optional: true
+ resolution:
+ integrity: sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==
+ /merge-descriptors/1.0.1:
+ dev: false
+ resolution:
+ integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=
+ /methods/1.1.2:
+ dev: false
+ engines:
+ node: '>= 0.6'
+ resolution:
+ integrity: sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=
+ /mime-db/1.42.0:
+ dev: false
+ engines:
+ node: '>= 0.6'
+ resolution:
+ integrity: sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==
+ /mime-types/2.1.25:
+ dependencies:
+ mime-db: 1.42.0
+ dev: false
+ engines:
+ node: '>= 0.6'
+ resolution:
+ integrity: sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==
+ /mime/1.6.0:
+ dev: false
+ engines:
+ node: '>=4'
+ hasBin: true
+ resolution:
+ integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+ /mongodb-connection-string-url/2.5.3:
+ dependencies:
+ '@types/whatwg-url': 8.2.2
+ whatwg-url: 11.0.0
+ dev: false
+ resolution:
+ integrity: sha512-f+/WsED+xF4B74l3k9V/XkTVj5/fxFH2o5ToKXd8Iyi5UhM+sO9u0Ape17Mvl/GkZaFtM0HQnzAG5OTmhKw+tQ==
+ /mongodb/4.10.0:
+ dependencies:
+ bson: 4.7.0
+ denque: 2.1.0
+ mongodb-connection-string-url: 2.5.3
+ socks: 2.7.0
+ dev: false
+ engines:
+ node: '>=12.9.0'
+ optionalDependencies:
+ saslprep: 1.0.3
+ resolution:
+ integrity: sha512-My2QxLTw0Cc1O9gih0mz4mqo145Jq4rLAQx0Glk/Ha9iYBzYpt4I2QFNRIh35uNFNfe8KFQcdwY1/HKxXBkinw==
+ /ms/2.0.0:
+ dev: false
+ resolution:
+ integrity: sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
+ /ms/2.1.1:
+ dev: false
+ resolution:
+ integrity: sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==
+ /ms/2.1.3:
+ dev: false
+ resolution:
+ integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+ /negotiator/0.6.2:
+ dev: false
+ engines:
+ node: '>= 0.6'
+ resolution:
+ integrity: sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==
+ /object-inspect/1.12.2:
+ dev: false
+ resolution:
+ integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==
+ /on-finished/2.3.0:
+ dependencies:
+ ee-first: 1.1.1
+ dev: false
+ engines:
+ node: '>= 0.8'
+ resolution:
+ integrity: sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=
+ /on-finished/2.4.1:
+ dependencies:
+ ee-first: 1.1.1
+ dev: false
+ engines:
+ node: '>= 0.8'
+ resolution:
+ integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
+ /on-headers/1.0.2:
+ dev: false
+ engines:
+ node: '>= 0.8'
+ resolution:
+ integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==
+ /parseurl/1.3.3:
+ dev: false
+ engines:
+ node: '>= 0.8'
+ resolution:
+ integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+ /path-to-regexp/0.1.7:
+ dev: false
+ resolution:
+ integrity: sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=
+ /proxy-addr/2.0.5:
+ dependencies:
+ forwarded: 0.1.2
+ ipaddr.js: 1.9.0
+ dev: false
+ engines:
+ node: '>= 0.10'
+ resolution:
+ integrity: sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==
+ /punycode/2.1.1:
+ dev: false
+ engines:
+ node: '>=6'
+ resolution:
+ integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+ /qs/6.10.3:
+ dependencies:
+ side-channel: 1.0.4
+ dev: false
+ engines:
+ node: '>=0.6'
+ resolution:
+ integrity: sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==
+ /qs/6.7.0:
+ dev: false
+ engines:
+ node: '>=0.6'
+ resolution:
+ integrity: sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==
+ /range-parser/1.2.1:
+ dev: false
+ engines:
+ node: '>= 0.6'
+ resolution:
+ integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+ /raw-body/2.4.0:
+ dependencies:
+ bytes: 3.1.0
+ http-errors: 1.7.2
+ iconv-lite: 0.4.24
+ unpipe: 1.0.0
+ dev: false
+ engines:
+ node: '>= 0.8'
+ resolution:
+ integrity: sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==
+ /raw-body/2.5.1:
+ dependencies:
+ bytes: 3.1.2
+ http-errors: 2.0.0
+ iconv-lite: 0.4.24
+ unpipe: 1.0.0
+ dev: false
+ engines:
+ node: '>= 0.8'
+ resolution:
+ integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==
+ /safe-buffer/5.1.2:
+ dev: false
+ resolution:
+ integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+ /safe-buffer/5.2.1:
+ dev: false
+ resolution:
+ integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+ /safer-buffer/2.1.2:
+ dev: false
+ resolution:
+ integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+ /saslprep/1.0.3:
+ dependencies:
+ sparse-bitfield: 3.0.3
+ dev: false
+ engines:
+ node: '>=6'
+ optional: true
+ resolution:
+ integrity: sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==
+ /send/0.17.1:
+ dependencies:
+ debug: 2.6.9
+ depd: 1.1.2
+ destroy: 1.0.4
+ encodeurl: 1.0.2
+ escape-html: 1.0.3
+ etag: 1.8.1
+ fresh: 0.5.2
+ http-errors: 1.7.3
+ mime: 1.6.0
+ ms: 2.1.1
+ on-finished: 2.3.0
+ range-parser: 1.2.1
+ statuses: 1.5.0
+ dev: false
+ engines:
+ node: '>= 0.8.0'
+ resolution:
+ integrity: sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==
+ /serve-static/1.14.1:
+ dependencies:
+ encodeurl: 1.0.2
+ escape-html: 1.0.3
+ parseurl: 1.3.3
+ send: 0.17.1
+ dev: false
+ engines:
+ node: '>= 0.8.0'
+ resolution:
+ integrity: sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==
+ /setprototypeof/1.1.1:
+ dev: false
+ resolution:
+ integrity: sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==
+ /setprototypeof/1.2.0:
+ dev: false
+ resolution:
+ integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
+ /side-channel/1.0.4:
+ dependencies:
+ call-bind: 1.0.2
+ get-intrinsic: 1.1.3
+ object-inspect: 1.12.2
+ dev: false
+ resolution:
+ integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+ /smart-buffer/4.2.0:
+ dev: false
+ engines:
+ node: '>= 6.0.0'
+ npm: '>= 3.0.0'
+ resolution:
+ integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==
+ /socks/2.7.0:
+ dependencies:
+ ip: 2.0.0
+ smart-buffer: 4.2.0
+ dev: false
+ engines:
+ node: '>= 10.13.0'
+ npm: '>= 3.0.0'
+ resolution:
+ integrity: sha512-scnOe9y4VuiNUULJN72GrM26BNOjVsfPXI+j+98PkyEfsIXroa5ofyjT+FzGvn/xHs73U2JtoBYAVx9Hl4quSA==
+ /sparse-bitfield/3.0.3:
+ dependencies:
+ memory-pager: 1.5.0
+ dev: false
+ optional: true
+ resolution:
+ integrity: sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==
+ /statuses/1.5.0:
+ dev: false
+ engines:
+ node: '>= 0.6'
+ resolution:
+ integrity: sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=
+ /statuses/2.0.1:
+ dev: false
+ engines:
+ node: '>= 0.8'
+ resolution:
+ integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
+ /toidentifier/1.0.0:
+ dev: false
+ engines:
+ node: '>=0.6'
+ resolution:
+ integrity: sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
+ /toidentifier/1.0.1:
+ dev: false
+ engines:
+ node: '>=0.6'
+ resolution:
+ integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
+ /tr46/3.0.0:
+ dependencies:
+ punycode: 2.1.1
+ dev: false
+ engines:
+ node: '>=12'
+ resolution:
+ integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==
+ /tsscmp/1.0.6:
+ dev: false
+ engines:
+ node: '>=0.6.x'
+ resolution:
+ integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==
+ /type-is/1.6.18:
+ dependencies:
+ media-typer: 0.3.0
+ mime-types: 2.1.25
+ dev: false
+ engines:
+ node: '>= 0.6'
+ resolution:
+ integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+ /unpipe/1.0.0:
+ dev: false
+ engines:
+ node: '>= 0.8'
+ resolution:
+ integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
+ /utils-merge/1.0.1:
+ dev: false
+ engines:
+ node: '>= 0.4.0'
+ resolution:
+ integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=
+ /vary/1.1.2:
+ dev: false
+ engines:
+ node: '>= 0.8'
+ resolution:
+ integrity: sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
+ /webidl-conversions/7.0.0:
+ dev: false
+ engines:
+ node: '>=12'
+ resolution:
+ integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==
+ /whatwg-url/11.0.0:
+ dependencies:
+ tr46: 3.0.0
+ webidl-conversions: 7.0.0
+ dev: false
+ engines:
+ node: '>=12'
+ resolution:
+ integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==
+registry: 'https://registry.npmjs.org/'
+shrinkwrapMinorVersion: 9
+shrinkwrapVersion: 3
+specifiers:
+ body-parser: ^1.20.0
+ cookie-session: ^2.0.0
+ express: ^4.17.1
+ mongodb: ^4.10.0
diff --git a/views/index.html b/views/index.html
new file mode 100644
index 000000000..b2657aece
--- /dev/null
+++ b/views/index.html
@@ -0,0 +1,35 @@
+
+
+
+
+
+ CS4241 Assignment 3: Login Page
+
+
+
+
+
+
+
+
+
+
+ Login
+
+
+
\ No newline at end of file
diff --git a/views/logger.html b/views/logger.html
new file mode 100644
index 000000000..bc2d1ec67
--- /dev/null
+++ b/views/logger.html
@@ -0,0 +1,52 @@
+
+
+
+
+ CS4241 Assignment 3: Chore Logger
+
+
+
+
+
+
+
+
+
+
+
+ Chore Logger
+ Welcome!
+
+ Please select a chore from the dropdown menu and then enter the number of hours spent completeing that chore (between 0-24 hours) and hit submit.
+ To modify an entry, reselect a chore and reenter the number of hours and then select the modify button inline with the entry you are trying to change.
+ To delete an entry, select the delete button inline with the entry you are trying to remove. This action is not reversible.
+
+
+
+
+ loading chores…
+
+
+
\ No newline at end of file