// outside events
(function($,c,b){$.map("click dblclick mousemove mousedown mouseup mouseover mouseout change select submit keydown keypress keyup".split(" "),function(d){a(d)});a("focusin","focus"+b);a("focusout","blur"+b);$.addOutsideEvent=a;function a(g,e){e=e||g+b;var d=$(),h=g+"."+e+"-special-event";$.event.special[e]={setup:function(){d=d.add(this);if(d.length===1){$(c).bind(h,f)}},teardown:function(){d=d.not(this);if(d.length===0){$(c).unbind(h)}},add:function(i){var j=i.handler;i.handler=function(l,k){l.target=k;j.apply(this,arguments)}}};function f(i){$(d).each(function(){var j=$(this);if(this!==i.target&&!j.has(i.target).length){j.triggerHandler(e,[i.target])}})}}})(jQuery,document,"outside");

// js cookie
!function(e){var n=!1
if("function"==typeof define&&define.amd&&(define(e),n=!0),"object"==typeof exports&&(module.exports=e(),n=!0),!n){var t=window.Cookies,o=window.Cookies=e()
o.noConflict=function(){return window.Cookies=t,o}}}(function(){function e(){for(var e=0,n={};e<arguments.length;e++){var t=arguments[e]
for(var o in t)n[o]=t[o]}return n}function n(t){function o(n,r,i){var c
if("undefined"!=typeof document){if(arguments.length>1){if(i=e({path:"/"},o.defaults,i),"number"==typeof i.expires){var a=new Date
a.setMilliseconds(a.getMilliseconds()+864e5*i.expires),i.expires=a}i.expires=i.expires?i.expires.toUTCString():""
try{c=JSON.stringify(r),/^[\{\[]/.test(c)&&(r=c)}catch(s){}r=t.write?t.write(r,n):encodeURIComponent(r+"").replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent),n=encodeURIComponent(n+""),n=n.replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent),n=n.replace(/[\(\)]/g,escape)
var f=""
for(var u in i)i[u]&&(f+="; "+u,i[u]!==!0&&(f+="="+i[u]))
return document.cookie=n+"="+r+f}n||(c={})
for(var p=document.cookie?document.cookie.split("; "):[],d=/(%[0-9A-Z]{2})+/g,l=0;l<p.length;l++){var m=p[l].split("="),g=m.slice(1).join("=")
'"'===g.charAt(0)&&(g=g.slice(1,-1))
try{var C=m[0].replace(d,decodeURIComponent)
if(g=t.read?t.read(g,C):t(g,C)||g.replace(d,decodeURIComponent),this.json)try{g=JSON.parse(g)}catch(s){}if(n===C){c=g
break}n||(c[C]=g)}catch(s){}}return c}}return o.set=o,o.get=function(e){return o.call(o,e)},o.getJSON=function(){return o.apply({json:!0},[].slice.call(arguments))},o.defaults={},o.remove=function(n,t){o(n,"",e(t,{expires:-1}))},o.withConverter=n,o}return n(function(){})});

// lazysizes
!function(a,b){var c=b(a,a.document);a.lazySizes=c,"object"==typeof module&&module.exports?module.exports=c:"function"==typeof define&&define.amd&&define(c)}(window,function(a,b){"use strict";if(b.getElementsByClassName){var c,d=b.documentElement,e=a.HTMLPictureElement&&"sizes"in b.createElement("img"),f="addEventListener",g="getAttribute",h=a[f],i=a.setTimeout,j=a.requestAnimationFrame||i,k=/^picture$/i,l=["load","error","lazyincluded","_lazyloaded"],m={},n=Array.prototype.forEach,o=function(a,b){return m[b]||(m[b]=new RegExp("(\\s|^)"+b+"(\\s|$)")),m[b].test(a[g]("class")||"")&&m[b]},p=function(a,b){o(a,b)||a.setAttribute("class",(a[g]("class")||"").trim()+" "+b)},q=function(a,b){var c;(c=o(a,b))&&a.setAttribute("class",(a[g]("class")||"").replace(c," "))},r=function(a,b,c){var d=c?f:"removeEventListener";c&&r(a,b),l.forEach(function(c){a[d](c,b)})},s=function(a,c,d,e,f){var g=b.createEvent("CustomEvent");return g.initCustomEvent(c,!e,!f,d||{}),a.dispatchEvent(g),g},t=function(b,d){var f;!e&&(f=a.picturefill||c.pf)?f({reevaluate:!0,elements:[b]}):d&&d.src&&(b.src=d.src)},u=function(a,b){return(getComputedStyle(a,null)||{})[b]},v=function(a,b,d){for(d=d||a.offsetWidth;d<c.minSize&&b&&!a._lazysizesWidth;)d=b.offsetWidth,b=b.parentNode;return d},w=function(b){var c,d=0,e=a.Date,f=function(){c=!1,d=e.now(),b()},g=function(){i(f)},h=function(){j(g)};return function(){if(!c){var a=125-(e.now()-d);c=!0,6>a&&(a=6),i(h,a)}}},x=function(){var e,l,m,v,x,z,A,B,C,D,E,F,G,H,I,J=/^img$/i,K=/^iframe$/i,L="onscroll"in a&&!/glebot/.test(navigator.userAgent),M=0,N=0,O=0,P=0,Q=0,R=function(a){O--,a&&a.target&&r(a.target,R),(!a||0>O||!a.target)&&(O=0)},S=function(a,c){var e,f=a,g="hidden"==u(b.body,"visibility")||"hidden"!=u(a,"visibility");for(C-=c,F+=c,D-=c,E+=c;g&&(f=f.offsetParent)&&f!=b.body&&f!=d;)g=(u(f,"opacity")||1)>0,g&&"visible"!=u(f,"overflow")&&(e=f.getBoundingClientRect(),g=E>e.left&&D<e.right&&F>e.top-1&&C<e.bottom+1);return g},T=function(){var a,b,f,h,i,j,k,n,o;if((x=c.loadMode)&&8>O&&(a=e.length)){b=0,P++,null==H&&("expand"in c||(c.expand=d.clientHeight>600?d.clientWidth>860?500:410:359),G=c.expand,H=G*c.expFactor),H>N&&1>O&&P>3&&x>2?(N=H,P=0):N=x>1&&P>2&&6>O?G:M;for(;a>b;b++)if(e[b]&&!e[b]._lazyRace)if(L)if((n=e[b][g]("data-expand"))&&(j=1*n)||(j=N),o!==j&&(A=innerWidth+j*I,B=innerHeight+j,k=-1*j,o=j),f=e[b].getBoundingClientRect(),(F=f.bottom)>=k&&(C=f.top)<=B&&(E=f.right)>=k*I&&(D=f.left)<=A&&(F||E||D||C)&&(m&&3>O&&!n&&(3>x||4>P)||S(e[b],j))){if($(e[b]),i=!0,O>9)break}else!i&&m&&!h&&4>O&&4>P&&x>2&&(l[0]||c.preloadAfterLoad)&&(l[0]||!n&&(F||E||D||C||"auto"!=e[b][g](c.sizesAttr)))&&(h=l[0]||e[b]);else $(e[b]);h&&!i&&$(h)}},U=w(T),V=function(a){p(a.target,c.loadedClass),q(a.target,c.loadingClass),r(a.target,W)},W=function(a){a={target:a.target},j(function(){V(a)})},X=function(a,b){try{a.contentWindow.location.replace(b)}catch(c){a.src=b}},Y=function(a){var b,d,e=a[g](c.srcsetAttr);(b=c.customMedia[a[g]("data-media")||a[g]("media")])&&a.setAttribute("media",b),e&&a.setAttribute("srcset",e),b&&(d=a.parentNode,d.insertBefore(a.cloneNode(),a),d.removeChild(a))},Z=function(){var a,b=[],c=function(){for(;b.length;)b.shift()();a=!1},d=function(d){b.push(d),a||(a=!0,j(c))};return{add:d,run:c}}(),$=function(a){var b,d,e,f,h,l,u,w=J.test(a.nodeName),x=w&&(a[g](c.sizesAttr)||a[g]("sizes")),z="auto"==x;(!z&&m||!w||!a.src&&!a.srcset||a.complete||o(a,c.errorClass))&&(z&&(u=a.offsetWidth),a._lazyRace=!0,O++,c.rC&&(u=c.rC(a,u)||u),Z.add(function(){Q++,(h=s(a,"lazybeforeunveil")).defaultPrevented||(x&&(z?(y.updateElem(a,!0,u),p(a,c.autosizesClass)):a.setAttribute("sizes",x)),d=a[g](c.srcsetAttr),b=a[g](c.srcAttr),w&&(e=a.parentNode,f=e&&k.test(e.nodeName||"")),l=h.detail.firesLoad||"src"in a&&(d||b||f),h={target:a},l&&(r(a,R,!0),clearTimeout(v),v=i(R,2500),p(a,c.loadingClass),r(a,W,!0)),f&&n.call(e.getElementsByTagName("source"),Y),d?a.setAttribute("srcset",d):b&&!f&&(K.test(a.nodeName)?X(a,b):a.src=b),(d||f)&&t(a,{src:b})),j(function(){a._lazyRace&&delete a._lazyRace,q(a,c.lazyClass),(!l||a.complete)&&(l?R(h):O--,V(h))})}))},_=function(){if(!m){if(Date.now()-z<999)return void i(_,999);var a,b=function(){c.loadMode=3,U()};m=!0,c.loadMode=3,Q?U():i(function(){T(),Z.run()}),h("scroll",function(){3==c.loadMode&&(c.loadMode=2),clearTimeout(a),a=i(b,99)},!0)}};return{_:function(){z=Date.now(),e=b.getElementsByClassName(c.lazyClass),l=b.getElementsByClassName(c.lazyClass+" "+c.preloadClass),I=c.hFac,h("scroll",U,!0),h("resize",U,!0),a.MutationObserver?new MutationObserver(U).observe(d,{childList:!0,subtree:!0,attributes:!0}):(d[f]("DOMNodeInserted",U,!0),d[f]("DOMAttrModified",U,!0),setInterval(U,999)),h("hashchange",U,!0),["focus","mouseover","click","load","transitionend","animationend","webkitAnimationEnd"].forEach(function(a){b[f](a,U,!0)}),/d$|^c/.test(b.readyState)?_():(h("load",_),b[f]("DOMContentLoaded",U),i(_,2e4)),U(e.length>0)},checkElems:U,unveil:$}}(),y=function(){var a,d=function(a,b,c){var d,e,f,g,h=a.parentNode;if(h&&(c=v(a,h,c),g=s(a,"lazybeforesizes",{width:c,dataAttr:!!b}),!g.defaultPrevented&&(c=g.detail.width,c&&c!==a._lazysizesWidth))){if(a._lazysizesWidth=c,c+="px",a.setAttribute("sizes",c),k.test(h.nodeName||""))for(d=h.getElementsByTagName("source"),e=0,f=d.length;f>e;e++)d[e].setAttribute("sizes",c);g.detail.dataAttr||t(a,g.detail)}},e=function(){var b,c=a.length;if(c)for(b=0;c>b;b++)d(a[b])},f=w(e);return{_:function(){a=b.getElementsByClassName(c.autosizesClass),h("resize",f)},checkElems:f,updateElem:d}}(),z=function(){z.i||(z.i=!0,y._(),x._())};return function(){var b,d={lazyClass:"lazyload",loadedClass:"lazyloaded",loadingClass:"lazyloading",preloadClass:"lazypreload",errorClass:"lazyerror",autosizesClass:"lazyautosizes",srcAttr:"data-src",srcsetAttr:"data-srcset",sizesAttr:"data-sizes",minSize:40,customMedia:{},init:!0,expFactor:1.7,hFac:.8,loadMode:2};c=a.lazySizesConfig||a.lazysizesConfig||{};for(b in d)b in c||(c[b]=d[b]);a.lazySizesConfig=c,i(function(){c.init&&z()})}(),{cfg:c,autoSizer:y,loader:x,init:z,uP:t,aC:p,rC:q,hC:o,fire:s,gW:v}}});

// ls customize for Outsmart
/* JavaScript File                                                  */
/* lazysizes.js                                                     */
/* https://afarkas.github.io/lazysizes/                             */
/* Version 1.5.0-RC3                                                */


!function(a,b){var c=b(a,a.document);a.lazySizes=c,"object"==typeof module&&module.exports?module.exports=c:"function"==typeof define&&define.amd&&define(c)}(window,function(a,b){"use strict";if(b.getElementsByClassName){var c,d=b.documentElement,e=a.HTMLPictureElement&&"sizes"in b.createElement("img"),f="addEventListener",g="getAttribute",h=a[f],i=a.setTimeout,j=a.requestAnimationFrame||i,k=/^picture$/i,l=["load","error","lazyincluded","_lazyloaded"],m={},n=Array.prototype.forEach,o=function(a,b){return m[b]||(m[b]=new RegExp("(\\s|^)"+b+"(\\s|$)")),m[b].test(a[g]("class")||"")&&m[b]},p=function(a,b){o(a,b)||a.setAttribute("class",(a[g]("class")||"").trim()+" "+b)},q=function(a,b){var c;(c=o(a,b))&&a.setAttribute("class",(a[g]("class")||"").replace(c," "))},r=function(a,b,c){var d=c?f:"removeEventListener";c&&r(a,b),l.forEach(function(c){a[d](c,b)})},s=function(a,c,d,e,f){var g=b.createEvent("CustomEvent");return g.initCustomEvent(c,!e,!f,d||{}),a.dispatchEvent(g),g},t=function(b,d){var f;!e&&(f=a.picturefill||c.pf)?f({reevaluate:!0,elements:[b]}):d&&d.src&&(b.src=d.src)},u=function(a,b){return(getComputedStyle(a,null)||{})[b]},v=function(a,b,d){for(d=d||a.offsetWidth;d<c.minSize&&b&&!a._lazysizesWidth;)d=b.offsetWidth,b=b.parentNode;return d},w=function(b){var c,d=0,e=a.Date,f=function(){c=!1,d=e.now(),b()},g=function(){i(f)},h=function(){j(g)};return function(){if(!c){var a=125-(e.now()-d);c=!0,6>a&&(a=6),i(h,a)}}},x=function(){var e,l,m,v,x,z,A,B,C,D,E,F,G,H,I,J=/^img$/i,K=/^iframe$/i,L="onscroll"in a&&!/glebot/.test(navigator.userAgent),M=0,N=0,O=0,P=0,Q=0,R=function(a){O--,a&&a.target&&r(a.target,R),(!a||0>O||!a.target)&&(O=0)},S=function(a,c){var e,f=a,g="hidden"==u(b.body,"visibility")||"hidden"!=u(a,"visibility");for(C-=c,F+=c,D-=c,E+=c;g&&(f=f.offsetParent)&&f!=b.body&&f!=d;)g=(u(f,"opacity")||1)>0,g&&"visible"!=u(f,"overflow")&&(e=f.getBoundingClientRect(),g=E>e.left&&D<e.right&&F>e.top-1&&C<e.bottom+1);return g},T=function(){var a,b,f,h,i,j,k,n,o;if((x=c.loadMode)&&8>O&&(a=e.length)){b=0,P++,null==H&&("expand"in c||(c.expand=d.clientHeight>600?d.clientWidth>860?500:410:359),G=c.expand,H=G*c.expFactor),H>N&&1>O&&P>3&&x>2?(N=H,P=0):N=x>1&&P>2&&6>O?G:M;for(;a>b;b++)if(e[b]&&!e[b]._lazyRace)if(L)if((n=e[b][g]("data-expand"))&&(j=1*n)||(j=N),o!==j&&(A=innerWidth+j*I,B=innerHeight+j,k=-1*j,o=j),f=e[b].getBoundingClientRect(),(F=f.bottom)>=k&&(C=f.top)<=B&&(E=f.right)>=k*I&&(D=f.left)<=A&&(F||E||D||C)&&(m&&3>O&&!n&&(3>x||4>P)||S(e[b],j))){if($(e[b]),i=!0,O>9)break}else!i&&m&&!h&&4>O&&4>P&&x>2&&(l[0]||c.preloadAfterLoad)&&(l[0]||!n&&(F||E||D||C||"auto"!=e[b][g](c.sizesAttr)))&&(h=l[0]||e[b]);else $(e[b]);h&&!i&&$(h)}},U=w(T),V=function(a){p(a.target,c.loadedClass),q(a.target,c.loadingClass),r(a.target,W)},W=function(a){a={target:a.target},j(function(){V(a)})},X=function(a,b){try{a.contentWindow.location.replace(b)}catch(c){a.src=b}},Y=function(a){var b,d,e=a[g](c.srcsetAttr);(b=c.customMedia[a[g]("data-media")||a[g]("media")])&&a.setAttribute("media",b),e&&a.setAttribute("srcset",e),b&&(d=a.parentNode,d.insertBefore(a.cloneNode(),a),d.removeChild(a))},Z=function(){var a,b=[],c=function(){for(;b.length;)b.shift()();a=!1},d=function(d){b.push(d),a||(a=!0,j(c))};return{add:d,run:c}}(),$=function(a){var b,d,e,f,h,l,u,w=J.test(a.nodeName),x=w&&(a[g](c.sizesAttr)||a[g]("sizes")),z="auto"==x;(!z&&m||!w||!a.src&&!a.srcset||a.complete||o(a,c.errorClass))&&(z&&(u=a.offsetWidth),a._lazyRace=!0,O++,c.rC&&(u=c.rC(a,u)||u),Z.add(function(){Q++,(h=s(a,"lazybeforeunveil")).defaultPrevented||(x&&(z?(y.updateElem(a,!0,u),p(a,c.autosizesClass)):a.setAttribute("sizes",x)),d=a[g](c.srcsetAttr),b=a[g](c.srcAttr),w&&(e=a.parentNode,f=e&&k.test(e.nodeName||"")),l=h.detail.firesLoad||"src"in a&&(d||b||f),h={target:a},l&&(r(a,R,!0),clearTimeout(v),v=i(R,2500),p(a,c.loadingClass),r(a,W,!0)),f&&n.call(e.getElementsByTagName("source"),Y),d?a.setAttribute("srcset",d):b&&!f&&(K.test(a.nodeName)?X(a,b):a.src=b),(d||f)&&t(a,{src:b})),j(function(){a._lazyRace&&delete a._lazyRace,q(a,c.lazyClass),(!l||a.complete)&&(l?R(h):O--,V(h))})}))},_=function(){if(!m){if(Date.now()-z<999)return void i(_,999);var a,b=function(){c.loadMode=3,U()};m=!0,c.loadMode=3,Q?U():i(function(){T(),Z.run()}),h("scroll",function(){3==c.loadMode&&(c.loadMode=2),clearTimeout(a),a=i(b,99)},!0)}};return{_:function(){z=Date.now(),e=b.getElementsByClassName(c.lazyClass),l=b.getElementsByClassName(c.lazyClass+" "+c.preloadClass),I=c.hFac,h("scroll",U,!0),h("resize",U,!0),a.MutationObserver?new MutationObserver(U).observe(d,{childList:!0,subtree:!0,attributes:!0}):(d[f]("DOMNodeInserted",U,!0),d[f]("DOMAttrModified",U,!0),setInterval(U,999)),h("hashchange",U,!0),["focus","mouseover","click","load","transitionend","animationend","webkitAnimationEnd"].forEach(function(a){b[f](a,U,!0)}),/d$|^c/.test(b.readyState)?_():(h("load",_),b[f]("DOMContentLoaded",U),i(_,2e4)),U(e.length>0)},checkElems:U,unveil:$}}(),y=function(){var a,d=function(a,b,c){var d,e,f,g,h=a.parentNode;if(h&&(c=v(a,h,c),g=s(a,"lazybeforesizes",{width:c,dataAttr:!!b}),!g.defaultPrevented&&(c=g.detail.width,c&&c!==a._lazysizesWidth))){if(a._lazysizesWidth=c,c+="px",a.setAttribute("sizes",c),k.test(h.nodeName||""))for(d=h.getElementsByTagName("source"),e=0,f=d.length;f>e;e++)d[e].setAttribute("sizes",c);g.detail.dataAttr||t(a,g.detail)}},e=function(){var b,c=a.length;if(c)for(b=0;c>b;b++)d(a[b])},f=w(e);return{_:function(){a=b.getElementsByClassName(c.autosizesClass),h("resize",f)},checkElems:f,updateElem:d}}(),z=function(){z.i||(z.i=!0,y._(),x._())};return function(){var b,d={lazyClass:"lazyload",loadedClass:"lazyloaded",loadingClass:"lazyloading",preloadClass:"lazypreload",errorClass:"lazyerror",autosizesClass:"lazyautosizes",srcAttr:"data-src",srcsetAttr:"data-srcset",sizesAttr:"data-sizes",minSize:40,customMedia:{},init:!0,expFactor:1.7,hFac:.8,loadMode:2};c=a.lazySizesConfig||a.lazysizesConfig||{};for(b in d)b in c||(c[b]=d[b]);a.lazySizesConfig=c,i(function(){c.init&&z()})}(),{cfg:c,autoSizer:y,loader:x,init:z,uP:t,aC:p,rC:q,hC:o,fire:s,gW:v}}});

var lazysizes=function(a,e){var t=[function(a,e,t){t.lazySizesConfig.lazyClass="lazyload",t.lazySizesConfig.loadedClass="lazyloaded",t.lazySizesConfig.loadingClass="lazyloading"
var i=function(a){for(var e={},t=a.split(", "),i=0;i<t.length;i++){var o=t[i].split(" ")
1===o.length?e[0]=o[0]:e[parseInt(o[1],10)]=o[0]}return e}
e.addEventListener("lazybeforeunveil",function(e){var o=a(e.target)
if(o.hasClass("soc-icon-extern")){e.defaultPrevented=!0
var s=o.attr("data-src")
o.removeAttr("data-src"),o.removeClass("soc-icon-extern")
var n=new Image
n.onerror=function(){o.attr("src","/img/avatar.png")},n.onload=function(){o.attr("src",this.src)},n.src=s}else{var r=o.closest("figure")
if(r.length)if(r.hasClass("cover-photo")){var l=i(o.attr("data-srcset")),c=t.devicePixelRatio>=1.5,d=void 0===l[t.devicePixelRatio]?l[c?2:1]:l[t.devicePixelRatio]
r.css("background-image",'url("'+d+'")')}else r.hasClass("post-photo")&&"v"===r.data("type")&&t.setTimeout(function(){r.removeClass("photo").addClass("video")},250)}})}],i=function(){o()},o=function(){t.forEach(function(t){t(a,e,window)})}
return{init:i}}(jQuery,document,window)
lazysizes.init()

var OutsmartForm = (function($, document, window) {

	// functions
	var removeTimer = null;
	var _clearForm = function() {

		$('body').removeClass('output-visible');
		$('.layout-output').find('.alert').remove();
	};
	var getExclamation = function() {

		var ex = ['Ooooops!', 'Uh oh!', 'Hmmmmm...', 'Ouch!', 'Sorry.', 'Oh no!'];
		return ex[Math.floor(Math.random() * ex.length)];

	};
	var clearForm = function() {

		clearTimeout(removeTimer);
		$('.form-error').removeClass('form-error');
		_clearForm();
	};
	var unsetLoading = function(button) {

		button
			.removeClass('active active-loading')
			.removeAttr('disabled')
			.find('.loading').remove();

		// enable buttons in dialog-group
		// disable buttons in dialog-group
		$('.dialog-action')
			.find('button, a')
			.removeAttr('disabled')
			.css('pointer-events', 'auto');
	};
	var setLoading = function(button) {

		var loader = '<strong class="loading"><span></span><span></span><span></span></strong>';
		button
			.attr('disabled', 'disabled')
			.addClass('active active-loading')
			.append(loader);

		// disable buttons in dialog-group
		$('.dialog-action')
			.find('button, a')
			.attr('disabled', 'disabled')
			.css('pointer-events', 'none');
	};
	var removeWarning = function(timeout) {

		clearTimeout(removeTimer);

		if(timeout) {
			removeTimer = window.setTimeout(_clearForm, timeout);
		}
		else {
			_clearForm();
		}
	};
	var validateEmail = function(email) {

		return email && /.+@.+\..+/.test(email);
	};
	var validateString = function(e) {
		return (e && (e + '').trim()) ? true : false;
	};
	var fieldWarning = function(field) {

		field.closest('.form-group').addClass('form-error');
	};
	var hideCat = function(cat) {

		$.ajax({
			type: 'POST',
			url: '/ajax/hide-alert',
			data: 'cat=' + cat
		});
	};
	var showError = function(obj) {

		if(obj.clearForm) {

			clearForm();
		}

		if(obj.unsetLoading) {

			unsetLoading(obj.unsetLoading);
		}

		if(!obj.color) obj.color = 'alert-danger';
		if(obj.field) fieldWarning(obj.field);
		if(typeof(obj.timeout) === 'undefined' || isNaN(obj.timeout)) obj.timeout = 3000;
		if(typeof(obj.closeButton) === 'undefined') obj.closeButton = true;

		var html = '<div class="alert ' + obj.color + ' alert-dismissible" role="alert"><i class="icon i-action-info-circle i-2x"></i>' + obj.msg;
		if(obj.closeButton) {
			html += '<button type="button" class="close" data-dismiss="alert" aria-label="Close"';
			if(obj.hide) {
				html += ' data-hide="1"';
			}
			html += '><span aria-hidden="true">&times;</span></button>';
		}
		html += '</div>';

		$('.layout-output').empty().append(html);
		$('body').addClass('output-visible');
		if(obj.closeButton) {
			$('.layout-output').find('.close').click(function(e) {

				e.preventDefault();
				var $this = $(this);
				clearTimeout(removeTimer);
				if($this.data('hide') === 1) {
					hideCat($('body').data('cat'));
				}
				$this.closest('.alert').fadeOut(300).remove();
				$('body').removeClass('output-visible');
			});
		}

		if(obj.timeout) {

			removeWarning(obj.timeout);
		}
	};

	(function() {

		// look for #autoload-alert div
		var autoload = $('#autoload-msg');
		if(autoload.length === 1 && autoload.data('msg')) {

			var msg = autoload.data('msg')
			var color = autoload.data('color') || 'text-danger';
			var timeout = autoload.data('timeout') || 3000;
			var opts = {msg:msg,color:color,timeout:timeout};

			if(autoload.data('hide') === 1) {
				opts.hide = 1;
			}

			showError(opts);
		}

	})();
	
	return {
		showError: showError,
		removeWarning: removeWarning,
		clearForm: clearForm,
		setLoading: setLoading,
		unsetLoading: unsetLoading,
		fieldWarning: fieldWarning,
		validateEmail: validateEmail,
		getExclamation: getExclamation,
		validateString: validateString
	};

})(jQuery, document, window);

// Outsmart!
var Outsmart = (function($, document, window) {

	var server =
		window.location.hostname.indexOf('outsmart.io') > -1 ? 'io' : 'dev';

	var closeModal = function(modal) {

		modal = modal ? modal : $('.modal');
		var n = modal.data('name');

		$('.modal-dialog, .calendar').off('clickoutside'); // remove clickoutside
		$('body').removeClass(n + '-open');
		modal.removeClass(n + '-active ajax-posted');

		var $form = modal.find('form');
		if($form.length) {
			$form.get(0).reset();
			$form
				.find('.form-group')
				.removeClass('form-error')
				.find('.form-feedback')
				.remove();
		}
	};

	var openModal = function(body, modal) {

		body.addClass('modal-open');
		modal.addClass('modal-active').removeAttr('style');

		setTimeout(function() {
			body.on('clickoutside', '.modal-dialog', function(e) {
				e.preventDefault();
				closeModal(modal);
			});
		}, 50);

		$('.modal-close, .modal-dismiss, [data-dismiss]', modal).on('click', function(e) {
			e.preventDefault();
			closeModal(modal);
		});
	};

	var setButtonLoading = function($btn) {

        var loader = '<strong class="loading"><span></span><span></span><span></span></strong>';
        $btn.addClass('active active-loading').append(loader).attr('disabled', 'disabled');
	};

	var unsetButtonLoading = function($btn) {

		$btn.removeAttr('disabled').removeClass('active active-loading').find('.loading').remove();
	};

	var showErr = function($el, msg, $btn) {

		if($el) $el.closest('.form-group').addClass('form-error');
		$('.first-el').prepend('<div class="alert alert-danger" role="alert">' + msg + '</div>');
		$('body').scrollTop(0);
		unsetButtonLoading($btn);
	};

	// functions
	var evt = [
		
		// select all
		function($, document) {

			var $selectAll = $('.select-all');
			if(!$selectAll.length) return;
			$selectAll.each(function() {

				var $this = $(this);
				$this.on('click', function(e) {

					e.preventDefault();
					var target = $this.data('target');
					var all = true;
					if($this.data('none')) {
						all = false;
						$this.text('Select All');
						$this.data('none', null)
					}
					else {
						$this.data('none', 1);
						$this.text('Unselect All');
					}
					$('ul[data-group="' + target + '"] input').prop('checked', all);
				});
			});
		},

		// drawer - controls the drawer element and applies css transitions
		function($, document) {
			
			var $body = $('body');
			var $bulletin = $('.layout-bulletin');
			var $drawer = $('.layout-drawer');

			var moving = (function(document) {

				var el = document.createElement('div');
				var transitions = { 'transition': 'transitionend', 'WebkitTransition': 'webkitTransitionEnd', 'MozTransition': 'transitionend', 'OTransition': 'otransitionend' };

				for(var t in transitions) { if (typeof el.style[t] !== 'undefined') { return transitions[t]; } }

			})(document);

			var animating = function(object, type) {

				$body.addClass(type + '-animating');
				$body.addClass('move-' + ($body.hasClass(type + '-visible') ? 'right' : 'left'));

				object.on(moving, function() {

					$body.removeClass(type + '-animating move-left move-right').toggleClass(type + '-visible');
					object.off(moving);
				});
			};
			
			$('.notify-button, .noti-close').on('click', function() {
				animating($bulletin, 'bulletin');
			});

			$('.drawer-button, .drawer-close').on('click', function() {
				animating($drawer, 'drawer');
			});

        	$('.layout-backdrop').on('click', function() {
        		if($body.hasClass('drawer-visible')) {
        			animating($drawer, 'drawer');
        		}
        	});
		},

		function($) {

			var switching = function($this) {

				var $table = $('#' + $this.data('switch')),
					option = $this.data('option');
					
				if($table !== 'undefined') {

					if(option === 'detail') {
						$table.addClass('details-visible');
					}
					else {
						$table.removeClass('details-visible');
					}
				}
			};

			$('.btn-switch').each(function () {

				var $group = $(this),
					$button = $('.btn', $group);

				$button.on('click', (function () { 

					$button.removeClass('active');
					$(this).addClass('active').blur();

					switching($(this));
				}));
			});
		},

		// anchor - performs a smooth page scroll to an anchor on the same page

		function($) {

			$('a[href*=#]:not([href=#],[data-toggle="modal"])').click(function () { 

				if (location.pathname.replace(/^\//, '') === this.pathname.replace(/^\//, '') || location.hostname === this.hostname) { 
					
					var target = $(this.hash);
					
					target = target.length ? target : $('[name=' + this.hash.slice(1) + ']');
					
					if (target.length) { $('html, body').animate({ scrollTop: target.offset().top }, 600); return false; } 
				} 
			});
		},

		// dismiss - temporarily dismisses a dialog or alert box

		function($) {

			$('body').on('click', '[data-dismiss]:not([data-dismiss="tooltip"],[data-dismiss="modal"],[data-dismiss="date-dialog"])', function(e) {

				e.preventDefault();
				var dismiss = $(this).data('dismiss');
				$(this).closest('.' + dismiss).fadeOut(300);
			});
		},

		// tabs - handles a tab menu functionality

		function($) {

			$('[data-toggle="tab"]').click(function () { 

				var $action = $(this),
					$tabs = $('#' + $action.data('target')),
					$tab = $('#' + $action.attr('aria-controls')),
					$list = $action.closest('.tab-list');

				if ($list.hasClass('tab-toggle')) {

					$list.find('li').addClass('active');
					$action.parent().removeClass('active');
				}
				else {

					$list.find('li').removeClass('active');
					$action.parent().addClass('active');
				}

				$tabs.find('.tab').removeClass('active');
				$tab.addClass('active');
			});
		},

		function($) {

			$('.show-more-rows').on('click', function(e) {

				e.preventDefault();
				var $this = $(this);
				var target = $this.data('target');
				var $table = $('#' + target);
				var show = $table.hasClass('show-hidden');
				if(show) {
					$table.removeClass('show-hidden');
					$this.text($this.data('more'));
				}
				else {
					$table.addClass('show-hidden');
					$this.text($this.data('less'));
				}
			});
		},

		// sections - handles a swap section functionality

		function($) {

			$('a[data-toggle="section"], button[data-toggle="section"]').click(function () { 

				// combined
				$('#' + $(this).attr('aria-controls'))
					.find('.toggle')
						.toggleClass('toggle-visible toggle-hidden');
			});
		},

		// user menu - handles the drop down action

		function($) {

			$('div.user-menu .account-user, div.user-menu .account-avatar').on('click', (function () {

				var action = $(this);
				var menu = action.closest('.user-menu');

				menu.addClass('nav-visible');
				menu.bind('clickoutside', function() {
					menu.unbind('clickoutside').removeClass('nav-visible');
				});

				menu.find('.close').on('click', function () {
					menu.removeClass('nav-visible');
				});
				
			}));
		},

		// panel action - handles the drop down action

		function($) {

			$('ul.panel-action li a').each(function() {

				var action = $(this);
				var dropdown = action.parent();

				action.on('click', function() {

					dropdown.addClass('nav-visible');
					dropdown.bind('clickoutside', function() {
						dropdown.unbind('clickoutside').removeClass('nav-visible');
					});

				});
			});
		},

		// tab selection - handles the drop down action

		function($) {

			$('ul.tab-selection li a').each(function() {

				var action = $(this);
				var dropdown = action.parent();
				var selection = dropdown.find('.nav-action-menu');

				action.on('click', function() {

					dropdown.addClass('nav-visible');
					dropdown.bind('clickoutside', function() {
						dropdown.unbind('clickoutside').removeClass('nav-visible');
					});

				});

				$('a', selection).on('click', function() {

					var label = $(this).data('label');
					var metrics = $(this).data('metrics');

					action.text(label);
					dropdown.removeClass('nav-visible');

				});
			});
		},

		function($) {

			$('.click-open-modal').on('click', function(e) {

				e.preventDefault();

				var button = $(this);
				var body = $('body');
				var target = button.data('target');

				var modal = $(target);

				openModal(body, modal);

				if(modal.length === 1) {

					openModal(body, modal);
				}
			});

			// handle auto loading modals
			if($('.modal-autoload').length) {
				console.log('auto load');
				openModal($('body'), $('.modal-autoload'));
			}
		},

		// dialog toggle - function to trigger a modal box

		function($) {

			$('[data-toggle="modal"]').click(function(e) {

				e.preventDefault();

				var
					action = $(this),
					body = $('body'),
					target = action.data('target');

				// pre-populate export options
				if(target === '#export-metrics') {
					
					var opt = action.data('options');
					$('.export-options input')
						.prop('checked', false)
						.filter('[name="' + opt + '"]')
							.prop('checked', true);
				}

				var modal = $(target);

				if(modal.length === 1) {

					openModal(body, modal);		
				}
			});
		},

		// password strength - function to validate requirements of a password

		function($) {

			var $display = $('.password-strength-meter');

			if($display.length) {

				var $form = $('#account-password');
				var $passwordButton = $('#password-submit');

				$('#password').on('keyup', function() {

					var value = $(this).val().trim();

					if(value.length >= 6) {
						$passwordButton.removeAttr('disabled');
					}
					else {
						$passwordButton.attr('disabled', 'disabled');
					}
				});

				$passwordButton.on('click', function(e) {

					// clear errors
					$form.parent().find('.alert').remove();
					$('.form-error').removeClass('form-error');

					// orig pwd
					var $origPwd = $('#password-old');
					if($origPwd.val().trim() === '') {
						$origPwd.parent().addClass('form-error');
						$form.before('<div class="alert alert-danger" role="alert">Original password required please.</div>');
						return;
					}

					// new pwd
					var $newPwd = $('#password');
					if($newPwd.val().trim() === '') {
						$newPwd.parent().addClass('form-error');
						$form.before('<div class="alert alert-danger" role="alert">Uh... You\'re going to need a new password.</div>');
						return;
					}

					// confirm pwd
					var $confirmPwd = $('#password-confirm');
					if($confirmPwd.val().trim() === '') {
						$confirmPwd.parent().addClass('form-error');
						$form.before('<div class="alert alert-danger" role="alert">You\'ll need to confirm that new password.</div>');
						return;
					}

					// match?
					if($confirmPwd.val().trim() !== $newPwd.val().trim()) {
						$newPwd.parent().addClass('form-error');
						$confirmPwd.parent().addClass('form-error');
						$form.before('<div class="alert alert-danger" role="alert">Yikes! Those new passwords do not match.</div>');
						return;
					}

					setButtonLoading($passwordButton);

					$.ajax({
						type: 'POST',
						url: '/ajax/passwordChange',
						data: $form.serialize(),
						success: function(data) {
							// handle errors
							if(data['err']) {
								// password don't match or blank
								if(data['err']['id'] === 1) {
									$form.before('<div class="alert alert-danger" role="alert">' + data['err']['msg'] + '</div>');
									$newPwd.parent().addClass('form-error');
									$confirmPwd.parent().addClass('form-error');
								}
								else {
									$form.before('<div class="alert alert-danger" role="alert">' + data['err']['msg'] + '</div>');
									$('#' + data['err']['id']).parent().addClass('form-error');
								}
								unsetButtonLoading($passwordButton);
							}
							else {
								$newPwd.val('').trigger('keyup');
								$form.get(0).reset();
								$form.before('<div class="alert alert-success" role="alert">Password change successfully!</div>');
								unsetButtonLoading($passwordButton);
								$passwordButton.attr('disabled', 'disabled');
							}

						},
						error: function(x, err) {
							$form.before('<div class="alert alert-danger" role="alert">Uh oh! Something went wrong. Please try again later.</div>');
							unsetButtonLoading($passwordButton);
						}
					});
				});
			}
		},

		// graph ranking - activates the correct ranking display

		function($) {

			$('[data-action=chart-ranking] li:not(.labels)').click(function (event) {

				event.preventDefault();

				var 
					action = $(this),
					target = action.parent().data('target'),
					active = action.data('value'),
					axes = $('#' + target + '-axes');

					action.addClass('active').parent().find('li').removeClass('active')

					axes.find('li').removeClass('active');
					axes.find("[data-value='" + active + "']").addClass('active');
			});
		},

		function($, document, window) {
			$('.group-select').on('click', function(e) {

				event.preventDefault();
				var key = $(this).data('key');
				var service = $('body').data('service');
				var category = $('body').data('cat');
				$.ajax({
					type: 'POST',
					url: '/ajax/changeGroup',
					data: {key: key, service: service, category: category},
					success: function(data) {
						if(data['status'] !== 'ok') {
							window.location.href = data['status'];
						}
						else {
							window.location.reload();
						}
					},
					error: function() {
						window.location.reload();
					}
				});
			});
		},

		// date picker - controls the date picker functionality

		function($, document) {

			var $picker = $('#date-picker');
			if(!$picker.length) return;
			var $fromDteInput = $('#from-dte');
			var $toDteInput = $('#to-dte');
			var $body = $('body');

			// add a simple variable to check if picker is shown
			$picker._showing = 0;
			// attach date/time format
			$picker._dateFormat = $body.data('date-format');
			$picker._timeFormat = $body.data('time-format');

		    var now = function() {
		        var dte = new Date();
		        dte.setHours(0, 0, 0, 0);
		        return dte.getTime();
		    };

		    var timestampMinusDays = function(dte, days) {
				return dte - (days * 86400000);
		    };

		    // default now to one week
		    var toTs = $toDteInput.val();
		    if(toTs === '0') {
		    	toTs = new Date().getTime();
		    	$toDteInput.val($.datepicker.formatDate('d-M-yy', new Date(toTs)));
		    }
		    else {
		    	toTs = new Date(toTs).getTime();
		    }
		    var lastTs = toTs;
		    var fromTs = $fromDteInput.val();
		    var _fromFormat = parseInt($.datepicker.formatDate('mddyy', new Date(fromTs)), 10);
		    var _toFormat = parseInt($.datepicker.formatDate('mddyy', new Date(toTs)), 10);

		    if(fromTs === '0') {
		    	fromTs = timestampMinusDays(toTs, 7);
		    	$fromDteInput.val($.datepicker.formatDate('d-M-yy', new Date(fromTs)));
		    }
		    else {
		    	fromTs = new Date(fromTs).getTime();
		    }

		    var today = function() {
		    	return new Date();
		    };

		    var yesterday = function() {
		    	var today = new Date();
				var yday = new Date(today);
				yday.setDate(today.getDate() - 1);
				return yday;
		    };

		    var lastMonth = function() {

		    	var nowDte = new Date();
				var toDte = new Date(nowDte.getFullYear(), nowDte.getMonth(), 0);
				toDte.setHours(0, 0, 0, 0);
				var fromDte = new Date(toDte.getFullYear(), (nowDte.getMonth() - 1 + 12) % 12, 1);
				fromDte.setHours(0, 0, 0, 0);
        		return [fromDte, toDte];
		    };

		    var lastWeek = function() {

		    	var nowDte = new Date();
        		var d = 0, currDay = nowDte.getDay();
        		// if today if Sunday, subtract 7
        		diff = currDay === 0 ? 7 : currDay;
        		var toDte = new Date(nowDte - diff * 86400000);
        		toDte.setHours(0, 0, 0, 0);
        		var fromDte = new Date(toDte - 6 * 86400000);
        		fromDte.setHours(0, 0, 0, 0);
        		return [fromDte, toDte];
		    };

		    var monthToDate = function() {

				var toDte = today();
				toDte.setHours(0, 0, 0, 0);
				var fromDte = new Date(toDte.getFullYear(), toDte.getMonth(), 1);
				fromDte.setHours(0, 0, 0, 0);
        		return [fromDte, toDte];
		    };

		    var compareDates = function(d1, d2) {

		    	return d1.getTime() === d2.getTime();
		    };

		    // set the displayed date range
		    var setDisplayDate = function() {

		    	var toDte = new Date(toTs);
		    	toDte.setHours(0, 0, 0, 0);
		    	var fromDte = new Date(fromTs);
		    	fromDte.setHours(0, 0, 0, 0);
		    	var toFormat = $.datepicker.formatDate($picker._dateFormat, toDte);
		    	var fromFormat = $.datepicker.formatDate($picker._dateFormat, fromDte);
		    	var days = Math.floor(((toTs - fromTs) / 86400000)) + 1;
		    	_fromFormat = parseInt($.datepicker.formatDate('yymmdd', fromDte), 10);
		    	_toFormat = parseInt($.datepicker.formatDate('yymmdd', toDte), 10);

		    	$('#to-dte-format').text(toFormat);
		    	$('#from-dte-format').text(fromFormat);
		        $('.date-range').text(fromFormat + ' - ' + toFormat);
		        $toDteInput.val($.datepicker.formatDate('yy-mm-dd', toDte));
		    	$fromDteInput.val($.datepicker.formatDate('yy-mm-dd', fromDte));

		        $('#date-msg').text(days + ' days selected');

		        var _lastMonth = lastMonth();
		        var _lastWeek = lastWeek();
		        var _mtd = monthToDate();

		        // check if last month
		        if(compareDates(toDte, _lastMonth[1]) && compareDates(fromDte, _lastMonth[0])) {
		        	$('[data-range="month"]').parent().addClass('active');
		        }
		        else if(compareDates(toDte, _lastWeek[1]) && compareDates(fromDte, _lastWeek[0])) {
		        	$('[data-range="week"]').parent().addClass('active');
		        }
		        else if(compareDates(toDte, _mtd[1]) && compareDates(fromDte, _mtd[0])) {
		        	$('[data-range="mtd"]').parent().addClass('active');
		        }
		        // check if to date is today
		        // set yesterday or today to adjust
		        else if(toFormat === $.datepicker.formatDate($picker._dateFormat, today()) &&
		           (days === 1 || days === 7 || days === 14 || days === 28 || days === 90)) {
		        	
		        	$('[data-range="' + days + '"]').parent().addClass('active');
		        }

		        $picker.datepicker('refresh');
		    };

		    var pickerShow = function(show) {

		    	if(show) {
		    		$body.addClass('date-open');
		    		$('.date-dialog').addClass('date-active').removeAttr('style');
		    		setTimeout(function() {
						$('.calendar').on('clickoutside', function(e) {
							// HACK: prev/next buttons don't stop propigation so check class
							if(e.target.className.toLowerCase().indexOf('ui-datepicker') === -1) {
								pickerShow(false);
							}
						});
					}, 50);
		    	}
		    	else {
		    		closeModal($('#date-modal'));
		    	}
		    	$picker._showing = show;
		    };

			$('.date-control, .date-open').on('click', function(e) {

				e.preventDefault();
		        pickerShow(!$picker._showing ? 1 : 0);
		    });

		    $('.date-nav a').on('click', function(e) {

		        e.preventDefault();
		        $picker.datepicker('setDate', null);
		        
		        var $this = $(this), range = $this.data('range');

		        // handle week, month
		        if(range === 'week') {
	        		var last = lastWeek();
	        		toTs = last[1].getTime();
	        		fromTs = last[0].getTime();
	        		range = null;
		        }
	        	else if(range === 'month') {
	        		var last = lastMonth();
	        		toTs = last[1].getTime();
	        		fromTs = last[0].getTime();
	        		range = null;
		        }
		        else if(range === 'mtd') {
	        		var last = monthToDate();
	        		toTs = last[1].getTime();
	        		fromTs = last[0].getTime();
	        		range = null;
		        }
		        if(range) {
		        	if(range === 1) {
		        		fromTs = toTs = lastTs = now();
		        		$picker.datepicker('setDate', fromTs);
		        	}
		        	else {
			        	range = parseInt(range) - 1;
				        // set date with range
				        toTs = lastTs = now();
				        fromTs = timestampMinusDays(toTs, range);
				    }
			    }

		        $('.date-nav li').removeClass('active');
		        $this.parent().addClass('active');
		        
		        setDisplayDate();
		    });

		    $('.date-dismiss').on('click', function(e) {
		        e.preventDefault();
		        pickerShow(0);
		    });

		    $('.picker-btn').on('click', function(e) {
		        e.preventDefault();
		        setButtonLoading($(this));
		    });

		    var _startDte = $('body').data('start-dte');
		    if(_startDte) {
		    	_startDte = new Date(_startDte);
		    	if(new Date() - _startDte < 604800000) {
		    		_startDte = '-1w';
		    	}
		    }
		    else {
		    	_startDte = '-3m';
		    }

		    $picker.datepicker({
		    	
			   	dayNamesMin: [ "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" ],
		        dateFormat: $picker.data('format'),
		        numberOfMonths: 2,
		        firstDay: 1,
		        showButtonPanel: 0,
		        minDate: _startDte,
		        maxDate: 0,
		        //gotoCurrent: true,
		        beforeShowDay: function(date) {

		            var cls = '';
		            var _compFormat = parseInt($.datepicker.formatDate('yymmdd', date), 10);

		            if(_compFormat >= _fromFormat && _compFormat <= _toFormat) {

		            	cls = 'ui-state-date-range';
		            	
		            	if(_fromFormat == _toFormat) {
		                	cls = '';
		                }
		                else if(_fromFormat == _compFormat) {
		                    cls += ' ui-start-date';
		                }
		                else if(_toFormat == _compFormat) {
		                	cls += ' ui-end-date';
		                }
	                }
		            return [1, cls];
		        },
		        onSelect: function(dateText) {

		            var ts = new Date(dateText).getTime();

		            if(fromTs === toTs) {
		                if(ts <= fromTs) {
		                    fromTs = ts;
		                }
		                else {
		                    toTs = ts;
		                }
		            }
		            else {
		                fromTs = Math.min(lastTs, ts);
		                toTs = Math.max(lastTs, ts);
		            }
		            lastTs = ts;

		            $('.date-nav li').removeClass('active');
		            setDisplayDate();
		        }
		    });

		    // set the default dates
		    $picker.datepicker('setDate', new Date(fromTs));
		    setDisplayDate();
		},

		// activate link - disabled for now
		function($) {

			$('.activate').on('click', function(e) {
				e.preventDefault();
			});
		},

		// change country in traffic benchmark, geo
		function($, document, window) {

			$('#rank-country-sort').on('change', function(e) {
				e.preventDefault();
				var abbrev = $(this).val();
				var url = ['traffic/benchmark'];
				url.push($('#to-dte').val());
				url.push($('#from-dte').val());
				url.push('geo');
				url.push(abbrev);
				url = '/' + url.join('/');
				window.location.href = url;
			});
		},

		// change country in traffic benchmark, geo
		function($, document, window) {

			$('#seo-kwd-sort').on('change', function(e) {
				e.preventDefault();
				var abbrev = $(this).val();
				var url = ['seo/benchmark'];
				url.push($('#to-dte').val());
				url.push($('#from-dte').val());
				url.push('keyword-rank');
				url.push(abbrev);
				url = '/' + url.join('/');
				window.location.href = url;
			});
		},
		

		// posts page
		// MUST BE AFTER PICKER
		function($, document, window) {

			var tab = $('body').data('tab');
			var cat = $('body').data('cat');
			var service = $('body').data('service');
			var callback;

			var getSites = function() {

				var allSites = true;
				var sites = [];
				$('.feed-site').each(function() {

					var $this = $(this);
					if($this.prop('checked')) {
						sites.push($this.prop('name'));
					}
					else {
						allSites = false;
					}
				});
				if(allSites || !sites) {
					sites = 'all';
				}
				else {
					sites = sites.join(',');
				}
				return sites;
			};

			var buildUrl = function(url, def) {

				for(var i = 0; i < def.length; i++) {
					if(url[url.length - 1] === def[i]) {
						url.pop();
					}
					else {
						break;
					}
				}
				url = '/' + url.join('/');
				window.location.href = url;
			}

			if(cat === 'dashboard' || cat === 'traffic' || cat === 'seo' || cat === 'ux' || cat === 'content') {

				callback = function() {

					var arr = [cat];
					if(cat === 'seo') {
						if(tab === 'ranking' || tab === 'volume') {
							arr.push(tab);
						}
					}
					if(tab === 'benchmark') {
						arr.push(tab);
					}
					arr.push($('#to-dte').val());
					arr.push($('#from-dte').val());

					if(cat !== 'ux' && cat !== 'content') {
						var $feedMetrics = $('#feed-metrics');
						var feedVal = ''
						if($feedMetrics.length) {
							feedVal = $feedMetrics.val();
							arr.push(feedVal);
						}
						if(feedVal === 'geo') {
							var $geoSel = $('#rank-country-sort');
							if($geoSel.length) {
								arr.push($geoSel.val());
							}
						}
						else if(feedVal == 'keywork-rank') {
							var $kwdSel = $('#seo-kwd-sort');
							if($kwdSel.length) {
								arr.push($kwdSel.val());
							}
						}
					}
					buildUrl(arr, []);
				};
				$('#feed-metrics').on('change', function() {
					var val = this.value;
					if(val !== '') callback();
				});
				$('.picker-btn').on('click', callback);

			}

			else if(tab === 'overview' || tab === 'social-media') {

				callback = function() {

					var arr = ['social-media'];
					if(tab === 'overview') {
						arr.push(service);
						arr.push(tab);
					}
					arr.push($('#to-dte').val());
					arr.push($('#from-dte').val());

					buildUrl(arr, []);
				};
			}

			else if(tab === 'benchmark') {
				
				callback = function() {

					var arr = [
						'social-media',
						service,
						tab,
						$('#to-dte').val(),
						$('#from-dte').val(),
						$('#feed-sort').val(),
						$('#feed-metrics').val()
					];

					buildUrl(arr, []);
				};

				$('#feed-metrics').on('change', function() {
					var val = this.value;
					if(val !== '') callback();
				});

				// change of feed-sort select
				$('#feed-sort').on('change', function() {

					var val = this.value;
					var arr = OutsmartBenchmark[service][val];
					var sel = $('#feed-metrics');
					sel.empty();

					arr.forEach(function(a) {
						$('<option/>', {
					        value: a[0],
					        html: a[1]
					    }).appendTo(sel); 
					});

					sel.children().eq(1).attr('selected', 'selected')
					sel.trigger('change');
				});
			}

			else {

				var def = service === 'facebook' || service === 'twitter'
					? ['1', 'all', 'all', 'all', 'desc', 'date']
					: ['1', 'all', 'all', 'desc', 'date'];

				callback = function() {

					var arrStart = [
						'social-media',
						service,
						tab,
						$('#to-dte').val(),
						$('#from-dte').val()
					];

					var arr = arrStart.concat([
						$('#sort').val(),
						$('#order').val(),
						$('#type').val(),
						getSites()
					]);

					if(service === 'facebook') {

						arr.push($('#submit').val());
					}
					else if(service === 'twitter') {

						arr.push($('#mentions').val());
					}

					arr.push($('#zero').prop('checked') ? '1' : '0');

					buildUrl(arr, def);
				};

				$('.feed-ctrl').on('change', callback);
				//$('.picker-btn').on('click', callback);

				$('.btn-post-sort-update').on('click', function() {

					$(this).addClass('disabled');

					var arrStart = [
						'social-media',
						service,
						tab,
						$('#to-dte').val(),
						$('#from-dte').val()
					];

					var arr = arrStart.concat([
						$('#sort-modal').val(),
						$('#order-modal').val(),
						$('#type-modal').val(),
						getSites()
					]);

					if(service === 'facebook') {

						arr.push($('#submit').val());
					}
					else if(service === 'twitter') {

						arr.push($('#mentions').val());
					}

					arr.push($('#zero').prop('checked') ? '1' : '0');

					buildUrl(arr, def);
				});
			}
			$('.picker-btn').on('click', callback);
		},

		// seo ranking tld select
		function($, document, window) {

			$('#ranking-tld-sel').on('change', function() {

				// get tld
				var tld = $(this).val();

				// build url
				var url = ['/seo/ranking'];
				url.push($('#to-dte').val());
				url.push($('#from-dte').val());
				// add tld if present
				if(tld) url.push(tld);
				// redirect
				window.location.href = url.join('/');
			});
		},

		function($) {

			$('#input-date-format, #input-time-format').on('change', function() {

				// get dropdown values
				var dd = $('#input-date-format option:selected').data('format');
				var tt = $('#input-time-format option:selected').data('format');

				// format preview
				var preview = fecha.format(Date.now(), dd + ' ' + tt);
				$('#preview').text(preview);
			});
		},

		function($) {

			$('#comp-select-all').click(function () { 

				var button = $(this);
				var idle = button.data('idle');
				var active = button.data('active');
				var target = '#' + button.data('target');
		        
		        if(button.text() === idle) {

		            $(target + ' input:checkbox').removeAttr('checked');
		            button.text(active);
		        }
		        else {

		            $(target + ' input:checkbox').prop('checked', 'checked');
		            button.text(idle);
		        }
		    });
		},

		function($) {

			var button = $('#profile-button');

			button.on('click', function() {

				// clear errors
				$('#update-profile').parent().find('.alert').remove();
				$('.form-error').removeClass('form-error');

				// first name required
				var $el = $('#input-fname');
				var fname = $el.val().trim();
				if(!fname) {
					$el.parent().addClass('form-error');
					$('#update-profile')
						.before('<div class="alert alert-danger" role="alert">Oops! First name required</div>');
					return;
				}
	            setButtonLoading(button);

	            var data = {
	            	fname: fname,
	            	lname: $('#input-lname').val().trim(),
	            	phone: $('#input-phone').val().trim()
	            };

	            $.ajax({
					type: 'POST',
					url: '/ajax/profileEdit',
					data: data,
					success: function(data) {
						if(data['err']) {
							$('#update-profile')
								.before('<div class="alert alert-warning" role="alert">Uh oh! Something went wrong. Please try again later.</div>');
						}
						else {
							$('#update-profile')
								.before('<div class="alert alert-info alert-dismissible" role="alert"><i class="icon i-action-info-circle i-2x"></i> Profile updated. <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button></div>');
						}
						unsetButtonLoading(button);
					},
					error: function(x, err) {
						$('#update-profile')
							.before('<div class="alert alert-warning" role="alert">Uh oh! Something went wrong. Please try again later.</div>');
							//enableButton($el);
							unsetButtonLoading(button);
					}
				});
			});
		},

		// reset form on zero results
		function($) {

			$('#zero-form-reset').on('click', function(e) {

				e.preventDefault();
				$('select.form-control').prop("selectedIndex", 0);
				$('.feed-site,#zero').each(function() {
					$(this).prop('checked', true);
				});
				// reset to current week
				$('.date-nav [data-range="7"]').click();
				// search
				$('.picker-btn').click();
			});
		},

		function($, document, window) {

			var addBlankInputs = function(n) {

				// last input to clone
				var $input = $('input[name="keywords[]"]:last-child');
				// append 10 after
				for(;n--;) {
					$input.parent().append($input.clone().val(''));
				}
			};

			var removeBlankInputs = function() {

				var cnt = 0;
				// remove blank inputs
				$('input[name="keywords[]"]').each(function() {
					var $this = $(this);
					if($this.val() === '') {
						$this.remove();
					}
					else {
						cnt++;
					}
				});
				// return total non-blank inputs
				return cnt;
			};

			$('#keywords-bulk-save').on('click', function(e) {

				e.preventDefault();

				var $modal = $(this).closest('.modal');
				var $ta = $modal.find('#keywords');
				var text = $ta.val().trim();
				// clear text area
				$ta.val('');
				// close modal
				closeModal($modal);

				if(text) {
					// last input to clone
					var $input = $('input[name="keywords[]"]:last-child');
					// split lines or newline or comma
					text = text.split(/[\n,]/);
					var dups = {};
					// add each line
					for(var i = 0, len = text.length; i < len; i++) {
						// trim kwd, ignore empty
						var kwd = text[i].trim();
						if(!kwd || dups.hasOwnProperty(kwd)) continue;
						dups[kwd] = 1;
						$input.parent().append($input.clone().val(kwd));
					}
					// remove blanks
					var cnt = removeBlankInputs();
					// re-add blanks if less than 10
					if(10 - cnt > 0) {
						addBlankInputs(10 - cnt);
					}
				}
			});
		},

		// seo keywords button

		function($, document, window) {

			var button = $('#seo-keywords-button');

			$('body').on('click', 'button[name="remove-seo"]', function(e) {

				e.preventDefault();

				var $btn = $(this);
				var $form = $btn.closest('form');
				var $row = $btn.closest('tr');
				var name = $row.find('[data-label="domain"] span').text();

				$form.parent().find('.alert').remove();
            	$('.panel').find('.alert').remove();
				$('.form-error').removeClass('form-error');
				$btn.blur();

				if(!confirm('Remove all keywords from ' + name + ' group?')) {

					return;
				}

				$.ajax({
					type: 'POST',
					url: '/ajax/remove-seo',
					data: {group: $('body').data('group'), tldLang: $btn.data('tld-lang')},
					success: function(data) {
						if(data['err']) {
							window.Outsmart.showErr(null, data['err']['msg'], $btn);
						}
						else {
							var $tbl = $row.closest('table');
							$row.remove();
							if($tbl.find('tr').length < 2) {
								$tbl.append($('<tr><td class="scope-name"><span><strong>No keywords</span></td><td class="scope-tracking"></td><td class="scope-tracking">&nbsp;</td><td class="scope-tracking" colspan="2">&nbsp;</td></tr>'));
							}
						}
					},
					error: function(x, err) {
						window.Outsmart.showErr(null, 'Network/AJAX error: ' + err, $btn);
					}
				});

			});

			button.on('click', function(e) {

				e.preventDefault();

	            setButtonLoading(button);

	            var scrollAlert = function() {

	            	$('html, body').animate({scrollTop: $('.first-el').offset().top - 100 }, 400);
	            };

	            var $form = button.closest('form');
            	var group = $('body').data('group');
            	var tld = $('#tld-select').val();
            	var lang = $('#lang-select').val();
            	var tldLang = $('#tld-lang').val();

            	$form.parent().find('.alert').remove();
            	$('.panel').find('.alert').remove();
				$('.form-error').removeClass('form-error');

            	if(!tld) {

            		showErr($('#tld-select'), 'Whooops! Please choose a search domain', button);
            		return scrollAlert();
				}

				if(!lang) {
            		showErr($('#lang-select'), 'Uh oh! Please choose a search language', button);
            		return scrollAlert();
				}

            	var keywords = [];
            	$('[name="keywords[]"]').each(function() {
            		var val = $(this).val().trim();
            		if(val) keywords.push(val);
            	});

            	if(!keywords.length) {
            		showErr(null, 'Yikes! You forgot your keywords', button);
            		return scrollAlert();
				}

            	var kwdGroup = {
            		group: group,
            		tld: tld,
            		lang: lang,
            		tldLang: tldLang,
            		keywords: keywords,
            		clientDate: new Date().toJSON().slice(0,10)
            	};

				$.ajax({
					type: 'POST',
					url: '/ajax/seo-keywords',
					data: {keywords: JSON.stringify(kwdGroup)},
					success: function(data) {
						if(data['err']) {
							showErr(null, 'Something went wrong. Please try again', button);
						}
						else {
							if(data['status']['msg'] === 'reload') {
								window.location.href = '/seo-settings';
								return;
							}
							else {
								showErr(null, data['status']['msg'], button);
							}
						}
						unsetButtonLoading(button);
						return scrollAlert();
					},
					error: function(x, err) {
						showErr(null, 'Something went wrong. Please try again', button);
						unsetButtonLoading(button);
						return scrollAlert();
					}
				});
			});
		},

		// keywords settings button

		function($, document, window) {

			var button = $('#keywords-button');

			if(button.length) {

				$('#tld-select, #lang-select').on('change', function(e) {

					e.preventDefault();

					// remove current warning
					$('.seo-warning').remove();

					// no warning if no keywords
					var hasKwds = false;
					$('[name="keywords[]"]').each(function() {
	            		var val = $(this).val().trim();
	            		if(val) hasKwds = true;
	            	});
					// return if no kwds
					if(!hasKwds) return;

					$('h4')
						.first()
						.after('<div class="alert alert-warning alert-dismissible seo-warning" role="alert"><i class="icon i-action-info-circle i-2x"></i>Please note that we will reset your keyword tracking if you change the search domain or language. <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button></div>');
				});
			}

			button.on('click', function(e) {

				e.preventDefault();

				var status = $('#keywords-status');
				status.text('');

	            setButtonLoading(button);

            	var group = $('[data-group]').data('group');
            	var tld = $('#tld-select').val();
            	var lang = $('#lang-select').val();
            	var keywords = [];
            	$('[name="keywords[]"]').each(function() {
            		var val = $(this).val().trim();
            		if(val) keywords.push(val);
            	});
            	var kwdGroup = {group: group, tld: tld, lang: lang, keywords: keywords};

				$.ajax({
					type: 'POST',
					url: '/ajax/keywords-settings',
					data: {keywords: JSON.stringify(kwdGroup)},
					success: function(data) {
						if(data['err']) {
							status.text('Something went wrong. Please try again');
						}
						else {
							if(data['status']['msg'] === 'reload') {
								$('body').scrollTop(0);
								status.text('Saved');
								window.location.reload();
							}
							else if(data['status']['msg'] === 'Saved') {
								status.text('Saved');
							}
							else {
								status.append($(data['status']['msg']));
							}
						}
						unsetButtonLoading(button);
					},
					error: function(x, err) {
						status.text('Something went wrong. Please try again');
						unsetButtonLoading(button);
					}
				});
			});
		},

		function($, document, window) {

			var button = $('#schedule-submit');

			// handle disabling textarea
			if(button.length) {

				$('input:radio').on('change', function() {

					$('#overview-cc').prop('disabled',
						$('input[name="report-enabled"]:checked').val() === '0' &&
						$('input[name="report-monthly-enabled"]:checked').val() === '0');

					$('#benchmark-cc').prop('disabled',
						$('input[name="benchmark-enabled"]:checked').val() === '0' &&
						$('input[name="benchmark-monthly-enabled"]:checked').val() === '0');
				});

			}

			button.on('click', function(e) {

				e.preventDefault();

				var status = $('#schedule-status');
				status.text('');

	            setButtonLoading(button);

				$.ajax({
					type: 'POST',
					url: '/ajax/report-schedule',
					data: $('form').serialize(),
					success: function(data) {
						if(data['err']) {
							status.text('Something went wrong. Please try again');
							//enableButton();
						}
						else {
							status.text('Saved');
							//enableButton();
						}
						unsetButtonLoading(button);
					},
					error: function(x, err) {
						status.text('Something went wrong. Please try again');
						//enableButton();
						unsetButtonLoading(button);
					}
				});
			});
		},

		// report settings button

		function($, document, window) {

			var button = $('#report-settings');

			button.on('click', function(e) {

				e.preventDefault();

				var status = $('#report-status');
				status.text('');

	            setButtonLoading(button)

	            // count available options, remove benchmark-text-enabled from count
	            var all = $('input:checkbox').length - 1; // 
				// collect checked options
				var checkedValues = $('input:checkbox:checked').map(function() {
					return this.name;
				}).get();

				// check benchmark text enabled and remove from report types
				var bte = checkedValues.indexOf('benchmark-text-enabled');
				if(bte > -1) {
					checkedValues.splice(bte, 1);
				}

				if(!checkedValues.length) {
					checkedValues = 'none';
					if(bte > -1) checkedValues += ',benchmark-text-enabled';
				}
				else if(all === checkedValues.length) {
					checkedValues = 'all';
					if(bte > -1) checkedValues += ',benchmark-text-enabled';
				}
				else {
					checkedValues = checkedValues.join(',');
				}

				$.ajax({
					type: 'POST',
					url: '/ajax/reportSettings',
					data: {reports: checkedValues, group: $('body').data('group')},
					success: function(data) {
						if(data['err']) {
							status.text('Something went wrong. Please try again');
							//enableButton();
						}
						else {
							status.text('Saved');
							//enableButton();
						}
						unsetButtonLoading(button);
					},
					error: function(x, err) {
						status.text('Something went wrong. Please try again');
						//enableButton();
						unsetButtonLoading(button);
					}
				});
			});
		},

		function($, document, window) {

			var button = $('#profile-settings');

			button.on('click', function(e) {

				e.preventDefault();

				var status = $('#schedule-status');
				status.text('');

	            setButtonLoading(button)

				var data = {
					tz: $('#input-timezone').val(),
					dateFormat: $('#input-date-format').val(),
					timeFormat: $('#input-time-format').val()
				}

				$.ajax({
					type: 'POST',
					url: '/ajax/profileSettings',
					data: data,
					success: function(data) {
						if(data['err']) {
							status.text('Something went wrong. Please try again');
						}
						else {
							status.text('Saved');
						}
						unsetButtonLoading(button);
					},
					error: function(x, err) {
						status.text('Something went wrong. Please try again');
						unsetButtonLoading(button);
					}
				});
			});
		},

		function($) {

			$('[data-toggle="tooltip"]').click(function (e) {

				e.preventDefault();
				e.stopPropagation();

				var $this = $(this);
				// get key
				var key = $this.data('key');
				// get tooltip data
				var data = OutsmartTooltip[key] || 0;
				// return if no data
				if(!data || !data.title || !data.text) return;

				// build tooltip html
				var html = 
					OutsmartTooltip.html
					.replace('{{title}}', data.title)
					.replace('{{text}}', data.text);

				var $body = $('body');
				// make element
				var $tooltip = $(html);
				// get parent panel
				var $panel = $this.closest('.panel');

				var closeFn = function(e) {

					e && e.preventDefault();
					$body.removeClass('tooltip-open');
					$('.tooltip-backdrop').remove();
					$('.tooltip').remove();
				};

				// close all open tooltips
				closeFn();
				
				// append tooltip to panel
				$panel.append($tooltip);
				$body.addClass('tooltip-open')
				$tooltip.addClass('tooltip-active');
				$panel.append('<div class="tooltip-backdrop"></div>');

				$tooltip.on('clickoutside', closeFn);
				$tooltip.on('click', '[data-dismiss="tooltip"]', closeFn);
			});
		},

		// handle missing profile pics
		function($) {

			$('.audience-fix,.post-favicon img').on('error', function() {

				$(this).off().attr('src', '/img/avatar.png');

			});
		},

		function($) {

			$('figure.post-photo img').on('error', function(e) {

				$(this)
					.off()
					.attr('data-srcset', null)
					.attr('srcset', null)
					.attr('src', '/img/default-post.png');
			});
		},

		function($, document, window) {

			$('#export-download, #export-email').on('click', function(e) {

				e.preventDefault();

				$('.export-report-form').parent().find('.alert').remove();

				var checks = $('.export-options input:checked').map(function() {
				    return this.name;
				}).get().join(',');
				if(!checks) return;

				var $body = $('body');
				var elId = $(this).prop('id');
				var button = $(this);
	            var form = button.closest('form');
	            var isBenchmark = $body.data('tab') === 'benchmark' ? 1 : 0;
	            var service = $body.data('service');
	            var group = $body.data('group');
	            setButtonLoading(button);
	           
				var comp, toDte, fromDte;
				var urlParts = elId === 'export-download' ? ['/ajax/pdf'] : ['/ajax/pdfEmail'];
				urlParts.push(comp = $body.data('comp'));
				urlParts.push(toDte = $('#to-dte').val());
				urlParts.push(fromDte = $('#from-dte').val());
				urlParts.push(checks);
				// service for benchmark only
				urlParts.push(isBenchmark ? service : 0);
				urlParts.push(group);
				urlParts.push(new Date().getTime()); // cache buster

				var ua = window.navigator.userAgent;
		        var isChrome = ua.indexOf('Chrome') > -1;
				var isExplorer = ua.indexOf('MSIE') > -1;
				var isFirefox = ua.indexOf('Firefox') > -1;
				var isSafari = ua.indexOf("Safari") > -1;

				var xhr = new XMLHttpRequest();
				xhr.onreadystatechange = function() {
				    if(this.readyState == 4) {

				    	if(this.status == 200) {

					    	if(elId === 'export-download') {

						        var blob = new Blob([this.response], {type: 'application/pdf'});
						        var url = window.URL || window.webkitURL;
						        var pdf = url.createObjectURL(blob);
						        var reportName = comp + (isBenchmark ? '-benchmark' : '') + '-report-' + fromDte + '--' + toDte + '.pdf';

						        if(isFirefox || (!isChrome && isSafari)) {
						        	$('#resp-head').html('PDF Report Ready');
						        	$('#resp-text').html('Click below to view your report.');
						        	$('#resp-btn').text('View Report').attr({
						        		hostname: 'outsmart.io',
						        		href: pdf,
						        		target: '_blank',
						        		id: 'export-ff-close',
						        		download: reportName
						        	});
						        	$('#export-ff-close').on('click', function(e) {
						        		closeModal($('#export-metrics'));
						        	});
						        	form.get(0).reset();
						        	unsetButtonLoading(button);
						        	form.closest('.modal').addClass('ajax-posted');
						        }
						        else {
						        	var a = document.createElement('a');
							        a.href = url.createObjectURL(blob);
							        a.target = '_blank';
							        a.download = reportName;
							        a.click();
							        closeModal($('#export-metrics'));
							        form.get(0).reset();
						        	unsetButtonLoading(button);
						        }
						    }
						    else {
						    	var responseEmail = this.response;
						    	
						    	window.setTimeout(function() {
							    	$('#resp-head').html('PDF Report Sent');
						        	$('#resp-text').html('Report created and sent to ' + responseEmail);
						        	$('#resp-btn').text('Close').on('click', function() {
						        		closeModal($('#export-metrics'));
						        	});
						        	form.get(0).reset();
						        	unsetButtonLoading(button);
						        	form.closest('.modal').addClass('ajax-posted');
						        }, 1500);
						    }
						}
						else {
							$('.export-report-form')
								.before('<div class="alert alert-danger" role="alert">Oops! Something didn\'t work.</div>');
							unsetButtonLoading(button);
							return;
						}
				    }
				};
				xhr.open('POST', urlParts.join('/'));
				if(elId === 'export-download') xhr.responseType = 'blob';
				xhr.send();  
			});
		},

		// master menu - handles a responsive tab menu functionality

		function($, document, window) {

		    $('.master-menu').each(function () { 

		        var $menu = $(this),
		            $nav = $menu.find('.nav');

		        var scrolling = function() {

		            var children = 0,
		                 viewport = parseInt($menu.width());

		             $nav.children().each(function() {
		             	children += $(this).outerWidth();
		             });
		             children = parseInt(children);

		             if($nav.scrollLeft() >= children - viewport) {
		             	$menu.addClass('is-ended');
		             }
		             else {
		             	$menu.removeClass('is-ended');
		             }
		             if($nav.scrollLeft() <= 30) {
		             	$menu.addClass('is-started');
		             }
		             else {
		             	$menu.removeClass('is-started');
		             }
		        };

		        scrolling();
		        $nav.on('scroll', scrolling);
		    });
		}
	],
	initAll = function() {
		initEvt($, document, window);
	},
	initEvt = function($, document, window) {
		evt.forEach(function(e) {
			e($, document, window);
		});
	};
	
	// export public api
	return {
		init: initAll,
		showErr: showErr,
		openModal: openModal,
		closeModal: closeModal,
		setButtonLoading: setButtonLoading,
		unsetButtonLoading: unsetButtonLoading
	};

})(jQuery, document, window);

// let's Outsmart!
Outsmart.init();