/*!
 * Knockout JavaScript library v3.5.0
 * (c) The Knockout.js team - http://knockoutjs.com/
 * License: MIT (http://www.opensource.org/licenses/mit-license.php)
 */

(function() {(function(p){var z=this||(0,eval)("this"),w=z.document,R=z.navigator,v=z.jQuery,H=z.JSON;v||"undefined"===typeof jQuery||(v=jQuery);(function(p){"function"===typeof define&&define.amd?define(["exports","require"],p):"object"===typeof exports&&"object"===typeof module?p(module.exports||exports):p(z.ko={})})(function(S,T){function K(a,c){return null===a||typeof a in W?a===c:!1}function X(b,c){var d;return function(){d||(d=a.a.setTimeout(function(){d=p;b()},c))}}function Y(b,c){var d;return function(){clearTimeout(d);
d=a.a.setTimeout(b,c)}}function Z(a,c){c&&"change"!==c?"beforeChange"===c?this.oc(a):this.bb(a,c):this.pc(a)}function aa(a,c){null!==c&&c.s&&c.s()}function ba(a,c){var d=this.pd,e=d[t];e.qa||(this.Pb&&this.kb[c]?(d.tc(c,a,this.kb[c]),this.kb[c]=null,--this.Pb):e.F[c]||d.tc(c,a,e.G?{da:a}:d.Zc(a)),a.Ka&&a.fd())}var a="undefined"!==typeof S?S:{};a.b=function(b,c){for(var d=b.split("."),e=a,f=0;f<d.length-1;f++)e=e[d[f]];e[d[d.length-1]]=c};a.J=function(a,c,d){a[c]=d};a.version="3.5.0";a.b("version",
a.version);a.options={deferUpdates:!1,useOnlyNativeEvents:!1,foreachHidesDestroyed:!1};a.a=function(){function b(a,b){for(var c in a)f.call(a,c)&&b(c,a[c])}function c(a,b){if(b)for(var c in b)f.call(b,c)&&(a[c]=b[c]);return a}function d(a,b){a.__proto__=b;return a}function e(b,c,d,e){var k=b[c].match(n)||[];a.a.C(d.match(n),function(b){a.a.Oa(k,b,e)});b[c]=k.join(" ")}var f=Object.prototype.hasOwnProperty,g={__proto__:[]}instanceof Array,h="function"===typeof Symbol,m={},l={};m[R&&/Firefox\/2/i.test(R.userAgent)?
"KeyboardEvent":"UIEvents"]=["keyup","keydown","keypress"];m.MouseEvents="click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave".split(" ");b(m,function(a,b){if(b.length)for(var c=0,d=b.length;c<d;c++)l[b[c]]=a});var k={propertychange:!0},q=w&&function(){for(var a=3,b=w.createElement("div"),c=b.getElementsByTagName("i");b.innerHTML="\x3c!--[if gt IE "+ ++a+"]><i></i><![endif]--\x3e",c[0];);return 4<a?a:p}(),n=/\S+/g,r;return{Ic:["authenticity_token",/^__RequestVerificationToken(_.*)?$/],
C:function(a,b,c){for(var d=0,e=a.length;d<e;d++)b.call(c,a[d],d,a)},A:"function"==typeof Array.prototype.indexOf?function(a,b){return Array.prototype.indexOf.call(a,b)}:function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},Lb:function(a,b,c){for(var d=0,e=a.length;d<e;d++)if(b.call(c,a[d],d,a))return a[d];return p},hb:function(b,c){var d=a.a.A(b,c);0<d?b.splice(d,1):0===d&&b.shift()},vc:function(b){var c=[];b&&a.a.C(b,function(b){0>a.a.A(c,b)&&c.push(b)});return c},Mb:function(a,
b,c){var d=[];if(a)for(var e=0,k=a.length;e<k;e++)d.push(b.call(c,a[e],e));return d},fb:function(a,b,c){var d=[];if(a)for(var e=0,k=a.length;e<k;e++)b.call(c,a[e],e)&&d.push(a[e]);return d},gb:function(a,b){if(b instanceof Array)a.push.apply(a,b);else for(var c=0,d=b.length;c<d;c++)a.push(b[c]);return a},Oa:function(b,c,d){var e=a.a.A(a.a.$b(b),c);0>e?d&&b.push(c):d||b.splice(e,1)},Ba:g,extend:c,setPrototypeOf:d,zb:g?d:c,O:b,Ha:function(a,b,c){if(!a)return a;var d={},e;for(e in a)f.call(a,e)&&(d[e]=
b.call(c,a[e],e,a));return d},Sb:function(b){for(;b.firstChild;)a.removeNode(b.firstChild)},Xb:function(b){b=a.a.la(b);for(var c=(b[0]&&b[0].ownerDocument||w).createElement("div"),d=0,e=b.length;d<e;d++)c.appendChild(a.na(b[d]));return c},Ca:function(b,c){for(var d=0,e=b.length,k=[];d<e;d++){var f=b[d].cloneNode(!0);k.push(c?a.na(f):f)}return k},ua:function(b,c){a.a.Sb(b);if(c)for(var d=0,e=c.length;d<e;d++)b.appendChild(c[d])},Wc:function(b,c){var d=b.nodeType?[b]:b;if(0<d.length){for(var e=d[0],
k=e.parentNode,f=0,l=c.length;f<l;f++)k.insertBefore(c[f],e);f=0;for(l=d.length;f<l;f++)a.removeNode(d[f])}},Ua:function(a,b){if(a.length){for(b=8===b.nodeType&&b.parentNode||b;a.length&&a[0].parentNode!==b;)a.splice(0,1);for(;1<a.length&&a[a.length-1].parentNode!==b;)a.length--;if(1<a.length){var c=a[0],d=a[a.length-1];for(a.length=0;c!==d;)a.push(c),c=c.nextSibling;a.push(d)}}return a},Yc:function(a,b){7>q?a.setAttribute("selected",b):a.selected=b},Cb:function(a){return null===a||a===p?"":a.trim?
a.trim():a.toString().replace(/^[\s\xa0]+|[\s\xa0]+$/g,"")},Td:function(a,b){a=a||"";return b.length>a.length?!1:a.substring(0,b.length)===b},ud:function(a,b){if(a===b)return!0;if(11===a.nodeType)return!1;if(b.contains)return b.contains(1!==a.nodeType?a.parentNode:a);if(b.compareDocumentPosition)return 16==(b.compareDocumentPosition(a)&16);for(;a&&a!=b;)a=a.parentNode;return!!a},Rb:function(b){return a.a.ud(b,b.ownerDocument.documentElement)},jd:function(b){return!!a.a.Lb(b,a.a.Rb)},P:function(a){return a&&
a.tagName&&a.tagName.toLowerCase()},zc:function(b){return a.onError?function(){try{return b.apply(this,arguments)}catch(c){throw a.onError&&a.onError(c),c;}}:b},setTimeout:function(b,c){return setTimeout(a.a.zc(b),c)},Fc:function(b){setTimeout(function(){a.onError&&a.onError(b);throw b;},0)},H:function(b,c,d){var e=a.a.zc(d);d=k[c];if(a.options.useOnlyNativeEvents||d||!v)if(d||"function"!=typeof b.addEventListener)if("undefined"!=typeof b.attachEvent){var f=function(a){e.call(b,a)},l="on"+c;b.attachEvent(l,
f);a.a.I.za(b,function(){b.detachEvent(l,f)})}else throw Error("Browser doesn't support addEventListener or attachEvent");else b.addEventListener(c,e,!1);else r||(r="function"==typeof v(b).on?"on":"bind"),v(b)[r](c,e)},Fb:function(b,c){if(!b||!b.nodeType)throw Error("element must be a DOM node when calling triggerEvent");var d;"input"===a.a.P(b)&&b.type&&"click"==c.toLowerCase()?(d=b.type,d="checkbox"==d||"radio"==d):d=!1;if(a.options.useOnlyNativeEvents||!v||d)if("function"==typeof w.createEvent)if("function"==
typeof b.dispatchEvent)d=w.createEvent(l[c]||"HTMLEvents"),d.initEvent(c,!0,!0,z,0,0,0,0,0,!1,!1,!1,!1,0,b),b.dispatchEvent(d);else throw Error("The supplied element doesn't support dispatchEvent");else if(d&&b.click)b.click();else if("undefined"!=typeof b.fireEvent)b.fireEvent("on"+c);else throw Error("Browser doesn't support triggering events");else v(b).trigger(c)},c:function(b){return a.N(b)?b():b},$b:function(b){return a.N(b)?b.w():b},Eb:function(b,c,d){var k;c&&("object"===typeof b.classList?
(k=b.classList[d?"add":"remove"],a.a.C(c.match(n),function(a){k.call(b.classList,a)})):"string"===typeof b.className.baseVal?e(b.className,"baseVal",c,d):e(b,"className",c,d))},Ab:function(b,c){var d=a.a.c(c);if(null===d||d===p)d="";var e=a.h.firstChild(b);!e||3!=e.nodeType||a.h.nextSibling(e)?a.h.ua(b,[b.ownerDocument.createTextNode(d)]):e.data=d;a.a.zd(b)},Xc:function(a,b){a.name=b;if(7>=q)try{var c=a.name.replace(/[&<>'"]/g,function(a){return"&#"+a.charCodeAt(0)+";"});a.mergeAttributes(w.createElement("<input name='"+
c+"'/>"),!1)}catch(d){}},zd:function(a){9<=q&&(a=1==a.nodeType?a:a.parentNode,a.style&&(a.style.zoom=a.style.zoom))},vd:function(a){if(q){var b=a.style.width;a.style.width=0;a.style.width=b}},Od:function(b,c){b=a.a.c(b);c=a.a.c(c);for(var d=[],e=b;e<=c;e++)d.push(e);return d},la:function(a){for(var b=[],c=0,d=a.length;c<d;c++)b.push(a[c]);return b},Da:function(a){return h?Symbol(a):a},Xd:6===q,Yd:7===q,W:q,Kc:function(b,c){for(var d=a.a.la(b.getElementsByTagName("input")).concat(a.a.la(b.getElementsByTagName("textarea"))),
e="string"==typeof c?function(a){return a.name===c}:function(a){return c.test(a.name)},k=[],f=d.length-1;0<=f;f--)e(d[f])&&k.push(d[f]);return k},Md:function(b){return"string"==typeof b&&(b=a.a.Cb(b))?H&&H.parse?H.parse(b):(new Function("return "+b))():null},fc:function(b,c,d){if(!H||!H.stringify)throw Error("Cannot find JSON.stringify(). Some browsers (e.g., IE < 8) don't support it natively, but you can overcome this by adding a script reference to json2.js, downloadable from http://www.json.org/json2.js");
return H.stringify(a.a.c(b),c,d)},Nd:function(c,d,e){e=e||{};var k=e.params||{},f=e.includeFields||this.Ic,l=c;if("object"==typeof c&&"form"===a.a.P(c))for(var l=c.action,h=f.length-1;0<=h;h--)for(var g=a.a.Kc(c,f[h]),m=g.length-1;0<=m;m--)k[g[m].name]=g[m].value;d=a.a.c(d);var n=w.createElement("form");n.style.display="none";n.action=l;n.method="post";for(var q in d)c=w.createElement("input"),c.type="hidden",c.name=q,c.value=a.a.fc(a.a.c(d[q])),n.appendChild(c);b(k,function(a,b){var c=w.createElement("input");
c.type="hidden";c.name=a;c.value=b;n.appendChild(c)});w.body.appendChild(n);e.submitter?e.submitter(n):n.submit();setTimeout(function(){n.parentNode.removeChild(n)},0)}}}();a.b("utils",a.a);a.b("utils.arrayForEach",a.a.C);a.b("utils.arrayFirst",a.a.Lb);a.b("utils.arrayFilter",a.a.fb);a.b("utils.arrayGetDistinctValues",a.a.vc);a.b("utils.arrayIndexOf",a.a.A);a.b("utils.arrayMap",a.a.Mb);a.b("utils.arrayPushAll",a.a.gb);a.b("utils.arrayRemoveItem",a.a.hb);a.b("utils.cloneNodes",a.a.Ca);a.b("utils.createSymbolOrString",
a.a.Da);a.b("utils.extend",a.a.extend);a.b("utils.fieldsIncludedWithJsonPost",a.a.Ic);a.b("utils.getFormFields",a.a.Kc);a.b("utils.objectMap",a.a.Ha);a.b("utils.peekObservable",a.a.$b);a.b("utils.postJson",a.a.Nd);a.b("utils.parseJson",a.a.Md);a.b("utils.registerEventHandler",a.a.H);a.b("utils.stringifyJson",a.a.fc);a.b("utils.range",a.a.Od);a.b("utils.toggleDomNodeCssClass",a.a.Eb);a.b("utils.triggerEvent",a.a.Fb);a.b("utils.unwrapObservable",a.a.c);a.b("utils.objectForEach",a.a.O);a.b("utils.addOrRemoveItem",
a.a.Oa);a.b("utils.setTextContent",a.a.Ab);a.b("unwrap",a.a.c);Function.prototype.bind||(Function.prototype.bind=function(a){var c=this;if(1===arguments.length)return function(){return c.apply(a,arguments)};var d=Array.prototype.slice.call(arguments,1);return function(){var e=d.slice(0);e.push.apply(e,arguments);return c.apply(a,e)}});a.a.g=new function(){var b=0,c="__ko__"+(new Date).getTime(),d={},e,f;a.a.W?(e=function(a,e){var f=a[c];if(!f||"null"===f||!d[f]){if(!e)return p;f=a[c]="ko"+b++;d[f]=
{}}return d[f]},f=function(a){var b=a[c];return b?(delete d[b],a[c]=null,!0):!1}):(e=function(a,b){var d=a[c];!d&&b&&(d=a[c]={});return d},f=function(a){return a[c]?(delete a[c],!0):!1});return{get:function(a,b){var c=e(a,!1);return c&&c[b]},set:function(a,b,c){(a=e(a,c!==p))&&(a[b]=c)},Tb:function(a,b,c){a=e(a,!0);return a[b]||(a[b]=c)},clear:f,Z:function(){return b++ +c}}};a.b("utils.domData",a.a.g);a.b("utils.domData.clear",a.a.g.clear);a.a.I=new function(){function b(b,c){var d=a.a.g.get(b,e);
d===p&&c&&(d=[],a.a.g.set(b,e,d));return d}function c(c){var e=b(c,!1);if(e)for(var e=e.slice(0),f=0;f<e.length;f++)e[f](c);a.a.g.clear(c);a.a.I.cleanExternalData(c);g[c.nodeType]&&d(c.childNodes,!0)}function d(b,d){for(var e=[],k,f=0;f<b.length;f++)if(!d||8===b[f].nodeType)if(c(e[e.length]=k=b[f]),b[f]!==k)for(;f--&&-1==a.a.A(e,b[f]););}var e=a.a.g.Z(),f={1:!0,8:!0,9:!0},g={1:!0,9:!0};return{za:function(a,c){if("function"!=typeof c)throw Error("Callback must be a function");b(a,!0).push(c)},xb:function(c,
d){var f=b(c,!1);f&&(a.a.hb(f,d),0==f.length&&a.a.g.set(c,e,p))},na:function(a){f[a.nodeType]&&(c(a),g[a.nodeType]&&d(a.getElementsByTagName("*")));return a},removeNode:function(b){a.na(b);b.parentNode&&b.parentNode.removeChild(b)},cleanExternalData:function(a){v&&"function"==typeof v.cleanData&&v.cleanData([a])}}};a.na=a.a.I.na;a.removeNode=a.a.I.removeNode;a.b("cleanNode",a.na);a.b("removeNode",a.removeNode);a.b("utils.domNodeDisposal",a.a.I);a.b("utils.domNodeDisposal.addDisposeCallback",a.a.I.za);
a.b("utils.domNodeDisposal.removeDisposeCallback",a.a.I.xb);(function(){var b=[0,"",""],c=[1,"<table>","</table>"],d=[3,"<table><tbody><tr>","</tr></tbody></table>"],e=[1,"<select multiple='multiple'>","</select>"],f={thead:c,tbody:c,tfoot:c,tr:[2,"<table><tbody>","</tbody></table>"],td:d,th:d,option:e,optgroup:e},g=8>=a.a.W;a.a.ta=function(c,d){var e;if(v)if(v.parseHTML)e=v.parseHTML(c,d)||[];else{if((e=v.clean([c],d))&&e[0]){for(var k=e[0];k.parentNode&&11!==k.parentNode.nodeType;)k=k.parentNode;
k.parentNode&&k.parentNode.removeChild(k)}}else{(e=d)||(e=w);var k=e.parentWindow||e.defaultView||z,q=a.a.Cb(c).toLowerCase(),n=e.createElement("div"),r;r=(q=q.match(/^(?:\x3c!--.*?--\x3e\s*?)*?<([a-z]+)[\s>]/))&&f[q[1]]||b;q=r[0];r="ignored<div>"+r[1]+c+r[2]+"</div>";"function"==typeof k.innerShiv?n.appendChild(k.innerShiv(r)):(g&&e.body.appendChild(n),n.innerHTML=r,g&&n.parentNode.removeChild(n));for(;q--;)n=n.lastChild;e=a.a.la(n.lastChild.childNodes)}return e};a.a.Ld=function(b,c){var d=a.a.ta(b,
c);return d.length&&d[0].parentElement||a.a.Xb(d)};a.a.dc=function(b,c){a.a.Sb(b);c=a.a.c(c);if(null!==c&&c!==p)if("string"!=typeof c&&(c=c.toString()),v)v(b).html(c);else for(var d=a.a.ta(c,b.ownerDocument),e=0;e<d.length;e++)b.appendChild(d[e])}})();a.b("utils.parseHtmlFragment",a.a.ta);a.b("utils.setHtml",a.a.dc);a.aa=function(){function b(c,e){if(c)if(8==c.nodeType){var f=a.aa.Tc(c.nodeValue);null!=f&&e.push({sd:c,Jd:f})}else if(1==c.nodeType)for(var f=0,g=c.childNodes,h=g.length;f<h;f++)b(g[f],
e)}var c={};return{Wb:function(a){if("function"!=typeof a)throw Error("You can only pass a function to ko.memoization.memoize()");var b=(4294967296*(1+Math.random())|0).toString(16).substring(1)+(4294967296*(1+Math.random())|0).toString(16).substring(1);c[b]=a;return"\x3c!--[ko_memo:"+b+"]--\x3e"},ad:function(a,b){var f=c[a];if(f===p)throw Error("Couldn't find any memo with ID "+a+". Perhaps it's already been unmemoized.");try{return f.apply(null,b||[]),!0}finally{delete c[a]}},bd:function(c,e){var f=
[];b(c,f);for(var g=0,h=f.length;g<h;g++){var m=f[g].sd,l=[m];e&&a.a.gb(l,e);a.aa.ad(f[g].Jd,l);m.nodeValue="";m.parentNode&&m.parentNode.removeChild(m)}},Tc:function(a){return(a=a.match(/^\[ko_memo\:(.*?)\]$/))?a[1]:null}}}();a.b("memoization",a.aa);a.b("memoization.memoize",a.aa.Wb);a.b("memoization.unmemoize",a.aa.ad);a.b("memoization.parseMemoText",a.aa.Tc);a.b("memoization.unmemoizeDomNodeAndDescendants",a.aa.bd);a.ma=function(){function b(){if(f)for(var b=f,c=0,d;h<f;)if(d=e[h++]){if(h>b){if(5E3<=
++c){h=f;a.a.Fc(Error("'Too much recursion' after processing "+c+" task groups."));break}b=f}try{d()}catch(g){a.a.Fc(g)}}}function c(){b();h=f=e.length=0}var d,e=[],f=0,g=1,h=0;z.MutationObserver?d=function(a){var b=w.createElement("div");(new MutationObserver(a)).observe(b,{attributes:!0});return function(){b.classList.toggle("foo")}}(c):d=w&&"onreadystatechange"in w.createElement("script")?function(a){var b=w.createElement("script");b.onreadystatechange=function(){b.onreadystatechange=null;w.documentElement.removeChild(b);
b=null;a()};w.documentElement.appendChild(b)}:function(a){setTimeout(a,0)};return{scheduler:d,yb:function(b){f||a.ma.scheduler(c);e[f++]=b;return g++},cancel:function(a){a=a-(g-f);a>=h&&a<f&&(e[a]=null)},resetForTesting:function(){var a=f-h;h=f=e.length=0;return a},Rd:b}}();a.b("tasks",a.ma);a.b("tasks.schedule",a.ma.yb);a.b("tasks.runEarly",a.ma.Rd);a.Ta={throttle:function(b,c){b.throttleEvaluation=c;var d=null;return a.$({read:b,write:function(e){clearTimeout(d);d=a.a.setTimeout(function(){b(e)},
c)}})},rateLimit:function(a,c){var d,e,f;"number"==typeof c?d=c:(d=c.timeout,e=c.method);a.Hb=!1;f="function"==typeof e?e:"notifyWhenChangesStop"==e?Y:X;a.tb(function(a){return f(a,d,c)})},deferred:function(b,c){if(!0!==c)throw Error("The 'deferred' extender only accepts the value 'true', because it is not supported to turn deferral off once enabled.");b.Hb||(b.Hb=!0,b.tb(function(c){var e,f=!1;return function(){if(!f){a.ma.cancel(e);e=a.ma.yb(c);try{f=!0,b.notifySubscribers(p,"dirty")}finally{f=
!1}}}}))},notify:function(a,c){a.equalityComparer="always"==c?null:K}};var W={undefined:1,"boolean":1,number:1,string:1};a.b("extenders",a.Ta);a.gc=function(b,c,d){this.da=b;this.kc=c;this.lc=d;this.Ib=!1;this.ab=this.Jb=null;a.J(this,"dispose",this.s);a.J(this,"disposeWhenNodeIsRemoved",this.l)};a.gc.prototype.s=function(){this.Ib||(this.ab&&a.a.I.xb(this.Jb,this.ab),this.Ib=!0,this.lc(),this.da=this.kc=this.lc=this.Jb=this.ab=null)};a.gc.prototype.l=function(b){this.Jb=b;a.a.I.za(b,this.ab=this.s.bind(this))};
a.R=function(){a.a.zb(this,D);D.ob(this)};var D={ob:function(a){a.S={change:[]};a.rc=1},subscribe:function(b,c,d){var e=this;d=d||"change";var f=new a.gc(e,c?b.bind(c):b,function(){a.a.hb(e.S[d],f);e.cb&&e.cb(d)});e.Qa&&e.Qa(d);e.S[d]||(e.S[d]=[]);e.S[d].push(f);return f},notifySubscribers:function(b,c){c=c||"change";"change"===c&&this.Gb();if(this.Wa(c)){var d="change"===c&&this.dd||this.S[c].slice(0);try{a.v.wc();for(var e=0,f;f=d[e];++e)f.Ib||f.kc(b)}finally{a.v.end()}}},mb:function(){return this.rc},
Cd:function(a){return this.mb()!==a},Gb:function(){++this.rc},tb:function(b){var c=this,d=a.N(c),e,f,g,h,m;c.bb||(c.bb=c.notifySubscribers,c.notifySubscribers=Z);var l=b(function(){c.Ka=!1;d&&h===c&&(h=c.mc?c.mc():c());var a=f||m&&c.qb(g,h);m=f=e=!1;a&&c.bb(g=h)});c.pc=function(a,b){b&&c.Ka||(m=!b);c.dd=c.S.change.slice(0);c.Ka=e=!0;h=a;l()};c.oc=function(a){e||(g=a,c.bb(a,"beforeChange"))};c.qc=function(){m=!0};c.fd=function(){c.qb(g,c.w(!0))&&(f=!0)}},Wa:function(a){return this.S[a]&&this.S[a].length},
Ad:function(b){if(b)return this.S[b]&&this.S[b].length||0;var c=0;a.a.O(this.S,function(a,b){"dirty"!==a&&(c+=b.length)});return c},qb:function(a,c){return!this.equalityComparer||!this.equalityComparer(a,c)},toString:function(){return"[object Object]"},extend:function(b){var c=this;b&&a.a.O(b,function(b,e){var f=a.Ta[b];"function"==typeof f&&(c=f(c,e)||c)});return c}};a.J(D,"init",D.ob);a.J(D,"subscribe",D.subscribe);a.J(D,"extend",D.extend);a.J(D,"getSubscriptionsCount",D.Ad);a.a.Ba&&a.a.setPrototypeOf(D,
Function.prototype);a.R.fn=D;a.Pc=function(a){return null!=a&&"function"==typeof a.subscribe&&"function"==typeof a.notifySubscribers};a.b("subscribable",a.R);a.b("isSubscribable",a.Pc);a.U=a.v=function(){function b(a){d.push(e);e=a}function c(){e=d.pop()}var d=[],e,f=0;return{wc:b,end:c,ac:function(b){if(e){if(!a.Pc(b))throw Error("Only subscribable things can act as dependencies");e.nd.call(e.od,b,b.ed||(b.ed=++f))}},K:function(a,d,e){try{return b(),a.apply(d,e||[])}finally{c()}},pa:function(){if(e)return e.o.pa()},
Va:function(){if(e)return e.o.Va()},rb:function(){if(e)return e.rb},o:function(){if(e)return e.o}}}();a.b("computedContext",a.U);a.b("computedContext.getDependenciesCount",a.U.pa);a.b("computedContext.getDependencies",a.U.Va);a.b("computedContext.isInitial",a.U.rb);a.b("computedContext.registerDependency",a.U.ac);a.b("ignoreDependencies",a.Wd=a.v.K);var I=a.a.Da("_latestValue");a.sa=function(b){function c(){if(0<arguments.length)return c.qb(c[I],arguments[0])&&(c.xa(),c[I]=arguments[0],c.wa()),this;
a.v.ac(c);return c[I]}c[I]=b;a.a.Ba||a.a.extend(c,a.R.fn);a.R.fn.ob(c);a.a.zb(c,F);a.options.deferUpdates&&a.Ta.deferred(c,!0);return c};var F={equalityComparer:K,w:function(){return this[I]},wa:function(){this.notifySubscribers(this[I],"spectate");this.notifySubscribers(this[I])},xa:function(){this.notifySubscribers(this[I],"beforeChange")}};a.a.Ba&&a.a.setPrototypeOf(F,a.R.fn);var G=a.sa.Na="__ko_proto__";F[G]=a.sa;a.N=function(b){if((b="function"==typeof b&&b[G])&&b!==F[G]&&b!==a.o.fn[G])throw Error("Invalid object that looks like an observable; possibly from another Knockout instance");
return!!b};a.Ya=function(b){return"function"==typeof b&&(b[G]===F[G]||b[G]===a.o.fn[G]&&b.Mc)};a.b("observable",a.sa);a.b("isObservable",a.N);a.b("isWriteableObservable",a.Ya);a.b("isWritableObservable",a.Ya);a.b("observable.fn",F);a.J(F,"peek",F.w);a.J(F,"valueHasMutated",F.wa);a.J(F,"valueWillMutate",F.xa);a.Ia=function(b){b=b||[];if("object"!=typeof b||!("length"in b))throw Error("The argument passed when initializing an observable array must be an array, or null, or undefined.");b=a.sa(b);a.a.zb(b,
a.Ia.fn);return b.extend({trackArrayChanges:!0})};a.Ia.fn={remove:function(b){for(var c=this.w(),d=[],e="function"!=typeof b||a.N(b)?function(a){return a===b}:b,f=0;f<c.length;f++){var g=c[f];if(e(g)){0===d.length&&this.xa();if(c[f]!==g)throw Error("Array modified during remove; cannot remove item");d.push(g);c.splice(f,1);f--}}d.length&&this.wa();return d},removeAll:function(b){if(b===p){var c=this.w(),d=c.slice(0);this.xa();c.splice(0,c.length);this.wa();return d}return b?this.remove(function(c){return 0<=
a.a.A(b,c)}):[]},destroy:function(b){var c=this.w(),d="function"!=typeof b||a.N(b)?function(a){return a===b}:b;this.xa();for(var e=c.length-1;0<=e;e--){var f=c[e];d(f)&&(f._destroy=!0)}this.wa()},destroyAll:function(b){return b===p?this.destroy(function(){return!0}):b?this.destroy(function(c){return 0<=a.a.A(b,c)}):[]},indexOf:function(b){var c=this();return a.a.A(c,b)},replace:function(a,c){var d=this.indexOf(a);0<=d&&(this.xa(),this.w()[d]=c,this.wa())},sorted:function(a){var c=this().slice(0);
return a?c.sort(a):c.sort()},reversed:function(){return this().slice(0).reverse()}};a.a.Ba&&a.a.setPrototypeOf(a.Ia.fn,a.sa.fn);a.a.C("pop push reverse shift sort splice unshift".split(" "),function(b){a.Ia.fn[b]=function(){var a=this.w();this.xa();this.yc(a,b,arguments);var d=a[b].apply(a,arguments);this.wa();return d===a?this:d}});a.a.C(["slice"],function(b){a.Ia.fn[b]=function(){var a=this();return a[b].apply(a,arguments)}});a.Oc=function(b){return a.N(b)&&"function"==typeof b.remove&&"function"==
typeof b.push};a.b("observableArray",a.Ia);a.b("isObservableArray",a.Oc);a.Ta.trackArrayChanges=function(b,c){function d(){function c(){if(h){var d=[].concat(b.w()||[]);if(b.Wa("arrayChange")){var e;if(!f||1<h)f=a.a.Ob(m,d,b.Nb);e=f}m=d;f=null;h=0;e&&e.length&&b.notifySubscribers(e,"arrayChange")}}e?c():(e=!0,l=b.notifySubscribers,b.notifySubscribers=function(a,b){b&&"change"!==b||++h;return l.apply(this,arguments)},m=[].concat(b.w()||[]),f=null,g=b.subscribe(c))}b.Nb={};c&&"object"==typeof c&&a.a.extend(b.Nb,
c);b.Nb.sparse=!0;if(!b.yc){var e=!1,f=null,g,h=0,m,l,k=b.Qa,q=b.cb;b.Qa=function(a){k&&k.call(b,a);"arrayChange"===a&&d()};b.cb=function(a){q&&q.call(b,a);"arrayChange"!==a||b.Wa("arrayChange")||(l&&(b.notifySubscribers=l,l=p),g&&g.s(),g=null,e=!1,m=p)};b.yc=function(b,c,d){function k(a,b,c){return l[l.length]={status:a,value:b,index:c}}if(e&&!h){var l=[],g=b.length,q=d.length,m=0;switch(c){case "push":m=g;case "unshift":for(c=0;c<q;c++)k("added",d[c],m+c);break;case "pop":m=g-1;case "shift":g&&
k("deleted",b[m],m);break;case "splice":c=Math.min(Math.max(0,0>d[0]?g+d[0]:d[0]),g);for(var g=1===q?g:Math.min(c+(d[1]||0),g),q=c+q-2,m=Math.max(g,q),U=[],L=[],p=2;c<m;++c,++p)c<g&&L.push(k("deleted",b[c],c)),c<q&&U.push(k("added",d[p],c));a.a.Jc(L,U);break;default:return}f=l}}}};var t=a.a.Da("_state");a.o=a.$=function(b,c,d){function e(){if(0<arguments.length){if("function"===typeof f)f.apply(g.lb,arguments);else throw Error("Cannot write a value to a ko.computed unless you specify a 'write' option. If you wish to read the current value, don't pass any parameters.");
return this}g.qa||a.v.ac(e);(g.ka||g.G&&e.Xa())&&e.ha();return g.X}"object"===typeof b?d=b:(d=d||{},b&&(d.read=b));if("function"!=typeof d.read)throw Error("Pass a function that returns the value of the ko.computed");var f=d.write,g={X:p,ra:!0,ka:!0,pb:!1,hc:!1,qa:!1,vb:!1,G:!1,Vc:d.read,lb:c||d.owner,l:d.disposeWhenNodeIsRemoved||d.l||null,Sa:d.disposeWhen||d.Sa,Qb:null,F:{},V:0,Hc:null};e[t]=g;e.Mc="function"===typeof f;a.a.Ba||a.a.extend(e,a.R.fn);a.R.fn.ob(e);a.a.zb(e,C);d.pure?(g.vb=!0,g.G=!0,
a.a.extend(e,da)):d.deferEvaluation&&a.a.extend(e,ea);a.options.deferUpdates&&a.Ta.deferred(e,!0);g.l&&(g.hc=!0,g.l.nodeType||(g.l=null));g.G||d.deferEvaluation||e.ha();g.l&&e.ja()&&a.a.I.za(g.l,g.Qb=function(){e.s()});return e};var C={equalityComparer:K,pa:function(){return this[t].V},Va:function(){var b=[];a.a.O(this[t].F,function(a,d){b[d.La]=d.da});return b},Ub:function(b){if(!this[t].V)return!1;var c=this.Va();return-1!==a.a.A(c,b)?!0:!!a.a.Lb(c,function(a){return a.Ub&&a.Ub(b)})},tc:function(a,
c,d){if(this[t].vb&&c===this)throw Error("A 'pure' computed must not be called recursively");this[t].F[a]=d;d.La=this[t].V++;d.Ma=c.mb()},Xa:function(){var a,c,d=this[t].F;for(a in d)if(Object.prototype.hasOwnProperty.call(d,a)&&(c=d[a],this.Ja&&c.da.Ka||c.da.Cd(c.Ma)))return!0},Id:function(){this.Ja&&!this[t].pb&&this.Ja(!1)},ja:function(){var a=this[t];return a.ka||0<a.V},Qd:function(){this.Ka?this[t].ka&&(this[t].ra=!0):this.Gc()},Zc:function(a){if(a.Hb){var c=a.subscribe(this.Id,this,"dirty"),
d=a.subscribe(this.Qd,this);return{da:a,s:function(){c.s();d.s()}}}return a.subscribe(this.Gc,this)},Gc:function(){var b=this,c=b.throttleEvaluation;c&&0<=c?(clearTimeout(this[t].Hc),this[t].Hc=a.a.setTimeout(function(){b.ha(!0)},c)):b.Ja?b.Ja(!0):b.ha(!0)},ha:function(b){var c=this[t],d=c.Sa,e=!1;if(!c.pb&&!c.qa){if(c.l&&!a.a.Rb(c.l)||d&&d()){if(!c.hc){this.s();return}}else c.hc=!1;c.pb=!0;try{e=this.yd(b)}finally{c.pb=!1}return e}},yd:function(b){var c=this[t],d=!1,e=c.vb?p:!c.V,d={pd:this,kb:c.F,
Pb:c.V};a.v.wc({od:d,nd:ba,o:this,rb:e});c.F={};c.V=0;var f=this.xd(c,d);c.V?d=this.qb(c.X,f):(this.s(),d=!0);d&&(c.G?this.Gb():this.notifySubscribers(c.X,"beforeChange"),c.X=f,this.notifySubscribers(c.X,"spectate"),!c.G&&b&&this.notifySubscribers(c.X),this.qc&&this.qc());e&&this.notifySubscribers(c.X,"awake");return d},xd:function(b,c){try{var d=b.Vc;return b.lb?d.call(b.lb):d()}finally{a.v.end(),c.Pb&&!b.G&&a.a.O(c.kb,aa),b.ra=b.ka=!1}},w:function(a){var c=this[t];(c.ka&&(a||!c.V)||c.G&&this.Xa())&&
this.ha();return c.X},tb:function(b){a.R.fn.tb.call(this,b);this.mc=function(){this[t].G||(this[t].ra?this.ha():this[t].ka=!1);return this[t].X};this.Ja=function(a){this.oc(this[t].X);this[t].ka=!0;a&&(this[t].ra=!0);this.pc(this,!a)}},s:function(){var b=this[t];!b.G&&b.F&&a.a.O(b.F,function(a,b){b.s&&b.s()});b.l&&b.Qb&&a.a.I.xb(b.l,b.Qb);b.F=p;b.V=0;b.qa=!0;b.ra=!1;b.ka=!1;b.G=!1;b.l=p;b.Sa=p;b.Vc=p;this.Mc||(b.lb=p)}},da={Qa:function(b){var c=this,d=c[t];if(!d.qa&&d.G&&"change"==b){d.G=!1;if(d.ra||
c.Xa())d.F=null,d.V=0,c.ha()&&c.Gb();else{var e=[];a.a.O(d.F,function(a,b){e[b.La]=a});a.a.C(e,function(a,b){var e=d.F[a],m=c.Zc(e.da);m.La=b;m.Ma=e.Ma;d.F[a]=m});c.Xa()&&c.ha()&&c.Gb()}d.qa||c.notifySubscribers(d.X,"awake")}},cb:function(b){var c=this[t];c.qa||"change"!=b||this.Wa("change")||(a.a.O(c.F,function(a,b){b.s&&(c.F[a]={da:b.da,La:b.La,Ma:b.Ma},b.s())}),c.G=!0,this.notifySubscribers(p,"asleep"))},mb:function(){var b=this[t];b.G&&(b.ra||this.Xa())&&this.ha();return a.R.fn.mb.call(this)}},
ea={Qa:function(a){"change"!=a&&"beforeChange"!=a||this.w()}};a.a.Ba&&a.a.setPrototypeOf(C,a.R.fn);var N=a.sa.Na;C[N]=a.o;a.Nc=function(a){return"function"==typeof a&&a[N]===C[N]};a.Ed=function(b){return a.Nc(b)&&b[t]&&b[t].vb};a.b("computed",a.o);a.b("dependentObservable",a.o);a.b("isComputed",a.Nc);a.b("isPureComputed",a.Ed);a.b("computed.fn",C);a.J(C,"peek",C.w);a.J(C,"dispose",C.s);a.J(C,"isActive",C.ja);a.J(C,"getDependenciesCount",C.pa);a.J(C,"getDependencies",C.Va);a.wb=function(b,c){if("function"===
typeof b)return a.o(b,c,{pure:!0});b=a.a.extend({},b);b.pure=!0;return a.o(b,c)};a.b("pureComputed",a.wb);(function(){function b(a,f,g){g=g||new d;a=f(a);if("object"!=typeof a||null===a||a===p||a instanceof RegExp||a instanceof Date||a instanceof String||a instanceof Number||a instanceof Boolean)return a;var h=a instanceof Array?[]:{};g.save(a,h);c(a,function(c){var d=f(a[c]);switch(typeof d){case "boolean":case "number":case "string":case "function":h[c]=d;break;case "object":case "undefined":var k=
g.get(d);h[c]=k!==p?k:b(d,f,g)}});return h}function c(a,b){if(a instanceof Array){for(var c=0;c<a.length;c++)b(c);"function"==typeof a.toJSON&&b("toJSON")}else for(c in a)b(c)}function d(){this.keys=[];this.values=[]}a.$c=function(c){if(0==arguments.length)throw Error("When calling ko.toJS, pass the object you want to convert.");return b(c,function(b){for(var c=0;a.N(b)&&10>c;c++)b=b();return b})};a.toJSON=function(b,c,d){b=a.$c(b);return a.a.fc(b,c,d)};d.prototype={constructor:d,save:function(b,
c){var d=a.a.A(this.keys,b);0<=d?this.values[d]=c:(this.keys.push(b),this.values.push(c))},get:function(b){b=a.a.A(this.keys,b);return 0<=b?this.values[b]:p}}})();a.b("toJS",a.$c);a.b("toJSON",a.toJSON);a.Vd=function(b,c,d){function e(c){var e=a.wb(b,d).extend({Ga:"always"}),h=e.subscribe(function(a){a&&(h.s(),c(a))});e.notifySubscribers(e.w());return h}return"function"!==typeof Promise||c?e(c.bind(d)):new Promise(e)};a.b("when",a.Vd);(function(){a.u={L:function(b){switch(a.a.P(b)){case "option":return!0===
b.__ko__hasDomDataOptionValue__?a.a.g.get(b,a.f.options.Yb):7>=a.a.W?b.getAttributeNode("value")&&b.getAttributeNode("value").specified?b.value:b.text:b.value;case "select":return 0<=b.selectedIndex?a.u.L(b.options[b.selectedIndex]):p;default:return b.value}},ya:function(b,c,d){switch(a.a.P(b)){case "option":"string"===typeof c?(a.a.g.set(b,a.f.options.Yb,p),"__ko__hasDomDataOptionValue__"in b&&delete b.__ko__hasDomDataOptionValue__,b.value=c):(a.a.g.set(b,a.f.options.Yb,c),b.__ko__hasDomDataOptionValue__=
!0,b.value="number"===typeof c?c:"");break;case "select":if(""===c||null===c)c=p;for(var e=-1,f=0,g=b.options.length,h;f<g;++f)if(h=a.u.L(b.options[f]),h==c||""===h&&c===p){e=f;break}if(d||0<=e||c===p&&1<b.size)b.selectedIndex=e,6===a.a.W&&a.a.setTimeout(function(){b.selectedIndex=e},0);break;default:if(null===c||c===p)c="";b.value=c}}}})();a.b("selectExtensions",a.u);a.b("selectExtensions.readValue",a.u.L);a.b("selectExtensions.writeValue",a.u.ya);a.m=function(){function b(b){b=a.a.Cb(b);123===b.charCodeAt(0)&&
(b=b.slice(1,-1));b+="\n,";var c=[],d=b.match(e),q,n=[],h=0;if(1<d.length){for(var y=0,A;A=d[y];++y){var u=A.charCodeAt(0);if(44===u){if(0>=h){c.push(q&&n.length?{key:q,value:n.join("")}:{unknown:q||n.join("")});q=h=0;n=[];continue}}else if(58===u){if(!h&&!q&&1===n.length){q=n.pop();continue}}else if(47===u&&1<A.length&&(47===A.charCodeAt(1)||42===A.charCodeAt(1)))continue;else 47===u&&y&&1<A.length?(u=d[y-1].match(f))&&!g[u[0]]&&(b=b.substr(b.indexOf(A)+1),d=b.match(e),y=-1,A="/"):40===u||123===
u||91===u?++h:41===u||125===u||93===u?--h:q||n.length||34!==u&&39!==u||(A=A.slice(1,-1));n.push(A)}if(0<h)throw Error("Unbalanced parentheses, braces, or brackets");}return c}var c=["true","false","null","undefined"],d=/^(?:[$_a-z][$\w]*|(.+)(\.\s*[$_a-z][$\w]*|\[.+\]))$/i,e=RegExp("\"(?:\\\\.|[^\"])*\"|'(?:\\\\.|[^'])*'|`(?:\\\\.|[^`])*`|/\\*(?:[^*]|\\*+[^*/])*\\*+/|//.*\n|/(?:\\\\.|[^/])+/w*|[^\\s:,/][^,\"'`{}()/:[\\]]*[^\\s,\"'`{}()/:[\\]]|[^\\s]","g"),f=/[\])"'A-Za-z0-9_$]+$/,g={"in":1,"return":1,
"typeof":1},h={};return{Ra:[],va:h,Zb:b,ub:function(e,f){function k(b,e){var f;if(!y){var l=a.getBindingHandler(b);if(l&&l.preprocess&&!(e=l.preprocess(e,b,k)))return;if(l=h[b])f=e,0<=a.a.A(c,f)?f=!1:(l=f.match(d),f=null===l?!1:l[1]?"Object("+l[1]+")"+l[2]:f),l=f;l&&n.push("'"+("string"==typeof h[b]?h[b]:b)+"':function(_z){"+f+"=_z}")}g&&(e="function(){return "+e+" }");q.push("'"+b+"':"+e)}f=f||{};var q=[],n=[],g=f.valueAccessors,y=f.bindingParams,A="string"===typeof e?b(e):e;a.a.C(A,function(a){k(a.key||
a.unknown,a.value)});n.length&&k("_ko_property_writers","{"+n.join(",")+" }");return q.join(",")},Hd:function(a,b){for(var c=0;c<a.length;c++)if(a[c].key==b)return!0;return!1},$a:function(b,c,d,e,f){if(b&&a.N(b))!a.Ya(b)||f&&b.w()===e||b(e);else if((b=c.get("_ko_property_writers"))&&b[d])b[d](e)}}}();a.b("expressionRewriting",a.m);a.b("expressionRewriting.bindingRewriteValidators",a.m.Ra);a.b("expressionRewriting.parseObjectLiteral",a.m.Zb);a.b("expressionRewriting.preProcessBindings",a.m.ub);a.b("expressionRewriting._twoWayBindings",
a.m.va);a.b("jsonExpressionRewriting",a.m);a.b("jsonExpressionRewriting.insertPropertyAccessorsIntoJson",a.m.ub);(function(){function b(a){return 8==a.nodeType&&g.test(f?a.text:a.nodeValue)}function c(a){return 8==a.nodeType&&h.test(f?a.text:a.nodeValue)}function d(d,e){for(var f=d,g=1,h=[];f=f.nextSibling;){if(c(f)&&(a.a.g.set(f,l,!0),g--,0===g))return h;h.push(f);b(f)&&g++}if(!e)throw Error("Cannot find closing comment tag to match: "+d.nodeValue);return null}function e(a,b){var c=d(a,b);return c?
0<c.length?c[c.length-1].nextSibling:a.nextSibling:null}var f=w&&"\x3c!--test--\x3e"===w.createComment("test").text,g=f?/^\x3c!--\s*ko(?:\s+([\s\S]+))?\s*--\x3e$/:/^\s*ko(?:\s+([\s\S]+))?\s*$/,h=f?/^\x3c!--\s*\/ko\s*--\x3e$/:/^\s*\/ko\s*$/,m={ul:!0,ol:!0},l="__ko_matchedEndComment__";a.h={ea:{},childNodes:function(a){return b(a)?d(a):a.childNodes},Ea:function(c){if(b(c)){c=a.h.childNodes(c);for(var d=0,e=c.length;d<e;d++)a.removeNode(c[d])}else a.a.Sb(c)},ua:function(c,d){if(b(c)){a.h.Ea(c);for(var e=
c.nextSibling,f=0,l=d.length;f<l;f++)e.parentNode.insertBefore(d[f],e)}else a.a.ua(c,d)},Uc:function(a,c){b(a)?a.parentNode.insertBefore(c,a.nextSibling):a.firstChild?a.insertBefore(c,a.firstChild):a.appendChild(c)},Vb:function(c,d,e){e?b(c)?c.parentNode.insertBefore(d,e.nextSibling):e.nextSibling?c.insertBefore(d,e.nextSibling):c.appendChild(d):a.h.Uc(c,d)},firstChild:function(a){if(b(a))return!a.nextSibling||c(a.nextSibling)?null:a.nextSibling;if(a.firstChild&&c(a.firstChild))throw Error("Found invalid end comment, as the first child of "+
a);return a.firstChild},nextSibling:function(d){b(d)&&(d=e(d));if(d.nextSibling&&c(d.nextSibling)){var f=d.nextSibling;if(c(f)&&!a.a.g.get(f,l))throw Error("Found end comment without a matching opening comment, as child of "+d);return null}return d.nextSibling},Bd:b,Ud:function(a){return(a=(f?a.text:a.nodeValue).match(g))?a[1]:null},Rc:function(d){if(m[a.a.P(d)]){var f=d.firstChild;if(f){do if(1===f.nodeType){var l;l=f.firstChild;var g=null;if(l){do if(g)g.push(l);else if(b(l)){var h=e(l,!0);h?l=
h:g=[l]}else c(l)&&(g=[l]);while(l=l.nextSibling)}if(l=g)for(g=f.nextSibling,h=0;h<l.length;h++)g?d.insertBefore(l[h],g):d.appendChild(l[h])}while(f=f.nextSibling)}}}}})();a.b("virtualElements",a.h);a.b("virtualElements.allowedBindings",a.h.ea);a.b("virtualElements.emptyNode",a.h.Ea);a.b("virtualElements.insertAfter",a.h.Vb);a.b("virtualElements.prepend",a.h.Uc);a.b("virtualElements.setDomNodeChildren",a.h.ua);(function(){a.ga=function(){this.md={}};a.a.extend(a.ga.prototype,{nodeHasBindings:function(b){switch(b.nodeType){case 1:return null!=
b.getAttribute("data-bind")||a.i.getComponentNameForNode(b);case 8:return a.h.Bd(b);default:return!1}},getBindings:function(b,c){var d=this.getBindingsString(b,c),d=d?this.parseBindingsString(d,c,b):null;return a.i.sc(d,b,c,!1)},getBindingAccessors:function(b,c){var d=this.getBindingsString(b,c),d=d?this.parseBindingsString(d,c,b,{valueAccessors:!0}):null;return a.i.sc(d,b,c,!0)},getBindingsString:function(b){switch(b.nodeType){case 1:return b.getAttribute("data-bind");case 8:return a.h.Ud(b);default:return null}},
parseBindingsString:function(b,c,d,e){try{var f=this.md,g=b+(e&&e.valueAccessors||""),h;if(!(h=f[g])){var m,l="with($context){with($data||{}){return{"+a.m.ub(b,e)+"}}}";m=new Function("$context","$element",l);h=f[g]=m}return h(c,d)}catch(k){throw k.message="Unable to parse bindings.\nBindings value: "+b+"\nMessage: "+k.message,k;}}});a.ga.instance=new a.ga})();a.b("bindingProvider",a.ga);(function(){function b(b){var c=(b=a.a.g.get(b,B))&&b.M;c&&(b.M=null,c.Sc())}function c(c,d,e){this.node=c;this.xc=
d;this.ib=[];this.T=!1;d.M||a.a.I.za(c,b);e&&e.M&&(e.M.ib.push(c),this.Kb=e)}function d(a){return function(){return a}}function e(a){return a()}function f(b){return a.a.Ha(a.v.K(b),function(a,c){return function(){return b()[c]}})}function g(b,c,e){return"function"===typeof b?f(b.bind(null,c,e)):a.a.Ha(b,d)}function h(a,b){return f(this.getBindings.bind(this,a,b))}function m(b,c){var d=a.h.firstChild(c);if(d){var e,f=a.ga.instance,k=f.preprocessNode;if(k){for(;e=d;)d=a.h.nextSibling(e),k.call(f,e);
d=a.h.firstChild(c)}for(;e=d;)d=a.h.nextSibling(e),l(b,e)}a.j.Ga(c,a.j.T)}function l(b,c){var d=b,e=1===c.nodeType;e&&a.h.Rc(c);if(e||a.ga.instance.nodeHasBindings(c))d=q(c,null,b).bindingContextForDescendants;d&&!u[a.a.P(c)]&&m(d,c)}function k(b){var c=[],d={},e=[];a.a.O(b,function ca(f){if(!d[f]){var l=a.getBindingHandler(f);l&&(l.after&&(e.push(f),a.a.C(l.after,function(c){if(b[c]){if(-1!==a.a.A(e,c))throw Error("Cannot combine the following bindings, because they have a cyclic dependency: "+e.join(", "));
ca(c)}}),e.length--),c.push({key:f,Lc:l}));d[f]=!0}});return c}function q(b,c,d){var f=a.a.g.Tb(b,B,{}),l=f.gd;if(!c){if(l)throw Error("You cannot apply bindings multiple times to the same element.");f.gd=!0}l||(f.context=d);var g;if(c&&"function"!==typeof c)g=c;else{var q=a.ga.instance,n=q.getBindingAccessors||h,m=a.$(function(){if(g=c?c(d,b):n.call(q,b,d)){if(d[r])d[r]();if(d[A])d[A]()}return g},null,{l:b});g&&m.ja()||(m=null)}var y=d,u;if(g){var J=function(){return a.a.Ha(m?m():g,e)},t=m?function(a){return function(){return e(m()[a])}}:
function(a){return g[a]};J.get=function(a){return g[a]&&e(t(a))};J.has=function(a){return a in g};a.j.T in g&&a.j.subscribe(b,a.j.T,function(){var c=(0,g[a.j.T])();if(c){var d=a.h.childNodes(b);d.length&&c(d,a.Dc(d[0]))}});a.j.oa in g&&(y=a.j.Bb(b,d),a.j.subscribe(b,a.j.oa,function(){var c=(0,g[a.j.oa])();c&&a.h.firstChild(b)&&c(b)}));f=k(g);a.a.C(f,function(c){var d=c.Lc.init,e=c.Lc.update,f=c.key;if(8===b.nodeType&&!a.h.ea[f])throw Error("The binding '"+f+"' cannot be used with virtual elements");
try{"function"==typeof d&&a.v.K(function(){var a=d(b,t(f),J,y.$data,y);if(a&&a.controlsDescendantBindings){if(u!==p)throw Error("Multiple bindings ("+u+" and "+f+") are trying to control descendant bindings of the same element. You cannot use these bindings together on the same element.");u=f}}),"function"==typeof e&&a.$(function(){e(b,t(f),J,y.$data,y)},null,{l:b})}catch(l){throw l.message='Unable to process binding "'+f+": "+g[f]+'"\nMessage: '+l.message,l;}})}f=u===p;return{shouldBindDescendants:f,
bindingContextForDescendants:f&&y}}function n(b,c){return b&&b instanceof a.fa?b:new a.fa(b,p,p,c)}var r=a.a.Da("_subscribable"),y=a.a.Da("_ancestorBindingInfo"),A=a.a.Da("_dataDependency");a.f={};var u={script:!0,textarea:!0,template:!0};a.getBindingHandler=function(b){return a.f[b]};var J={};a.fa=function(b,c,d,e,f){function l(){var b=q?h():h,f=a.a.c(b);c?(a.a.extend(k,c),y in c&&(k[y]=c[y])):(k.$parents=[],k.$root=f,k.ko=a);k[r]=n;g?f=k.$data:(k.$rawData=b,k.$data=f);d&&(k[d]=f);e&&e(k,c,f);if(c&&
c[r]&&!a.U.o().Ub(c[r]))c[r]();m&&(k[A]=m);return k.$data}var k=this,g=b===J,h=g?p:b,q="function"==typeof h&&!a.N(h),n,m=f&&f.dataDependency;f&&f.exportDependencies?l():(n=a.wb(l),n.w(),n.ja()?n.equalityComparer=null:k[r]=p)};a.fa.prototype.createChildContext=function(b,c,d,e){!e&&c&&"object"==typeof c&&(e=c,c=e.as,d=e.extend);if(c&&e&&e.noChildContext){var f="function"==typeof b&&!a.N(b);return new a.fa(J,this,null,function(a){d&&d(a);a[c]=f?b():b},e)}return new a.fa(b,this,c,function(a,b){a.$parentContext=
b;a.$parent=b.$data;a.$parents=(b.$parents||[]).slice(0);a.$parents.unshift(a.$parent);d&&d(a)},e)};a.fa.prototype.extend=function(b,c){return new a.fa(J,this,null,function(c){a.a.extend(c,"function"==typeof b?b(c):b)},c)};var B=a.a.g.Z();c.prototype.Sc=function(){this.Kb&&this.Kb.M&&this.Kb.M.rd(this.node)};c.prototype.rd=function(b){a.a.hb(this.ib,b);!this.ib.length&&this.T&&this.Bc()};c.prototype.Bc=function(){this.T=!0;this.xc.M&&!this.ib.length&&(this.xc.M=null,a.a.I.xb(this.node,b),a.j.Ga(this.node,
a.j.oa),this.Sc())};a.j={T:"childrenComplete",oa:"descendantsComplete",subscribe:function(b,c,d,e){b=a.a.g.Tb(b,B,{});b.Fa||(b.Fa=new a.R);return b.Fa.subscribe(d,e,c)},Ga:function(b,c){var d=a.a.g.get(b,B);if(d&&(d.Fa&&d.Fa.notifySubscribers(b,c),c==a.j.T))if(d.M)d.M.Bc();else if(d.M===p&&d.Fa&&d.Fa.Wa(a.j.oa))throw Error("descendantsComplete event not supported for bindings on this node");},Bb:function(b,d){var e=a.a.g.Tb(b,B,{});e.M||(e.M=new c(b,e,d[y]));return d[y]==e?d:d.extend(function(a){a[y]=
e})}};a.Sd=function(b){return(b=a.a.g.get(b,B))&&b.context};a.eb=function(b,c,d){1===b.nodeType&&a.h.Rc(b);return q(b,c,n(d))};a.kd=function(b,c,d){d=n(d);return a.eb(b,g(c,d,b),d)};a.Pa=function(a,b){1!==b.nodeType&&8!==b.nodeType||m(n(a),b)};a.uc=function(a,b,c){!v&&z.jQuery&&(v=z.jQuery);if(2>arguments.length){if(b=w.body,!b)throw Error("ko.applyBindings: could not find document.body; has the document been loaded?");}else if(!b||1!==b.nodeType&&8!==b.nodeType)throw Error("ko.applyBindings: first parameter should be your view model; second parameter should be a DOM node");
l(n(a,c),b)};a.Cc=function(b){return!b||1!==b.nodeType&&8!==b.nodeType?p:a.Sd(b)};a.Dc=function(b){return(b=a.Cc(b))?b.$data:p};a.b("bindingHandlers",a.f);a.b("bindingEvent",a.j);a.b("bindingEvent.subscribe",a.j.subscribe);a.b("bindingEvent.startPossiblyAsyncContentBinding",a.j.Bb);a.b("applyBindings",a.uc);a.b("applyBindingsToDescendants",a.Pa);a.b("applyBindingAccessorsToNode",a.eb);a.b("applyBindingsToNode",a.kd);a.b("contextFor",a.Cc);a.b("dataFor",a.Dc)})();(function(b){function c(c,e){var l=
Object.prototype.hasOwnProperty.call(f,c)?f[c]:b,k;l?l.subscribe(e):(l=f[c]=new a.R,l.subscribe(e),d(c,function(b,d){var e=!(!d||!d.synchronous);g[c]={definition:b,Fd:e};delete f[c];k||e?l.notifySubscribers(b):a.ma.yb(function(){l.notifySubscribers(b)})}),k=!0)}function d(a,b){e("getConfig",[a],function(c){c?e("loadComponent",[a,c],function(a){b(a,c)}):b(null,null)})}function e(c,d,f,k){k||(k=a.i.loaders.slice(0));var g=k.shift();if(g){var n=g[c];if(n){var r=!1;if(n.apply(g,d.concat(function(a){r?
f(null):null!==a?f(a):e(c,d,f,k)}))!==b&&(r=!0,!g.suppressLoaderExceptions))throw Error("Component loaders must supply values by invoking the callback, not by returning values synchronously.");}else e(c,d,f,k)}else f(null)}var f={},g={};a.i={get:function(d,e){var f=Object.prototype.hasOwnProperty.call(g,d)?g[d]:b;f?f.Fd?a.v.K(function(){e(f.definition)}):a.ma.yb(function(){e(f.definition)}):c(d,e)},Ac:function(a){delete g[a]},nc:e};a.i.loaders=[];a.b("components",a.i);a.b("components.get",a.i.get);
a.b("components.clearCachedDefinition",a.i.Ac)})();(function(){function b(b,c,d,e){function g(){0===--A&&e(h)}var h={},A=2,u=d.template;d=d.viewModel;u?f(c,u,function(c){a.i.nc("loadTemplate",[b,c],function(a){h.template=a;g()})}):g();d?f(c,d,function(c){a.i.nc("loadViewModel",[b,c],function(a){h[m]=a;g()})}):g()}function c(a,b,d){if("function"===typeof b)d(function(a){return new b(a)});else if("function"===typeof b[m])d(b[m]);else if("instance"in b){var e=b.instance;d(function(){return e})}else"viewModel"in
b?c(a,b.viewModel,d):a("Unknown viewModel value: "+b)}function d(b){switch(a.a.P(b)){case "script":return a.a.ta(b.text);case "textarea":return a.a.ta(b.value);case "template":if(e(b.content))return a.a.Ca(b.content.childNodes)}return a.a.Ca(b.childNodes)}function e(a){return z.DocumentFragment?a instanceof DocumentFragment:a&&11===a.nodeType}function f(a,b,c){"string"===typeof b.require?T||z.require?(T||z.require)([b.require],c):a("Uses require, but no AMD loader is present"):c(b)}function g(a){return function(b){throw Error("Component '"+
a+"': "+b);}}var h={};a.i.register=function(b,c){if(!c)throw Error("Invalid configuration for "+b);if(a.i.sb(b))throw Error("Component "+b+" is already registered");h[b]=c};a.i.sb=function(a){return Object.prototype.hasOwnProperty.call(h,a)};a.i.unregister=function(b){delete h[b];a.i.Ac(b)};a.i.Ec={getConfig:function(b,c){c(a.i.sb(b)?h[b]:null)},loadComponent:function(a,c,d){var e=g(a);f(e,c,function(c){b(a,e,c,d)})},loadTemplate:function(b,c,f){b=g(b);if("string"===typeof c)f(a.a.ta(c));else if(c instanceof
Array)f(c);else if(e(c))f(a.a.la(c.childNodes));else if(c.element)if(c=c.element,z.HTMLElement?c instanceof HTMLElement:c&&c.tagName&&1===c.nodeType)f(d(c));else if("string"===typeof c){var h=w.getElementById(c);h?f(d(h)):b("Cannot find element with ID "+c)}else b("Unknown element type: "+c);else b("Unknown template value: "+c)},loadViewModel:function(a,b,d){c(g(a),b,d)}};var m="createViewModel";a.b("components.register",a.i.register);a.b("components.isRegistered",a.i.sb);a.b("components.unregister",
a.i.unregister);a.b("components.defaultLoader",a.i.Ec);a.i.loaders.push(a.i.Ec);a.i.cd=h})();(function(){function b(b,e){var f=b.getAttribute("params");if(f){var f=c.parseBindingsString(f,e,b,{valueAccessors:!0,bindingParams:!0}),f=a.a.Ha(f,function(c){return a.o(c,null,{l:b})}),g=a.a.Ha(f,function(c){var e=c.w();return c.ja()?a.o({read:function(){return a.a.c(c())},write:a.Ya(e)&&function(a){c()(a)},l:b}):e});Object.prototype.hasOwnProperty.call(g,"$raw")||(g.$raw=f);return g}return{$raw:{}}}a.i.getComponentNameForNode=
function(b){var c=a.a.P(b);if(a.i.sb(c)&&(-1!=c.indexOf("-")||"[object HTMLUnknownElement]"==""+b||8>=a.a.W&&b.tagName===c))return c};a.i.sc=function(c,e,f,g){if(1===e.nodeType){var h=a.i.getComponentNameForNode(e);if(h){c=c||{};if(c.component)throw Error('Cannot use the "component" binding on a custom element matching a component');var m={name:h,params:b(e,f)};c.component=g?function(){return m}:m}}return c};var c=new a.ga;9>a.a.W&&(a.i.register=function(a){return function(b){return a.apply(this,
arguments)}}(a.i.register),w.createDocumentFragment=function(b){return function(){var c=b(),f=a.i.cd,g;for(g in f);return c}}(w.createDocumentFragment))})();(function(){function b(b,c,d){c=c.template;if(!c)throw Error("Component '"+b+"' has no template");b=a.a.Ca(c);a.h.ua(d,b)}function c(a,b,c){var d=a.createViewModel;return d?d.call(a,b,c):b}var d=0;a.f.component={init:function(e,f,g,h,m){function l(){var a=k&&k.dispose;"function"===typeof a&&a.call(k);n&&n.s();q=k=n=null}var k,q,n,r=a.a.la(a.h.childNodes(e));
a.h.Ea(e);a.a.I.za(e,l);a.o(function(){var g=a.a.c(f()),h,u;"string"===typeof g?h=g:(h=a.a.c(g.name),u=a.a.c(g.params));if(!h)throw Error("No component name specified");var p=a.j.Bb(e,m),B=q=++d;a.i.get(h,function(d){if(q===B){l();if(!d)throw Error("Unknown component '"+h+"'");b(h,d,e);var f=c(d,u,{element:e,templateNodes:r});d=p.createChildContext(f,{extend:function(a){a.$component=f;a.$componentTemplateNodes=r}});f&&f.koDescendantsComplete&&(n=a.j.subscribe(e,a.j.oa,f.koDescendantsComplete,f));
k=f;a.Pa(d,e)}})},null,{l:e});return{controlsDescendantBindings:!0}}};a.h.ea.component=!0})();var V={"class":"className","for":"htmlFor"};a.f.attr={update:function(b,c){var d=a.a.c(c())||{};a.a.O(d,function(c,d){d=a.a.c(d);var g=c.indexOf(":"),g="lookupNamespaceURI"in b&&0<g&&b.lookupNamespaceURI(c.substr(0,g)),h=!1===d||null===d||d===p;h?g?b.removeAttributeNS(g,c):b.removeAttribute(c):d=d.toString();8>=a.a.W&&c in V?(c=V[c],h?b.removeAttribute(c):b[c]=d):h||(g?b.setAttributeNS(g,c,d):b.setAttribute(c,
d));"name"===c&&a.a.Xc(b,h?"":d)})}};(function(){a.f.checked={after:["value","attr"],init:function(b,c,d){function e(){var e=b.checked,f=g();if(!a.U.rb()&&(e||!m&&!a.U.pa())){var l=a.v.K(c);if(k){var n=q?l.w():l,B=r;r=f;B!==f?e&&(a.a.Oa(n,f,!0),a.a.Oa(n,B,!1)):a.a.Oa(n,f,e);q&&a.Ya(l)&&l(n)}else h&&(f===p?f=e:e||(f=p)),a.m.$a(l,d,"checked",f,!0)}}function f(){var d=a.a.c(c()),e=g();k?(b.checked=0<=a.a.A(d,e),r=e):b.checked=h&&e===p?!!d:g()===d}var g=a.wb(function(){if(d.has("checkedValue"))return a.a.c(d.get("checkedValue"));
if(n)return d.has("value")?a.a.c(d.get("value")):b.value}),h="checkbox"==b.type,m="radio"==b.type;if(h||m){var l=c(),k=h&&a.a.c(l)instanceof Array,q=!(k&&l.push&&l.splice),n=m||k,r=k?g():p;m&&!b.name&&a.f.uniqueName.init(b,function(){return!0});a.o(e,null,{l:b});a.a.H(b,"click",e);a.o(f,null,{l:b});l=p}}};a.m.va.checked=!0;a.f.checkedValue={update:function(b,c){b.value=a.a.c(c())}}})();a.f["class"]={update:function(b,c){var d=a.a.Cb(a.a.c(c()));a.a.Eb(b,b.__ko__cssValue,!1);b.__ko__cssValue=d;a.a.Eb(b,
d,!0)}};a.f.css={update:function(b,c){var d=a.a.c(c());null!==d&&"object"==typeof d?a.a.O(d,function(c,d){d=a.a.c(d);a.a.Eb(b,c,d)}):a.f["class"].update(b,c)}};a.f.enable={update:function(b,c){var d=a.a.c(c());d&&b.disabled?b.removeAttribute("disabled"):d||b.disabled||(b.disabled=!0)}};a.f.disable={update:function(b,c){a.f.enable.update(b,function(){return!a.a.c(c())})}};a.f.event={init:function(b,c,d,e,f){var g=c()||{};a.a.O(g,function(g){"string"==typeof g&&a.a.H(b,g,function(b){var l,k=c()[g];
if(k){try{var q=a.a.la(arguments);e=f.$data;q.unshift(e);l=k.apply(e,q)}finally{!0!==l&&(b.preventDefault?b.preventDefault():b.returnValue=!1)}!1===d.get(g+"Bubble")&&(b.cancelBubble=!0,b.stopPropagation&&b.stopPropagation())}})})}};a.f.foreach={Qc:function(b){return function(){var c=b(),d=a.a.$b(c);if(!d||"number"==typeof d.length)return{foreach:c,templateEngine:a.ba.Na};a.a.c(c);return{foreach:d.data,as:d.as,noChildContext:d.noChildContext,includeDestroyed:d.includeDestroyed,afterAdd:d.afterAdd,
beforeRemove:d.beforeRemove,afterRender:d.afterRender,beforeMove:d.beforeMove,afterMove:d.afterMove,templateEngine:a.ba.Na}}},init:function(b,c){return a.f.template.init(b,a.f.foreach.Qc(c))},update:function(b,c,d,e,f){return a.f.template.update(b,a.f.foreach.Qc(c),d,e,f)}};a.m.Ra.foreach=!1;a.h.ea.foreach=!0;a.f.hasfocus={init:function(b,c,d){function e(e){b.__ko_hasfocusUpdating=!0;var f=b.ownerDocument;if("activeElement"in f){var g;try{g=f.activeElement}catch(k){g=f.body}e=g===b}f=c();a.m.$a(f,
d,"hasfocus",e,!0);b.__ko_hasfocusLastValue=e;b.__ko_hasfocusUpdating=!1}var f=e.bind(null,!0),g=e.bind(null,!1);a.a.H(b,"focus",f);a.a.H(b,"focusin",f);a.a.H(b,"blur",g);a.a.H(b,"focusout",g);b.__ko_hasfocusLastValue=!1},update:function(b,c){var d=!!a.a.c(c());b.__ko_hasfocusUpdating||b.__ko_hasfocusLastValue===d||(d?b.focus():b.blur(),!d&&b.__ko_hasfocusLastValue&&b.ownerDocument.body.focus(),a.v.K(a.a.Fb,null,[b,d?"focusin":"focusout"]))}};a.m.va.hasfocus=!0;a.f.hasFocus=a.f.hasfocus;a.m.va.hasFocus=
"hasfocus";a.f.html={init:function(){return{controlsDescendantBindings:!0}},update:function(b,c){a.a.dc(b,c())}};(function(){function b(b,d,e){a.f[b]={init:function(b,c,h,m,l){var k,q,n={},r,p,A;if(d){m=h.get("as");var u=h.get("noChildContext");A=!(m&&u);n={as:m,noChildContext:u,exportDependencies:A}}p=(r="render"==h.get("completeOn"))||h.has(a.j.oa);a.o(function(){var h=a.a.c(c()),m=!e!==!h,u=!q,t;if(A||m!==k){p&&(l=a.j.Bb(b,l));if(m){if(!d||A)n.dataDependency=a.U.o();t=d?l.createChildContext("function"==
typeof h?h:c,n):a.U.pa()?l.extend(null,n):l}u&&a.U.pa()&&(q=a.a.Ca(a.h.childNodes(b),!0));m?(u||a.h.ua(b,a.a.Ca(q)),a.Pa(t,b)):(a.h.Ea(b),r||a.j.Ga(b,a.j.T));k=m}},null,{l:b});return{controlsDescendantBindings:!0}}};a.m.Ra[b]=!1;a.h.ea[b]=!0}b("if");b("ifnot",!1,!0);b("with",!0)})();a.f.let={init:function(b,c,d,e,f){c=f.extend(c);a.Pa(c,b);return{controlsDescendantBindings:!0}}};a.h.ea.let=!0;var Q={};a.f.options={init:function(b){if("select"!==a.a.P(b))throw Error("options binding applies only to SELECT elements");
for(;0<b.length;)b.remove(0);return{controlsDescendantBindings:!0}},update:function(b,c,d){function e(){return a.a.fb(b.options,function(a){return a.selected})}function f(a,b,c){var d=typeof b;return"function"==d?b(a):"string"==d?a[b]:c}function g(c,e){if(y&&k)a.u.ya(b,a.a.c(d.get("value")),!0);else if(r.length){var f=0<=a.a.A(r,a.u.L(e[0]));a.a.Yc(e[0],f);y&&!f&&a.v.K(a.a.Fb,null,[b,"change"])}}var h=b.multiple,m=0!=b.length&&h?b.scrollTop:null,l=a.a.c(c()),k=d.get("valueAllowUnset")&&d.has("value"),
q=d.get("optionsIncludeDestroyed");c={};var n,r=[];k||(h?r=a.a.Mb(e(),a.u.L):0<=b.selectedIndex&&r.push(a.u.L(b.options[b.selectedIndex])));l&&("undefined"==typeof l.length&&(l=[l]),n=a.a.fb(l,function(b){return q||b===p||null===b||!a.a.c(b._destroy)}),d.has("optionsCaption")&&(l=a.a.c(d.get("optionsCaption")),null!==l&&l!==p&&n.unshift(Q)));var y=!1;c.beforeRemove=function(a){b.removeChild(a)};l=g;d.has("optionsAfterRender")&&"function"==typeof d.get("optionsAfterRender")&&(l=function(b,c){g(0,c);
a.v.K(d.get("optionsAfterRender"),null,[c[0],b!==Q?b:p])});a.a.cc(b,n,function(c,e,g){g.length&&(r=!k&&g[0].selected?[a.u.L(g[0])]:[],y=!0);e=b.ownerDocument.createElement("option");c===Q?(a.a.Ab(e,d.get("optionsCaption")),a.u.ya(e,p)):(g=f(c,d.get("optionsValue"),c),a.u.ya(e,a.a.c(g)),c=f(c,d.get("optionsText"),g),a.a.Ab(e,c));return[e]},c,l);a.v.K(function(){if(k)a.u.ya(b,a.a.c(d.get("value")),!0);else{var c;h?c=r.length&&e().length<r.length:c=r.length&&0<=b.selectedIndex?a.u.L(b.options[b.selectedIndex])!==
r[0]:r.length||0<=b.selectedIndex;c&&a.a.Fb(b,"change")}});a.a.vd(b);m&&20<Math.abs(m-b.scrollTop)&&(b.scrollTop=m)}};a.f.options.Yb=a.a.g.Z();a.f.selectedOptions={after:["options","foreach"],init:function(b,c,d){a.a.H(b,"change",function(){var e=c(),f=[];a.a.C(b.getElementsByTagName("option"),function(b){b.selected&&f.push(a.u.L(b))});a.m.$a(e,d,"selectedOptions",f)})},update:function(b,c){if("select"!=a.a.P(b))throw Error("values binding applies only to SELECT elements");var d=a.a.c(c()),e=b.scrollTop;
d&&"number"==typeof d.length&&a.a.C(b.getElementsByTagName("option"),function(b){var c=0<=a.a.A(d,a.u.L(b));b.selected!=c&&a.a.Yc(b,c)});b.scrollTop=e}};a.m.va.selectedOptions=!0;a.f.style={update:function(b,c){var d=a.a.c(c()||{});a.a.O(d,function(c,d){d=a.a.c(d);if(null===d||d===p||!1===d)d="";if(v)v(b).css(c,d);else if(/^--/.test(c))b.style.setProperty(c,d);else{c=c.replace(/-(\w)/g,function(a,b){return b.toUpperCase()});var g=b.style[c];b.style[c]=d;d===g||b.style[c]!=g||isNaN(d)||(b.style[c]=
d+"px")}})}};a.f.submit={init:function(b,c,d,e,f){if("function"!=typeof c())throw Error("The value for a submit binding must be a function");a.a.H(b,"submit",function(a){var d,e=c();try{d=e.call(f.$data,b)}finally{!0!==d&&(a.preventDefault?a.preventDefault():a.returnValue=!1)}})}};a.f.text={init:function(){return{controlsDescendantBindings:!0}},update:function(b,c){a.a.Ab(b,c())}};a.h.ea.text=!0;(function(){if(z&&z.navigator){var b=function(a){if(a)return parseFloat(a[1])},c=z.navigator.userAgent,
d,e,f,g,h;(d=z.opera&&z.opera.version&&parseInt(z.opera.version()))||(h=b(c.match(/Edge\/([^ ]+)$/)))||b(c.match(/Chrome\/([^ ]+)/))||(e=b(c.match(/Version\/([^ ]+) Safari/)))||(f=b(c.match(/Firefox\/([^ ]+)/)))||(g=a.a.W||b(c.match(/MSIE ([^ ]+)/)))||(g=b(c.match(/rv:([^ )]+)/)))}if(8<=g&&10>g)var m=a.a.g.Z(),l=a.a.g.Z(),k=function(b){var c=this.activeElement;(c=c&&a.a.g.get(c,l))&&c(b)},q=function(b,c){var d=b.ownerDocument;a.a.g.get(d,m)||(a.a.g.set(d,m,!0),a.a.H(d,"selectionchange",k));a.a.g.set(b,
l,c)};a.f.textInput={init:function(b,c,l){function k(c,d){a.a.H(b,c,d)}function m(){var d=a.a.c(c());if(null===d||d===p)d="";L!==p&&d===L?a.a.setTimeout(m,4):b.value!==d&&(x=!0,b.value=d,x=!1,v=b.value)}function t(){w||(L=b.value,w=a.a.setTimeout(B,4))}function B(){clearTimeout(w);L=w=p;var d=b.value;v!==d&&(v=d,a.m.$a(c(),l,"textInput",d))}var v=b.value,w,L,z=9==a.a.W?t:B,x=!1;g&&k("keypress",B);11>g&&k("propertychange",function(a){x||"value"!==a.propertyName||z(a)});8==g&&(k("keyup",B),k("keydown",
B));q&&(q(b,z),k("dragend",t));(!g||9<=g)&&k("input",z);5>e&&"textarea"===a.a.P(b)?(k("keydown",t),k("paste",t),k("cut",t)):11>d?k("keydown",t):4>f?(k("DOMAutoComplete",B),k("dragdrop",B),k("drop",B)):h&&"number"===b.type&&k("keydown",t);k("change",B);k("blur",B);a.o(m,null,{l:b})}};a.m.va.textInput=!0;a.f.textinput={preprocess:function(a,b,c){c("textInput",a)}}})();a.f.uniqueName={init:function(b,c){if(c()){var d="ko_unique_"+ ++a.f.uniqueName.qd;a.a.Xc(b,d)}}};a.f.uniqueName.qd=0;a.f.using={init:function(b,
c,d,e,f){var g;d.has("as")&&(g={as:d.get("as"),noChildContext:d.get("noChildContext")});c=f.createChildContext(c,g);a.Pa(c,b);return{controlsDescendantBindings:!0}}};a.h.ea.using=!0;a.f.value={after:["options","foreach"],init:function(b,c,d){var e=a.a.P(b),f="input"==e;if(!f||"checkbox"!=b.type&&"radio"!=b.type){var g=["change"],h=d.get("valueUpdate"),m=!1,l=null;h&&("string"==typeof h&&(h=[h]),a.a.gb(g,h),g=a.a.vc(g));var k=function(){l=null;m=!1;var e=c(),f=a.u.L(b);a.m.$a(e,d,"value",f)};!a.a.W||
!f||"text"!=b.type||"off"==b.autocomplete||b.form&&"off"==b.form.autocomplete||-1!=a.a.A(g,"propertychange")||(a.a.H(b,"propertychange",function(){m=!0}),a.a.H(b,"focus",function(){m=!1}),a.a.H(b,"blur",function(){m&&k()}));a.a.C(g,function(c){var d=k;a.a.Td(c,"after")&&(d=function(){l=a.u.L(b);a.a.setTimeout(k,0)},c=c.substring(5));a.a.H(b,c,d)});var q;q=f&&"file"==b.type?function(){var d=a.a.c(c());null===d||d===p||""===d?b.value="":a.v.K(k)}:function(){var f=a.a.c(c()),g=a.u.L(b);if(null!==l&&
f===l)a.a.setTimeout(q,0);else if(f!==g||g===p)"select"===e?(g=d.get("valueAllowUnset"),a.u.ya(b,f,g),g||f===a.u.L(b)||a.v.K(k)):a.u.ya(b,f)};a.o(q,null,{l:b})}else a.eb(b,{checkedValue:c})},update:function(){}};a.m.va.value=!0;a.f.visible={update:function(b,c){var d=a.a.c(c()),e="none"!=b.style.display;d&&!e?b.style.display="":!d&&e&&(b.style.display="none")}};a.f.hidden={update:function(b,c){a.f.visible.update(b,function(){return!a.a.c(c())})}};(function(b){a.f[b]={init:function(c,d,e,f,g){return a.f.event.init.call(this,
c,function(){var a={};a[b]=d();return a},e,f,g)}}})("click");a.ca=function(){};a.ca.prototype.renderTemplateSource=function(){throw Error("Override renderTemplateSource");};a.ca.prototype.createJavaScriptEvaluatorBlock=function(){throw Error("Override createJavaScriptEvaluatorBlock");};a.ca.prototype.makeTemplateSource=function(b,c){if("string"==typeof b){c=c||w;var d=c.getElementById(b);if(!d)throw Error("Cannot find template with ID "+b);return new a.B.D(d)}if(1==b.nodeType||8==b.nodeType)return new a.B.ia(b);
throw Error("Unknown template type: "+b);};a.ca.prototype.renderTemplate=function(a,c,d,e){a=this.makeTemplateSource(a,e);return this.renderTemplateSource(a,c,d,e)};a.ca.prototype.isTemplateRewritten=function(a,c){return!1===this.allowTemplateRewriting?!0:this.makeTemplateSource(a,c).data("isRewritten")};a.ca.prototype.rewriteTemplate=function(a,c,d){a=this.makeTemplateSource(a,d);c=c(a.text());a.text(c);a.data("isRewritten",!0)};a.b("templateEngine",a.ca);a.ic=function(){function b(b,c,d,h){b=a.m.Zb(b);
for(var m=a.m.Ra,l=0;l<b.length;l++){var k=b[l].key;if(Object.prototype.hasOwnProperty.call(m,k)){var q=m[k];if("function"===typeof q){if(k=q(b[l].value))throw Error(k);}else if(!q)throw Error("This template engine does not support the '"+k+"' binding within its templates");}}d="ko.__tr_ambtns(function($context,$element){return(function(){return{ "+a.m.ub(b,{valueAccessors:!0})+" } })()},'"+d.toLowerCase()+"')";return h.createJavaScriptEvaluatorBlock(d)+c}var c=/(<([a-z]+\d*)(?:\s+(?!data-bind\s*=\s*)[a-z0-9\-]+(?:=(?:\"[^\"]*\"|\'[^\']*\'|[^>]*))?)*\s+)data-bind\s*=\s*(["'])([\s\S]*?)\3/gi,
d=/\x3c!--\s*ko\b\s*([\s\S]*?)\s*--\x3e/g;return{wd:function(b,c,d){c.isTemplateRewritten(b,d)||c.rewriteTemplate(b,function(b){return a.ic.Kd(b,c)},d)},Kd:function(a,f){return a.replace(c,function(a,c,d,e,k){return b(k,c,d,f)}).replace(d,function(a,c){return b(c,"\x3c!-- ko --\x3e","#comment",f)})},ld:function(b,c){return a.aa.Wb(function(d,h){var m=d.nextSibling;m&&m.nodeName.toLowerCase()===c&&a.eb(m,b,h)})}}}();a.b("__tr_ambtns",a.ic.ld);(function(){a.B={};a.B.D=function(b){if(this.D=b){var c=
a.a.P(b);this.Db="script"===c?1:"textarea"===c?2:"template"==c&&b.content&&11===b.content.nodeType?3:4}};a.B.D.prototype.text=function(){var b=1===this.Db?"text":2===this.Db?"value":"innerHTML";if(0==arguments.length)return this.D[b];var c=arguments[0];"innerHTML"===b?a.a.dc(this.D,c):this.D[b]=c};var b=a.a.g.Z()+"_";a.B.D.prototype.data=function(c){if(1===arguments.length)return a.a.g.get(this.D,b+c);a.a.g.set(this.D,b+c,arguments[1])};var c=a.a.g.Z();a.B.D.prototype.nodes=function(){var b=this.D;
if(0==arguments.length){var e=a.a.g.get(b,c)||{},f=e.jb||(3===this.Db?b.content:4===this.Db?b:p);if(!f||e.hd)if(e=this.text())f=a.a.Ld(e,b.ownerDocument),this.text(""),a.a.g.set(b,c,{jb:f,hd:!0});return f}a.a.g.set(b,c,{jb:arguments[0]})};a.B.ia=function(a){this.D=a};a.B.ia.prototype=new a.B.D;a.B.ia.prototype.constructor=a.B.ia;a.B.ia.prototype.text=function(){if(0==arguments.length){var b=a.a.g.get(this.D,c)||{};b.jc===p&&b.jb&&(b.jc=b.jb.innerHTML);return b.jc}a.a.g.set(this.D,c,{jc:arguments[0]})};
a.b("templateSources",a.B);a.b("templateSources.domElement",a.B.D);a.b("templateSources.anonymousTemplate",a.B.ia)})();(function(){function b(b,c,d){var e;for(c=a.h.nextSibling(c);b&&(e=b)!==c;)b=a.h.nextSibling(e),d(e,b)}function c(c,d){if(c.length){var e=c[0],f=c[c.length-1],g=e.parentNode,h=a.ga.instance,m=h.preprocessNode;if(m){b(e,f,function(a,b){var c=a.previousSibling,d=m.call(h,a);d&&(a===e&&(e=d[0]||b),a===f&&(f=d[d.length-1]||c))});c.length=0;if(!e)return;e===f?c.push(e):(c.push(e,f),a.a.Ua(c,
g))}b(e,f,function(b){1!==b.nodeType&&8!==b.nodeType||a.uc(d,b)});b(e,f,function(b){1!==b.nodeType&&8!==b.nodeType||a.aa.bd(b,[d])});a.a.Ua(c,g)}}function d(a){return a.nodeType?a:0<a.length?a[0]:null}function e(b,e,f,h,m){m=m||{};var p=(b&&d(b)||f||{}).ownerDocument,A=m.templateEngine||g;a.ic.wd(f,A,p);f=A.renderTemplate(f,h,m,p);if("number"!=typeof f.length||0<f.length&&"number"!=typeof f[0].nodeType)throw Error("Template engine must return an array of DOM nodes");p=!1;switch(e){case "replaceChildren":a.h.ua(b,
f);p=!0;break;case "replaceNode":a.a.Wc(b,f);p=!0;break;case "ignoreTargetNode":break;default:throw Error("Unknown renderMode: "+e);}p&&(c(f,h),m.afterRender&&a.v.K(m.afterRender,null,[f,h[m.as||"$data"]]),"replaceChildren"==e&&a.j.Ga(b,a.j.T));return f}function f(b,c,d){return a.N(b)?b():"function"===typeof b?b(c,d):b}var g;a.ec=function(b){if(b!=p&&!(b instanceof a.ca))throw Error("templateEngine must inherit from ko.templateEngine");g=b};a.bc=function(b,c,h,m,r){h=h||{};if((h.templateEngine||g)==
p)throw Error("Set a template engine before calling renderTemplate");r=r||"replaceChildren";if(m){var y=d(m);return a.$(function(){var g=c&&c instanceof a.fa?c:new a.fa(c,null,null,null,{exportDependencies:!0}),p=f(b,g.$data,g),g=e(m,r,p,g,h);"replaceNode"==r&&(m=g,y=d(m))},null,{Sa:function(){return!y||!a.a.Rb(y)},l:y&&"replaceNode"==r?y.parentNode:y})}return a.aa.Wb(function(d){a.bc(b,c,h,d,"replaceNode")})};a.Pd=function(b,d,g,h,m){function y(b,c){a.v.K(a.a.cc,null,[h,b,u,g,t,c]);a.j.Ga(h,a.j.T)}
function t(a,b){c(b,v);g.afterRender&&g.afterRender(b,a);v=null}function u(a,c){v=m.createChildContext(a,{as:B,noChildContext:g.noChildContext,extend:function(a){a.$index=c;B&&(a[B+"Index"]=c)}});var d=f(b,a,v);return e(h,"ignoreTargetNode",d,v,g)}var v,B=g.as,w=!1===g.includeDestroyed||a.options.foreachHidesDestroyed&&!g.includeDestroyed;if(w||g.beforeRemove||!a.Oc(d))return a.$(function(){var b=a.a.c(d)||[];"undefined"==typeof b.length&&(b=[b]);w&&(b=a.a.fb(b,function(b){return b===p||null===b||
!a.a.c(b._destroy)}));y(b)},null,{l:h});y(d.w());var z=d.subscribe(function(a){y(d(),a)},null,"arrayChange");z.l(h);return z};var h=a.a.g.Z(),m=a.a.g.Z();a.f.template={init:function(b,c){var d=a.a.c(c());if("string"==typeof d||d.name)a.h.Ea(b);else if("nodes"in d){d=d.nodes||[];if(a.N(d))throw Error('The "nodes" option must be a plain, non-observable array.');var e=d[0]&&d[0].parentNode;e&&a.a.g.get(e,m)||(e=a.a.Xb(d),a.a.g.set(e,m,!0));(new a.B.ia(b)).nodes(e)}else if(d=a.h.childNodes(b),0<d.length)e=
a.a.Xb(d),(new a.B.ia(b)).nodes(e);else throw Error("Anonymous template defined, but no template content was provided");return{controlsDescendantBindings:!0}},update:function(b,c,d,e,f){var g=c();c=a.a.c(g);d=!0;e=null;"string"==typeof c?c={}:(g=c.name,"if"in c&&(d=a.a.c(c["if"])),d&&"ifnot"in c&&(d=!a.a.c(c.ifnot)));"foreach"in c?e=a.Pd(g||b,d&&c.foreach||[],c,b,f):d?(d=f,"data"in c&&(d=f.createChildContext(c.data,{as:c.as,noChildContext:c.noChildContext,exportDependencies:!0})),e=a.bc(g||b,d,c,
b)):a.h.Ea(b);f=e;(c=a.a.g.get(b,h))&&"function"==typeof c.s&&c.s();a.a.g.set(b,h,!f||f.ja&&!f.ja()?p:f)}};a.m.Ra.template=function(b){b=a.m.Zb(b);return 1==b.length&&b[0].unknown||a.m.Hd(b,"name")?null:"This template engine does not support anonymous templates nested within its templates"};a.h.ea.template=!0})();a.b("setTemplateEngine",a.ec);a.b("renderTemplate",a.bc);a.a.Jc=function(a,c,d){if(a.length&&c.length){var e,f,g,h,m;for(e=f=0;(!d||e<d)&&(h=a[f]);++f){for(g=0;m=c[g];++g)if(h.value===m.value){h.moved=
m.index;m.moved=h.index;c.splice(g,1);e=g=0;break}e+=g}}};a.a.Ob=function(){function b(b,d,e,f,g){var h=Math.min,m=Math.max,l=[],k,p=b.length,n,r=d.length,t=r-p||1,A=p+r+1,u,v,w;for(k=0;k<=p;k++)for(v=u,l.push(u=[]),w=h(r,k+t),n=m(0,k-1);n<=w;n++)u[n]=n?k?b[k-1]===d[n-1]?v[n-1]:h(v[n]||A,u[n-1]||A)+1:n+1:k+1;h=[];m=[];t=[];k=p;for(n=r;k||n;)r=l[k][n]-1,n&&r===l[k][n-1]?m.push(h[h.length]={status:e,value:d[--n],index:n}):k&&r===l[k-1][n]?t.push(h[h.length]={status:f,value:b[--k],index:k}):(--n,--k,
g.sparse||h.push({status:"retained",value:d[n]}));a.a.Jc(t,m,!g.dontLimitMoves&&10*p);return h.reverse()}return function(a,d,e){e="boolean"===typeof e?{dontLimitMoves:e}:e||{};a=a||[];d=d||[];return a.length<d.length?b(a,d,"added","deleted",e):b(d,a,"deleted","added",e)}}();a.b("utils.compareArrays",a.a.Ob);(function(){function b(b,c,d,h,m){var l=[],k=a.$(function(){var k=c(d,m,a.a.Ua(l,b))||[];0<l.length&&(a.a.Wc(l,k),h&&a.v.K(h,null,[d,k,m]));l.length=0;a.a.gb(l,k)},null,{l:b,Sa:function(){return!a.a.jd(l)}});
return{Y:l,$:k.ja()?k:p}}var c=a.a.g.Z(),d=a.a.g.Z();a.a.cc=function(e,f,g,h,m,l){function k(b){x={Aa:b,nb:a.sa(w++)};v.push(x);t||F.push(x)}function q(b){x=r[b];w!==x.nb.w()&&D.push(x);x.nb(w++);a.a.Ua(x.Y,e);v.push(x)}function n(b,c){if(b)for(var d=0,e=c.length;d<e;d++)a.a.C(c[d].Y,function(a){b(a,d,c[d].Aa)})}f=f||[];"undefined"==typeof f.length&&(f=[f]);h=h||{};var r=a.a.g.get(e,c),t=!r,v=[],u=0,w=0,B=[],z=[],C=[],D=[],F=[],x,I=0;if(t)a.a.C(f,k);else{if(!l||r&&r._countWaitingForRemove){var E=
a.a.Mb(r,function(a){return a.Aa});l=a.a.Ob(E,f,{dontLimitMoves:h.dontLimitMoves,sparse:!0})}for(var E=0,G,H,K;G=l[E];E++)switch(H=G.moved,K=G.index,G.status){case "deleted":for(;u<K;)q(u++);H===p&&(x=r[u],x.$&&(x.$.s(),x.$=p),a.a.Ua(x.Y,e).length&&(h.beforeRemove&&(v.push(x),I++,x.Aa===d?x=null:C.push(x)),x&&B.push.apply(B,x.Y)));u++;break;case "added":for(;w<K;)q(u++);H!==p?(z.push(v.length),q(H)):k(G.value)}for(;w<f.length;)q(u++);v._countWaitingForRemove=I}a.a.g.set(e,c,v);n(h.beforeMove,D);a.a.C(B,
h.beforeRemove?a.na:a.removeNode);var M,O,P;try{P=e.ownerDocument.activeElement}catch(N){}if(z.length)for(;(E=z.shift())!=p;){x=v[E];for(M=p;E;)if((O=v[--E].Y)&&O.length){M=O[O.length-1];break}for(f=0;u=x.Y[f];M=u,f++)a.h.Vb(e,u,M)}E=0;for(z=a.h.firstChild(e);x=v[E];E++){x.Y||a.a.extend(x,b(e,g,x.Aa,m,x.nb));for(f=0;u=x.Y[f];z=u.nextSibling,M=u,f++)u!==z&&a.h.Vb(e,u,M);!x.Dd&&m&&(m(x.Aa,x.Y,x.nb),x.Dd=!0,M=x.Y[x.Y.length-1])}P&&e.ownerDocument.activeElement!=P&&P.focus();n(h.beforeRemove,C);for(E=
0;E<C.length;++E)C[E].Aa=d;n(h.afterMove,D);n(h.afterAdd,F)}})();a.b("utils.setDomNodeChildrenFromArrayMapping",a.a.cc);a.ba=function(){this.allowTemplateRewriting=!1};a.ba.prototype=new a.ca;a.ba.prototype.constructor=a.ba;a.ba.prototype.renderTemplateSource=function(b,c,d,e){if(c=(9>a.a.W?0:b.nodes)?b.nodes():null)return a.a.la(c.cloneNode(!0).childNodes);b=b.text();return a.a.ta(b,e)};a.ba.Na=new a.ba;a.ec(a.ba.Na);a.b("nativeTemplateEngine",a.ba);(function(){a.Za=function(){var a=this.Gd=function(){if(!v||
!v.tmpl)return 0;try{if(0<=v.tmpl.tag.tmpl.open.toString().indexOf("__"))return 2}catch(a){}return 1}();this.renderTemplateSource=function(b,e,f,g){g=g||w;f=f||{};if(2>a)throw Error("Your version of jQuery.tmpl is too old. Please upgrade to jQuery.tmpl 1.0.0pre or later.");var h=b.data("precompiled");h||(h=b.text()||"",h=v.template(null,"{{ko_with $item.koBindingContext}}"+h+"{{/ko_with}}"),b.data("precompiled",h));b=[e.$data];e=v.extend({koBindingContext:e},f.templateOptions);e=v.tmpl(h,b,e);e.appendTo(g.createElement("div"));
v.fragments={};return e};this.createJavaScriptEvaluatorBlock=function(a){return"{{ko_code ((function() { return "+a+" })()) }}"};this.addTemplate=function(a,b){w.write("<script type='text/html' id='"+a+"'>"+b+"\x3c/script>")};0<a&&(v.tmpl.tag.ko_code={open:"__.push($1 || '');"},v.tmpl.tag.ko_with={open:"with($1) {",close:"} "})};a.Za.prototype=new a.ca;a.Za.prototype.constructor=a.Za;var b=new a.Za;0<b.Gd&&a.ec(b);a.b("jqueryTmplTemplateEngine",a.Za)})()})})();})();


/// Knockout Mapping plugin v2.4.1
/// (c) 2013 Steven Sanderson, Roy Jacobs - http://knockoutjs.com/
/// License: MIT (http://www.opensource.org/licenses/mit-license.php)
(function(e){"function"===typeof require&&"object"===typeof exports&&"object"===typeof module?e(require("knockout"),exports):"function"===typeof define&&define.amd?define(["knockout","exports"],e):e(ko,ko.mapping={})})(function(e,f){function y(b,c){var a,d;for(d in c)if(c.hasOwnProperty(d)&&c[d])if(a=f.getType(b[d]),d&&b[d]&&"array"!==a&&"string"!==a)y(b[d],c[d]);else if("array"===f.getType(b[d])&&"array"===f.getType(c[d])){a=b;for(var e=d,l=b[d],n=c[d],t={},g=l.length-1;0<=g;--g)t[l[g]]=l[g];for(g=
n.length-1;0<=g;--g)t[n[g]]=n[g];l=[];n=void 0;for(n in t)l.push(t[n]);a[e]=l}else b[d]=c[d]}function E(b,c){var a={};y(a,b);y(a,c);return a}function z(b,c){for(var a=E({},b),e=L.length-1;0<=e;e--){var f=L[e];a[f]&&(a[""]instanceof Object||(a[""]={}),a[""][f]=a[f],delete a[f])}c&&(a.ignore=h(c.ignore,a.ignore),a.include=h(c.include,a.include),a.copy=h(c.copy,a.copy),a.observe=h(c.observe,a.observe));a.ignore=h(a.ignore,j.ignore);a.include=h(a.include,j.include);a.copy=h(a.copy,j.copy);a.observe=h(a.observe,
j.observe);a.mappedProperties=a.mappedProperties||{};a.copiedProperties=a.copiedProperties||{};return a}function h(b,c){"array"!==f.getType(b)&&(b="undefined"===f.getType(b)?[]:[b]);"array"!==f.getType(c)&&(c="undefined"===f.getType(c)?[]:[c]);return e.utils.arrayGetDistinctValues(b.concat(c))}function F(b,c,a,d,k,l,n){var t="array"===f.getType(e.utils.unwrapObservable(c));l=l||"";if(f.isMapped(b)){var g=e.utils.unwrapObservable(b)[p];a=E(g,a)}var j=n||k,h=function(){return a[d]&&a[d].create instanceof
Function},x=function(b){var f=G,g=e.dependentObservable;e.dependentObservable=function(a,b,c){c=c||{};a&&"object"==typeof a&&(c=a);var d=c.deferEvaluation,M=!1;c.deferEvaluation=!0;a=new H(a,b,c);if(!d){var g=a,d=e.dependentObservable;e.dependentObservable=H;a=e.isWriteableObservable(g);e.dependentObservable=d;d=H({read:function(){M||(e.utils.arrayRemoveItem(f,g),M=!0);return g.apply(g,arguments)},write:a&&function(a){return g(a)},deferEvaluation:!0});d.__DO=g;a=d;f.push(a)}return a};e.dependentObservable.fn=
H.fn;e.computed=e.dependentObservable;b=e.utils.unwrapObservable(k)instanceof Array?a[d].create({data:b||c,parent:j,skip:N}):a[d].create({data:b||c,parent:j});e.dependentObservable=g;e.computed=e.dependentObservable;return b},u=function(){return a[d]&&a[d].update instanceof Function},v=function(b,f){var g={data:f||c,parent:j,target:e.utils.unwrapObservable(b)};e.isWriteableObservable(b)&&(g.observable=b);return a[d].update(g)};if(n=I.get(c))return n;d=d||"";if(t){var t=[],s=!1,m=function(a){return a};
a[d]&&a[d].key&&(m=a[d].key,s=!0);e.isObservable(b)||(b=e.observableArray([]),b.mappedRemove=function(a){var c="function"==typeof a?a:function(b){return b===m(a)};return b.remove(function(a){return c(m(a))})},b.mappedRemoveAll=function(a){var c=C(a,m);return b.remove(function(a){return-1!=e.utils.arrayIndexOf(c,m(a))})},b.mappedDestroy=function(a){var c="function"==typeof a?a:function(b){return b===m(a)};return b.destroy(function(a){return c(m(a))})},b.mappedDestroyAll=function(a){var c=C(a,m);return b.destroy(function(a){return-1!=
e.utils.arrayIndexOf(c,m(a))})},b.mappedIndexOf=function(a){var c=C(b(),m);a=m(a);return e.utils.arrayIndexOf(c,a)},b.mappedGet=function(a){return b()[b.mappedIndexOf(a)]},b.mappedCreate=function(a){if(-1!==b.mappedIndexOf(a))throw Error("There already is an object with the key that you specified.");var c=h()?x(a):a;u()&&(a=v(c,a),e.isWriteableObservable(c)?c(a):c=a);b.push(c);return c});n=C(e.utils.unwrapObservable(b),m).sort();g=C(c,m);s&&g.sort();s=e.utils.compareArrays(n,g);n={};var J,A=e.utils.unwrapObservable(c),
y={},z=!0,g=0;for(J=A.length;g<J;g++){var r=m(A[g]);if(void 0===r||r instanceof Object){z=!1;break}y[r]=A[g]}var A=[],B=0,g=0;for(J=s.length;g<J;g++){var r=s[g],q,w=l+"["+g+"]";switch(r.status){case "added":var D=z?y[r.value]:K(e.utils.unwrapObservable(c),r.value,m);q=F(void 0,D,a,d,b,w,k);h()||(q=e.utils.unwrapObservable(q));w=O(e.utils.unwrapObservable(c),D,n);q===N?B++:A[w-B]=q;n[w]=!0;break;case "retained":D=z?y[r.value]:K(e.utils.unwrapObservable(c),r.value,m);q=K(b,r.value,m);F(q,D,a,d,b,w,
k);w=O(e.utils.unwrapObservable(c),D,n);A[w]=q;n[w]=!0;break;case "deleted":q=K(b,r.value,m)}t.push({event:r.status,item:q})}b(A);a[d]&&a[d].arrayChanged&&e.utils.arrayForEach(t,function(b){a[d].arrayChanged(b.event,b.item)})}else if(P(c)){b=e.utils.unwrapObservable(b);if(!b){if(h())return s=x(),u()&&(s=v(s)),s;if(u())return v(s);b={}}u()&&(b=v(b));I.save(c,b);if(u())return b;Q(c,function(d){var f=l.length?l+"."+d:d;if(-1==e.utils.arrayIndexOf(a.ignore,f))if(-1!=e.utils.arrayIndexOf(a.copy,f))b[d]=
c[d];else if("object"!=typeof c[d]&&"array"!=typeof c[d]&&0<a.observe.length&&-1==e.utils.arrayIndexOf(a.observe,f))b[d]=c[d],a.copiedProperties[f]=!0;else{var g=I.get(c[d]),k=F(b[d],c[d],a,d,b,f,b),g=g||k;if(0<a.observe.length&&-1==e.utils.arrayIndexOf(a.observe,f))b[d]=g(),a.copiedProperties[f]=!0;else{if(e.isWriteableObservable(b[d])){if(g=e.utils.unwrapObservable(g),b[d]()!==g)b[d](g)}else g=void 0===b[d]?g:e.utils.unwrapObservable(g),b[d]=g;a.mappedProperties[f]=!0}}})}else switch(f.getType(c)){case "function":u()?
e.isWriteableObservable(c)?(c(v(c)),b=c):b=v(c):b=c;break;default:if(e.isWriteableObservable(b))return q=u()?v(b):e.utils.unwrapObservable(c),b(q),q;h()||u();b=h()?x():e.observable(e.utils.unwrapObservable(c));u()&&b(v(b))}return b}function O(b,c,a){for(var d=0,e=b.length;d<e;d++)if(!0!==a[d]&&b[d]===c)return d;return null}function R(b,c){var a;c&&(a=c(b));"undefined"===f.getType(a)&&(a=b);return e.utils.unwrapObservable(a)}function K(b,c,a){b=e.utils.unwrapObservable(b);for(var d=0,f=b.length;d<
f;d++){var l=b[d];if(R(l,a)===c)return l}throw Error("When calling ko.update*, the key '"+c+"' was not found!");}function C(b,c){return e.utils.arrayMap(e.utils.unwrapObservable(b),function(a){return c?R(a,c):a})}function Q(b,c){if("array"===f.getType(b))for(var a=0;a<b.length;a++)c(a);else for(a in b)c(a)}function P(b){var c=f.getType(b);return("object"===c||"array"===c)&&null!==b}function T(){var b=[],c=[];this.save=function(a,d){var f=e.utils.arrayIndexOf(b,a);0<=f?c[f]=d:(b.push(a),c.push(d))};
this.get=function(a){a=e.utils.arrayIndexOf(b,a);return 0<=a?c[a]:void 0}}function S(){var b={},c=function(a){var c;try{c=a}catch(e){c="$$$"}a=b[c];void 0===a&&(a=new T,b[c]=a);return a};this.save=function(a,b){c(a).save(a,b)};this.get=function(a){return c(a).get(a)}}var p="__ko_mapping__",H=e.dependentObservable,B=0,G,I,L=["create","update","key","arrayChanged"],N={},x={include:["_destroy"],ignore:[],copy:[],observe:[]},j=x;f.isMapped=function(b){return(b=e.utils.unwrapObservable(b))&&b[p]};f.fromJS=
function(b){if(0==arguments.length)throw Error("When calling ko.fromJS, pass the object you want to convert.");try{B++||(G=[],I=new S);var c,a;2==arguments.length&&(arguments[1][p]?a=arguments[1]:c=arguments[1]);3==arguments.length&&(c=arguments[1],a=arguments[2]);a&&(c=E(c,a[p]));c=z(c);var d=F(a,b,c);a&&(d=a);if(!--B)for(;G.length;){var e=G.pop();e&&(e(),e.__DO.throttleEvaluation=e.throttleEvaluation)}d[p]=E(d[p],c);return d}catch(f){throw B=0,f;}};f.fromJSON=function(b){var c=e.utils.parseJson(b);
arguments[0]=c;return f.fromJS.apply(this,arguments)};f.updateFromJS=function(){throw Error("ko.mapping.updateFromJS, use ko.mapping.fromJS instead. Please note that the order of parameters is different!");};f.updateFromJSON=function(){throw Error("ko.mapping.updateFromJSON, use ko.mapping.fromJSON instead. Please note that the order of parameters is different!");};f.toJS=function(b,c){j||f.resetDefaultOptions();if(0==arguments.length)throw Error("When calling ko.mapping.toJS, pass the object you want to convert.");
if("array"!==f.getType(j.ignore))throw Error("ko.mapping.defaultOptions().ignore should be an array.");if("array"!==f.getType(j.include))throw Error("ko.mapping.defaultOptions().include should be an array.");if("array"!==f.getType(j.copy))throw Error("ko.mapping.defaultOptions().copy should be an array.");c=z(c,b[p]);return f.visitModel(b,function(a){return e.utils.unwrapObservable(a)},c)};f.toJSON=function(b,c){var a=f.toJS(b,c);return e.utils.stringifyJson(a)};f.defaultOptions=function(){if(0<arguments.length)j=
arguments[0];else return j};f.resetDefaultOptions=function(){j={include:x.include.slice(0),ignore:x.ignore.slice(0),copy:x.copy.slice(0)}};f.getType=function(b){if(b&&"object"===typeof b){if(b.constructor===Date)return"date";if(b.constructor===Array)return"array"}return typeof b};f.visitModel=function(b,c,a){a=a||{};a.visitedObjects=a.visitedObjects||new S;var d,k=e.utils.unwrapObservable(b);if(P(k))a=z(a,k[p]),c(b,a.parentName),d="array"===f.getType(k)?[]:{};else return c(b,a.parentName);a.visitedObjects.save(b,
d);var l=a.parentName;Q(k,function(b){if(!(a.ignore&&-1!=e.utils.arrayIndexOf(a.ignore,b))){var j=k[b],g=a,h=l||"";"array"===f.getType(k)?l&&(h+="["+b+"]"):(l&&(h+="."),h+=b);g.parentName=h;if(!(-1===e.utils.arrayIndexOf(a.copy,b)&&-1===e.utils.arrayIndexOf(a.include,b)&&k[p]&&k[p].mappedProperties&&!k[p].mappedProperties[b]&&k[p].copiedProperties&&!k[p].copiedProperties[b]&&"array"!==f.getType(k)))switch(f.getType(e.utils.unwrapObservable(j))){case "object":case "array":case "undefined":g=a.visitedObjects.get(j);
d[b]="undefined"!==f.getType(g)?g:f.visitModel(j,c,a);break;default:d[b]=c(j,a.parentName)}}});return d}});


/*! knockout-jqueryui - v2.2.2 - 1/20/2015
* https://gvas.github.io/knockout-jqueryui/
* Copyright (c) 2015 Vas Gabor <gvas.munka@gmail.com> Licensed MIT */
/*jslint browser:true*/

window.kojqui = { version: '2.2.2' };

(function (root, factory) {

    'use strict';

    root.kojqui.utils = factory(root.jQuery, root.ko, root.jQuery.ui.core);
}(this,
    function ($, ko) {

        'use strict';

        var match, uiVersion, descendantControllingBindings, createObject, register;

        /*jslint regexp:true*/
        match = ($.ui.version || '').match(/^(\d)\.(\d+)/);
        /*jslint regexp:false*/

        if (!match) {
            uiVersion = null;
        } else {
            uiVersion = {
                major: parseInt(match[1], 10),
                minor: parseInt(match[2], 10)
            };
        }

        descendantControllingBindings = ['foreach', 'if', 'ifnot', 'with', 'html', 'text',
            'options'];

        createObject = Object.create || function (prototype) {
            /// <summary>Simple (incomplete) shim for Object.create().</summary>
            /// <param name='prototype' type='Object' mayBeNull='true'></param>
            /// <returns type='Object'></returns>

            function Type() { }
            Type.prototype = prototype;
            return new Type();
        };

        register = function (Constructor) {
            /// <summary>Registers a binding.</summary>
            /// <param name='Constructor' type='BindingHandler'>The binding handler's
            /// constructor function.</param>

            var handler = new Constructor();

            ko.bindingHandlers[handler.widgetName] = {
                after: ko.utils.arrayGetDistinctValues(
                    descendantControllingBindings.concat(handler.after || [])
                ),
                init: handler.init.bind(handler),
                update: handler.update.bind(handler)
            };
        };

        return {
            uiVersion: uiVersion,
            descendantControllingBindings: descendantControllingBindings,
            createObject: createObject,
            register: register
        };
    }
));
(function (root, factory) {

    'use strict';

    root.kojqui.BindingHandler = factory(root.jQuery, root.ko, root.kojqui.utils, root.jQuery.ui.widget);
}(this,
    function ($, ko, utils) {

        'use strict';

        var domDataKey, filterAndUnwrapProperties, subscribeToRefreshOn, BindingHandler;

        domDataKey = '__kojqui_options';

        filterAndUnwrapProperties = function (source, properties) {
            /// <summary>Filters and unwraps the properties of an object.</summary>
            /// <param name='source' type='Object'></param>
            /// <param name='properties' type='Array' elementType='String'></param>
            /// <returns type='Object'>A new object with the specified properties copied
            /// and unwrapped from source.</returns>

            var result = {};

            ko.utils.arrayForEach(properties, function (property) {
                if (source[property] !== undefined) {
                    result[property] = ko.utils.unwrapObservable(source[property]);
                }
            });

            return result;
        };

        subscribeToRefreshOn = function (widgetName, element, bindingValue) {
            /// <summary>Creates a subscription to the refreshOn observable.</summary>
            /// <param name='widgetName' type='String'>The widget's name.</param>
            /// <param name='element' type='DOMNode'></param>
            /// <param name='bindingValue' type='Object'></param>

            if (ko.isObservable(bindingValue.refreshOn)) {
                ko.computed({
                    read: function () {
                        bindingValue.refreshOn();
                        $(element)[widgetName]('refresh');
                    },
                    disposeWhenNodeIsRemoved: element
                });
            }
        };

        BindingHandler = function (widgetName) {
            /// <summary>Constructor.</summary>
            /// <param name='widgetName' type='String'>The jQuery UI widget's
            /// name.</param>

            this.widgetName = widgetName;
            this.widgetEventPrefix = widgetName;
            this.options = [];
            this.events = [];
            this.after = [];
            this.hasRefresh = false;
        };

        /*jslint unparam:true*/
        BindingHandler.prototype.init = function (element, valueAccessor,
            allBindingsAccessor, viewModel, bindingContext) {

            var widgetName, value, unwrappedOptions, unwrappedEvents,
                shouldApplyBindingsToDescendants;

            widgetName = this.widgetName;
            value = valueAccessor();
            unwrappedOptions = filterAndUnwrapProperties(value, this.options);
            unwrappedEvents = filterAndUnwrapProperties(value, this.events);

            // There can be control flow- or other bindings on some of the descendant
            // elements which affect the shape of the element-rooted DOM subtree. These
            // should be processed before instantiating the jQuery UI widget, because they
            // can add pages to the tabs widget, menu items to the menu widget, etc.
            shouldApplyBindingsToDescendants = !ko.utils.arrayFirst(
                utils.descendantControllingBindings,
                function (bindingName) {
                    return this.hasOwnProperty(bindingName);
                },
                allBindingsAccessor()
            );
            if (shouldApplyBindingsToDescendants) {
                // process descendant bindings
                ko.applyBindingsToDescendants(bindingContext, element);
            }

            // store the options' values so they can be checked for changes in the
            // update() method
            ko.utils.domData.set(element, domDataKey, unwrappedOptions);

            // bind the widget events to the viewmodel
            $.each(unwrappedEvents, function (key, value) {
                unwrappedEvents[key] = value.bind(viewModel);
            });

            // initialize the widget
            $(element)[widgetName](ko.utils.extend(unwrappedOptions, unwrappedEvents));

            if (this.hasRefresh) {
                subscribeToRefreshOn(widgetName, element, value);
            }

            // store the element in the widget observable
            if (ko.isWriteableObservable(value.widget)) {
                value.widget($(element));
            }

            // handle disposal
            ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
                $(element)[widgetName]('destroy');
            });

            return { controlsDescendantBindings: shouldApplyBindingsToDescendants };
        };
        /*jslint unparam:false*/

        BindingHandler.prototype.update = function (element, valueAccessor) {

            var widgetName, value, oldOptions, newOptions;

            widgetName = this.widgetName;
            value = valueAccessor();
            oldOptions = ko.utils.domData.get(element, domDataKey);
            newOptions = filterAndUnwrapProperties(value, this.options);

            // set only the changed options
            $.each(newOptions, function (prop, val) {
                if (val !== oldOptions[prop]) {
                    $(element)[widgetName]('option', prop, newOptions[prop]);
                }
            });

            // store the options' values so they can be checked for changes in the next
            // update() method
            ko.utils.domData.set(element, domDataKey, newOptions);
        };

        BindingHandler.prototype.on = function (element, type, callback) {
            /// <summary>Attaches callback to a widget event.</summary>
            /// <param name='element' type='DOMElement'></param>
            /// <param name='type' type='String'></param>
            /// <param name='callback' type='Function'></param>

            var eventName;

            // the same algorithm as in widget._trigger()
            if (type === this.widgetEventPrefix) {
                eventName = type;
            } else {
                eventName = this.widgetEventPrefix + type;
            }
            eventName = [eventName.toLowerCase(), '.', this.widgetName].join('');

            $(element).on(eventName, callback);

            // handle disposal
            ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
                $(element).off(eventName);
            });
        };

        return BindingHandler;
    }
));
(function (root, factory) {

    'use strict';

    root.kojqui.Accordion = factory(root.jQuery, root.ko, root.kojqui.utils, root.kojqui.BindingHandler, root.jQuery.ui.accordion);
}(this,
    function ($, ko, utils, BindingHandler) {

        'use strict';

        var Accordion = function () {
            /// <summary>Constructor.</summary>

            BindingHandler.call(this, 'accordion');

            if (utils.uiVersion.major === 1 && utils.uiVersion.minor === 8) {
                this.options = ['active', 'animated', 'autoHeight', 'clearStyle',
                    'collapsible', 'disabled', 'event', 'fillSpace', 'header', 'icons',
                    'navigation', 'navigationFilter'];
                this.events = ['change', 'changestart', 'create'];
                this.hasRefresh = false;
                this.eventToWatch = 'change';
            } else {
                this.options = ['active', 'animate', 'collapsible', 'disabled', 'event',
                    'header', 'heightStyle', 'icons'];
                this.events = ['activate', 'beforeActivate', 'create'];
                this.hasRefresh = true;
                this.eventToWatch = 'activate';
            }
        };

        Accordion.prototype = utils.createObject(BindingHandler.prototype);
        Accordion.prototype.constructor = Accordion;

        Accordion.prototype.init = function (element, valueAccessor) {
            /// <summary>Keeps the active binding property in sync with the widget's
            /// state.</summary>
            /// <param name='element' type='DOMNode'></param>
            /// <param name='valueAccessor' type='Function'></param>
            /// <returns type='Object'></returns>

            var widgetName, value, result;

            widgetName = this.widgetName;
            value = valueAccessor();

            result = BindingHandler.prototype.init.apply(this, arguments);

            if (ko.isWriteableObservable(value.active)) {
                this.on(element, this.eventToWatch, function () {
                    value.active($(element)[widgetName]('option', 'active'));
                });
            }

            return result;
        };

        utils.register(Accordion);

        return Accordion;
    }
));
(function (root, factory) {

    'use strict';

    root.kojqui.Autocomplete = factory(root.kojqui.BindingHandler, root.kojqui.utils, root.jQuery.ui.autocomplete);
}(this,
    function (BindingHandler, utils) {

        'use strict';

        var Autocomplete = function () {
            /// <summary>Constructor.</summary>

            BindingHandler.call(this, 'autocomplete');

            this.options = ['appendTo', 'autoFocus', 'delay', 'disabled', 'minLength',
                'position', 'source'];

            if (utils.uiVersion.major === 1 && utils.uiVersion.minor === 8) {
                this.events = ['change', 'close', 'create', 'focus', 'open', 'search',
                    'select'];
            } else {
                this.options.push('messages');
                this.events = ['change', 'close', 'create', 'focus', 'open', 'response',
                    'search', 'select'];
            }
        };

        Autocomplete.prototype = utils.createObject(BindingHandler.prototype);
        Autocomplete.prototype.constructor = Autocomplete;

        utils.register(Autocomplete);

        return Autocomplete;
    }
));
(function (root, factory) {

    'use strict';

    root.kojqui.Button = factory(root.kojqui.BindingHandler, root.kojqui.utils, root.jQuery.ui.button);
}(this,
    function (BindingHandler, utils) {

        'use strict';

        var Button = function () {
            /// <summary>Constructor.</summary>

            BindingHandler.call(this, 'button');

            this.options = ['disabled', 'icons', 'label', 'text'];
            this.events = ['create'];
            this.hasRefresh = true;
        };

        Button.prototype = utils.createObject(BindingHandler.prototype);
        Button.prototype.constructor = Button;

        utils.register(Button);

        return Button;
    }
));
(function (root, factory) {

    'use strict';

    root.kojqui.Buttonset = factory(root.kojqui.BindingHandler, root.kojqui.utils, root.jQuery.ui.button);
}(this,
    function (BindingHandler, utils) {

        'use strict';

        var Buttonset = function () {
            /// <summary>Constructor.</summary>

            BindingHandler.call(this, 'buttonset');

            this.options = ['items', 'disabled'];
            this.events = ['create'];
            this.hasRefresh = true;
        };

        Buttonset.prototype = utils.createObject(BindingHandler.prototype);
        Buttonset.prototype.constructor = Buttonset;

        utils.register(Buttonset);

        return Buttonset;
    }
));
(function (root, factory) {

    'use strict';

    root.kojqui.Datepicker = factory(root.jQuery, root.ko, root.kojqui.BindingHandler, root.kojqui.utils, root.jQuery.ui.datepicker);
}(this,
    function ($, ko, BindingHandler, utils) {

        'use strict';

        var Datepicker = function () {
            /// <summary>Constructor.</summary>

            BindingHandler.call(this, 'datepicker');

            this.options = ['altField', 'altFormat', 'appendText', 'autoSize',
                'buttonImage', 'buttonImageOnly', 'buttonText', 'calculateWeek',
                'changeMonth', 'changeYear', 'closeText', 'constrainInput', 'currentText',
                'dateFormat', 'dayNames', 'dayNamesMin', 'dayNamesShort', 'defaultDate',
                'duration', 'firstDay', 'gotoCurrent', 'hideIfNoPrevNext', 'isRTL',
                'maxDate', 'minDate', 'monthNames', 'monthNamesShort',
                'navigationAsDateFormat', 'nextText', 'numberOfMonths', 'prevText',
                'selectOtherMonths', 'shortYearCutoff', 'showAnim', 'showButtonPanel',
                'showCurrentAtPos', 'showMonthAfterYear', 'showOn', 'showOptions',
                'showOtherMonths', 'showWeek', 'stepMonths', 'weekHeader', 'yearRange',
                'yearSuffix', 'beforeShow', 'beforeShowDay', 'onChangeMonthYear',
                'onClose', 'onSelect'];
            this.hasRefresh = true;
        };

        Datepicker.prototype = utils.createObject(BindingHandler.prototype);
        Datepicker.prototype.constructor = Datepicker;

        Datepicker.prototype.init = function (element, valueAccessor) {
            /// <summary>Keeps the value binding property in sync with the widget's state.
            /// </summary>
            /// <param name='element' type='DOMNode'></param>
            /// <param name='valueAccessor' type='Function'></param>
            /// <returns type='Object'></returns>

            var result, widgetName, options, value, subscription, origOnSelect;

            result = BindingHandler.prototype.init.apply(this, arguments);

            widgetName = this.widgetName;
            options = valueAccessor();
            value = ko.utils.unwrapObservable(options.value);

            if (value) {
                $(element)[widgetName]('setDate', value);
            }

            if (ko.isObservable(options.value)) {
                subscription = options.value.subscribe(function (newValue) {
                    $(element)[widgetName]('setDate', newValue);
                });

                ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
                    subscription.dispose();
                });
            }

            if (ko.isWriteableObservable(options.value)) {
                origOnSelect = $(element)[widgetName]('option', 'onSelect');
                $(element)[widgetName]('option', 'onSelect', function (selectedText) {
                    var format, date;

                    format = $(element)[widgetName]('option', 'dateFormat');
                    date = $.datepicker.parseDate(format, selectedText);
                    options.value(date);

                    if (typeof origOnSelect === 'function') {
                        origOnSelect.apply(this, Array.prototype.slice.call(arguments));
                    }
                });
            }

            return result;
        };

        utils.register(Datepicker);

        return Datepicker;
    }
));
(function (root, factory) {

    'use strict';

    root.kojqui.Dialog = factory(root.jQuery, root.ko, root.kojqui.BindingHandler, root.kojqui.utils, root.jQuery.ui.dialog);
}(this,
    function ($, ko, BindingHandler, utils) {

        'use strict';

        var Dialog = function () {
            /// <summary>Constructor.</summary>

            BindingHandler.call(this, 'dialog');

            if (utils.uiVersion.major === 1 && utils.uiVersion.minor === 8) {
                this.options = ['autoOpen', 'buttons', 'closeOnEscape', 'closeText',
                    'dialogClass', 'disabled', 'draggable', 'height', 'maxHeight',
                    'maxWidth', 'minHeight', 'minWidth', 'modal', 'position', 'resizable',
                    'show', 'stack', 'title', 'width', 'zIndex'];
                this.events = ['beforeClose', 'create', 'open', 'focus', 'dragStart',
                    'drag', 'dragStop', 'resizeStart', 'resize', 'resizeStop', 'close'];
            } else if (utils.uiVersion.major === 1 && utils.uiVersion.minor === 9) {
                this.options = ['autoOpen', 'buttons', 'closeOnEscape', 'closeText',
                    'dialogClass', 'draggable', 'height', 'hide', 'maxHeight', 'maxWidth',
                    'minHeight', 'minWidth', 'modal', 'position', 'resizable', 'show',
                    'stack', 'title', 'width', 'zIndex'];
                this.events = ['beforeClose', 'create', 'open', 'focus', 'dragStart',
                    'drag', 'dragStop', 'resizeStart', 'resize', 'resizeStop', 'close'];
            } else {
                this.options = ['appendTo', 'autoOpen', 'buttons', 'closeOnEscape',
                    'closeText', 'dialogClass', 'draggable', 'height', 'hide',
                    'maxHeight', 'maxWidth', 'minHeight', 'minWidth', 'modal', 'position',
                    'resizable', 'show', 'title', 'width'];
                this.events = ['beforeClose', 'create', 'open', 'focus', 'dragStart',
                    'drag', 'dragStop', 'resizeStart', 'resize', 'resizeStop', 'close'];
            }
        };

        Dialog.prototype = utils.createObject(BindingHandler.prototype);
        Dialog.prototype.constructor = Dialog;

        Dialog.prototype.init = function (element, valueAccessor) {
            /// <summary>Creates a hidden div before the element. This helps in disposing
            /// the binding if the element is moved from its original location.
            /// Keeps the isOpen binding property in sync with the dialog's state.
            // </summary>
            /// <param name='element' type='DOMNode'></param>
            /// <param name='valueAccessor' type='Function'></param>
            /// <returns type='Object'></returns>

            var marker, result, value;

            /// sets up the correct disposal
            marker = document.createElement('DIV');
            marker.style.display = 'none';
            element.parentNode.insertBefore(marker, element);

            ko.utils.domNodeDisposal.addDisposeCallback(marker, function () {
                ko.removeNode(element);
            });

            /// invokes the prototype's init() method
            result = BindingHandler.prototype.init.apply(this, arguments);

            /// sets up handling of the isOpen option
            value = valueAccessor();

            if (value.isOpen) {
                ko.computed({
                    read: function () {
                        if (ko.utils.unwrapObservable(value.isOpen)) {
                            $(element)[this.widgetName]('open');
                        } else {
                            $(element)[this.widgetName]('close');
                        }
                    },
                    disposeWhenNodeIsRemoved: element,
                    owner: this
                });
            }
            if (ko.isWriteableObservable(value.isOpen)) {
                this.on(element, 'open', function () {
                    value.isOpen(true);
                });
                this.on(element, 'close', function () {
                    value.isOpen(false);
                });
            }

            // make the width option two-way
            if (ko.isWriteableObservable(value.width)) {
                /*jslint unparam:true*/
                this.on(element, 'resizestop', function (ev, ui) {
                    value.width(Math.round(ui.size.width));
                });
                /*jslint unparam:false*/
            }

            // make the height option two-way
            if (ko.isWriteableObservable(value.height)) {
                /*jslint unparam:true*/
                this.on(element, 'resizestop', function (ev, ui) {
                    value.height(Math.round(ui.size.height));
                });
                /*jslint unparam:false*/
            }

            return result;
        };

        utils.register(Dialog);

        return Dialog;
    }
));
(function (root, factory) {

    'use strict';

    root.kojqui.Menu = factory(root.kojqui.BindingHandler, root.kojqui.utils, root.jQuery.ui.menu);
}(this,
    function (BindingHandler, utils) {

        'use strict';

        var Menu = function () {
            /// <summary>Constructor.</summary>

            BindingHandler.call(this, 'menu');

            if (utils.uiVersion.major === 1 && utils.uiVersion.minor < 11) {
                this.options = ['disabled', 'icons', 'menus', 'position', 'role'];
            } else {
                this.options = ['disabled', 'icons', 'items', 'menus', 'position',
                    'role'];
            }

            this.events = ['blur', 'create', 'focus', 'select'];
            this.hasRefresh = true;
        };

        Menu.prototype = utils.createObject(BindingHandler.prototype);
        Menu.prototype.constructor = Menu;

        utils.register(Menu);

        return Menu;
    }
));
(function (root, factory) {

    'use strict';

    root.kojqui.Progressbar = factory(root.kojqui.BindingHandler, root.kojqui.utils, root.jQuery.ui.progressbar);
}(this,
    function (BindingHandler, utils) {

        'use strict';

        var Progressbar = function () {
            /// <summary>Constructor.</summary>

            BindingHandler.call(this, 'progressbar');

            this.events = ['change', 'create', 'complete'];
            this.hasRefresh = true;

            if (utils.uiVersion.major === 1 && utils.uiVersion.minor === 8) {
                this.options = ['disabled', 'value'];
            } else {
                this.options = ['disabled', 'max', 'value'];
            }
        };

        Progressbar.prototype = utils.createObject(BindingHandler.prototype);
        Progressbar.prototype.constructor = Progressbar;

        utils.register(Progressbar);

        return Progressbar;
    }
));
(function (root, factory) {

    'use strict';

    root.kojqui.Selectmenu = factory(root.jQuery, root.ko, root.kojqui.BindingHandler, root.kojqui.utils, root.jQuery.ui.selectmenu);
}(this,
    function ($, ko, BindingHandler, utils) {

        'use strict';

        var domDataKey, Selectmenu;

        domDataKey = '__kojqui_selectmenu_value';

        Selectmenu = function () {
            /// <summary>Constructor.</summary>

            BindingHandler.call(this, 'selectmenu');

            this.after = ['value'];
            this.options = ['appendTo', 'disabled', 'icons', 'position', 'width'];
            this.events = ['change', 'close', 'create', 'focus', 'open', 'select'];
            this.hasRefresh = true;
        };

        Selectmenu.prototype = utils.createObject(BindingHandler.prototype);
        Selectmenu.prototype.constructor = Selectmenu;

        Selectmenu.prototype.init = function (element, valueAccessor) {
            /// <summary>Connects the view model and the widget via the isOpen property.
            // </summary>
            /// <param name='element' type='DOMNode'></param>
            /// <param name='valueAccessor' type='Function'></param>
            /// <returns type='Object'></returns>

            var value, result;

            value = valueAccessor();

            /// invokes the prototype's init() method
            result = BindingHandler.prototype.init.apply(this, arguments);

            // maintain the isOpen option
            if (value.hasOwnProperty('isOpen')) {
                ko.computed({
                    read: function () {
                        if (ko.utils.unwrapObservable(value.isOpen)) {
                            $(element)[this.widgetName]('open');
                        } else {
                            $(element)[this.widgetName]('close');
                        }
                    },
                    disposeWhenNodeIsRemoved: element,
                    owner: this
                });
            }
            if (ko.isWriteableObservable(value.isOpen)) {
                this.on(element, 'open', function () {
                    value.isOpen(true);
                });
                this.on(element, 'close', function () {
                    value.isOpen(false);
                });
            }

            // Notify knockout's value- and selectedOptions bindings that the selected
            // option has been changed.
            this.on(element, 'change', function () {
                $(element).trigger('change');
            });

            return result;
        };

        /*jslint unparam:true*/
        Selectmenu.prototype.update = function (element, valueAccessor,
            allBindingsAccessor) {
            /// <summary>Refreshes the widget if the value binding changes.</summary>
            /// <param name='element' type='DOMNode'></param>
            /// <param name='valueAccessor' type='Function'></param>
            /// <param name='allBindingsAccessor' type='Object'></param>

            var oldValue, newValue;

            BindingHandler.prototype.update.apply(this, arguments);

            // synchronize the selected option with knockout's standard value binding
            if (allBindingsAccessor().hasOwnProperty('value')) {
                oldValue = ko.utils.domData.get(element, domDataKey);
                newValue = ko.utils.unwrapObservable(allBindingsAccessor().value);
                if (oldValue !== newValue) {
                    $(element).selectmenu('refresh');
                }
            }
        };
        /*jslint unparam:false*/

        utils.register(Selectmenu);

        return Selectmenu;
    }
));
(function (root, factory) {

    'use strict';

    root.kojqui.Slider = factory(root.jQuery, root.ko, root.kojqui.BindingHandler, root.kojqui.utils, root.jQuery.ui.slider);
}(this,
    function ($, ko, BindingHandler, utils) {

        'use strict';

        var domDataKey, Slider;

        domDataKey = '__kojqui_options';

        Slider = function () {
            /// <summary>Constructor.</summary>

            BindingHandler.call(this, 'slider');

            this.widgetEventPrefix = 'slide';
            this.options = ['animate', 'disabled', 'max', 'min', 'orientation', 'range',
                'step', 'value', 'values'];
            this.events = ['create', 'start', 'slide', 'change', 'stop'];
        };

        Slider.prototype = utils.createObject(BindingHandler.prototype);
        Slider.prototype.constructor = Slider;

        Slider.prototype.init = function (element, valueAccessor) {
            /// <summary>Keeps the value and the values binding property in sync with the
            /// slider widget's values.</summary>
            /// <param name='element' type='DOMNode'></param>
            /// <param name='valueAccessor' type='Function'></param>

            var result, value, changeEvent;

            result = BindingHandler.prototype.init.apply(this, arguments);

            value = valueAccessor();
            changeEvent = value.realtime ? 'slide' : 'change';

            if (ko.isWriteableObservable(value.value)) {
                /*jslint unparam:true*/
                this.on(element, changeEvent, function (ev, ui) {
                    var index = $(element).find('.ui-slider-handle').index(ui.handle);
                    if (index === 0) {
                        // The slider widget, in its _slide() method, raises the
                        // slide/slidechange events, then immediately updates its value
                        // property. If any of the event handlers hooked onto the
                        // slide/slidechange event sets the widget's value property, it
                        // will ruin the sliding animation.
                        // To prevent that, we trick the update() method defined in
                        // BindingHandler to think that the value option is already
                        // updated.
                        ko.utils.domData.get(element, domDataKey).value = ui.value;
                        value.value(ui.value);
                    }
                });
                /*jslint unparam:false*/
            }
            if (ko.isWriteableObservable(value.values)) {
                /*jslint unparam:true*/
                this.on(element, changeEvent, function (ev, ui) {
                    // see the explanation above
                    ko.utils.domData.get(element, domDataKey).value = ui.values;
                    value.values(ui.values);
                });
                /*jslint unparam:false*/
            }

            return result;
        };

        utils.register(Slider);

        return Slider;
    }
));
(function (root, factory) {

    'use strict';

    root.kojqui.Spinner = factory(root.jQuery, root.ko, root.kojqui.BindingHandler, root.kojqui.utils, root.jQuery.ui.spinner);
}(this,
    function ($, ko, BindingHandler, utils) {

        'use strict';

        var Spinner = function () {
            /// <summary>Constructor.</summary>

            BindingHandler.call(this, 'spinner');

            this.widgetEventPrefix = 'spin';
            this.options = ['culture', 'disabled', 'icons', 'incremental', 'max', 'min',
                'numberFormat', 'page', 'step'];
            this.events = ['create', 'start', 'spin', 'stop', 'change'];
        };

        Spinner.prototype = utils.createObject(BindingHandler.prototype);
        Spinner.prototype.constructor = Spinner;

        Spinner.prototype.init = function (element, valueAccessor, allBindingsAccessor) {
            /// <summary>Keeps the value binding property in sync with the spinner's
            /// value.</summary>
            /// <param name='element' type='DOMNode'></param>
            /// <param name='valueAccessor' type='Function'></param>
            /// <param name='allBindingsAccessor' type='Function'></param>

            var result, widgetName, value;

            result = BindingHandler.prototype.init.apply(this, arguments);

            widgetName = this.widgetName;
            value = valueAccessor();

            if (value.value) {
                ko.computed({
                    read: function () {
                        $(element)[widgetName]('value',
                            ko.utils.unwrapObservable(value.value));
                    },
                    disposeWhenNodeIsRemoved: element
                });
            }

            // If 'value' is an observable writeable, then add an event handler so that
            // when the spinner  increments/decrements the 'value' observable can be
            // mutated.
            // Which event we listen for depends upon if any of the KO valueUpdate options
            // have been specified.
            // 1. When there is no valueUpdate in the binding, 'value' will be mutated in
            //    response to the 'spinchange' event which occurs whenever the input loses
            //    focus.
            // 2. If any of the KO valueUpdate options ("keyup", "keypress",
            //    "afterkeydown") are specified in the binding,  this implies that you
            //    wish to mutate the 'value' observable in real-time. In this case the
            //    'spin' event is used so that 'value' can be updated everytime there is
            //    an inc/dec, and done so immediately.
            if (ko.isWriteableObservable(value.value)) {
                if (allBindingsAccessor().valueUpdate) {
                    /*jslint unparam:true*/
                    this.on(element, 'spin', function (ev, ui) {
                        value.value(ui.value);
                    });
                    /*jslint unparam:false*/
                } else {
                    this.on(element, 'change', function () {
                        value.value($(element)[widgetName]('value'));
                    });
                }
            }

            return result;
        };

        utils.register(Spinner);

        return Spinner;
    }
));
(function (root, factory) {

    'use strict';

    root.kojqui.Tabs = factory(root.jQuery, root.ko, root.kojqui.BindingHandler, root.kojqui.utils, root.jQuery.ui.tabs);
}(this,
    function ($, ko, BindingHandler, utils) {

        'use strict';

        var postInitHandler18, postInitHandler, Tabs;

        postInitHandler18 = function (element, valueAccessor) {
            /// <summary>Keeps the active binding property in sync with the tabs' state.
            /// </summary>
            /// <param name='element' type='DOMNode'></param>
            /// <param name='valueAccessor' type='Function'></param>

            var value = valueAccessor();

            if (ko.isWriteableObservable(value.selected)) {
                /*jslint unparam:true*/
                this.on(element, 'show', function (ev, ui) {
                    if ($(element)[0] === ev.target) {
                        // Only activate if this is the right tab widget.
                        value.selected(ui.index);
                    }
                });
                /*jslint unparam:false*/
            }
        };

        postInitHandler = function (element, valueAccessor) {
            /// <summary>Keeps the active binding property in sync with the tabs' state.
            /// </summary>
            /// <param name='element' type='DOMNode'></param>
            /// <param name='valueAccessor' type='Function'></param>

            var value = valueAccessor();

            if (ko.isWriteableObservable(value.active)) {
                /*jslint unparam:true*/
                this.on(element, 'activate', function (ev, ui) {
                    if ($(element)[0] === ev.target) {
                        // Only activate if this is the right tab widget.
                        value.active(ui.newTab.index());
                    }
                });
                /*jslint unparam:false*/
            }
        };

        Tabs = function () {
            /// <summary>Constructor.</summary>

            BindingHandler.call(this, 'tabs');

            this.version = utils.uiVersion;

            if (this.version.major === 1 && this.version.minor === 8) {
                this.options = ['ajaxOptions', 'cache', 'collapsible', 'cookie',
                    'disabled', 'event', 'fx', 'idPrefix', 'panelTemplate', 'selected',
                    'spinner', 'tabTemplate'];
                this.events = ['add', 'create', 'disable', 'enable', 'load', 'remove',
                    'select', 'show'];
                this.hasRefresh = false;
            } else {
                this.options = ['active', 'collapsible', 'disabled', 'event',
                    'heightStyle', 'hide', 'show'];
                this.events = ['activate', 'beforeActivate', 'beforeLoad', 'create',
                    'load'];
                this.hasRefresh = true;
            }
        };

        Tabs.prototype = utils.createObject(BindingHandler.prototype);
        Tabs.prototype.constructor = Tabs;

        Tabs.prototype.init = function (element, valueAccessor) {
            /// <summary>Keeps the active binding property in sync with the tabs' state.
            /// </summary>
            /// <param name='element' type='DOMNode'></param>
            /// <param name='valueAccessor' type='Function'></param>

            var result = BindingHandler.prototype.init.apply(this, arguments);

            if (this.version.major === 1 && this.version.minor === 8) {
                postInitHandler18.call(this, element, valueAccessor);
            } else {
                postInitHandler.call(this, element, valueAccessor);
            }

            return result;
        };

        utils.register(Tabs);

        return Tabs;
    }
));
(function (root, factory) {

    'use strict';

    root.kojqui.Tooltip = factory(root.jQuery, root.ko, root.kojqui.BindingHandler, root.kojqui.utils, root.jQuery.ui.tooltip);
}(this,
    function ($, ko, BindingHandler, utils) {

        'use strict';

        var Tooltip = function () {
            /// <summary>Constructor.</summary>

            BindingHandler.call(this, 'tooltip');

            this.options = ['content', 'disabled', 'hide', 'items', 'position', 'show',
                'tooltipClass', 'track'];
            this.events = ['create', 'open', 'close'];
        };

        Tooltip.prototype = utils.createObject(BindingHandler.prototype);
        Tooltip.prototype.constructor = Tooltip;

        Tooltip.prototype.init = function (element, valueAccessor) {
            /// <summary>Keeps the isOpen binding property in sync with the tooltip's
            /// state.
            /// </summary>
            /// <param name='element' type='DOMNode'></param>
            /// <param name='valueAccessor' type='Function'></param>

            var value, result;

            value = valueAccessor();

            result = BindingHandler.prototype.init.apply(this, arguments);

            if (value.isOpen) {
                ko.computed({
                    read: function () {
                        if (ko.utils.unwrapObservable(value.isOpen)) {
                            $(element)[this.widgetName]('open');
                        } else {
                            $(element)[this.widgetName]('close');
                        }
                    },
                    disposeWhenNodeIsRemoved: element,
                    owner: this
                });
            }
            if (ko.isWriteableObservable(value.isOpen)) {
                this.on(element, 'open', function () {
                    value.isOpen(true);
                });
                this.on(element, 'close', function () {
                    value.isOpen(false);
                });
            }

            return result;
        };

        utils.register(Tooltip);

        return Tooltip;
    }
));

/*=============================================================================
	Author:			Eric M. Barnard - @ericmbarnard								
	License:		MIT (http://opensource.org/licenses/mit-license.php)		
																				
	Description:	Validation Library for KnockoutJS							
	Version:		2.0.3											
===============================================================================
*/
/*globals require: false, exports: false, define: false, ko: false */

(function (factory) {
	// Module systems magic dance.

	if (typeof require === "function" && typeof exports === "object" && typeof module === "object") {
		// CommonJS or Node: hard-coded dependency on "knockout"
		factory(require("knockout"), exports);
	} else if (typeof define === "function" && define["amd"]) {
		// AMD anonymous module with hard-coded dependency on "knockout"
		define(["knockout", "exports"], factory);
	} else {
		// <script> tag: use the global `ko` object, attaching a `mapping` property
		factory(ko, ko.validation = {});
	}
}(function ( ko, exports ) {

	if (typeof (ko) === 'undefined') {
		throw new Error('Knockout is required, please ensure it is loaded before loading this validation plug-in');
	}

	// create our namespace object
	ko.validation = exports;

	var kv = ko.validation,
		koUtils = ko.utils,
		unwrap = koUtils.unwrapObservable,
		forEach = koUtils.arrayForEach,
		extend = koUtils.extend;
;/*global ko: false*/

var defaults = {
	registerExtenders: true,
	messagesOnModified: true,
	errorsAsTitle: true,            // enables/disables showing of errors as title attribute of the target element.
	errorsAsTitleOnModified: false, // shows the error when hovering the input field (decorateElement must be true)
	messageTemplate: null,
	insertMessages: true,           // automatically inserts validation messages as <span></span>
	parseInputAttributes: false,    // parses the HTML5 validation attribute from a form element and adds that to the object
	writeInputAttributes: false,    // adds HTML5 input validation attributes to form elements that ko observable's are bound to
	decorateInputElement: false,         // false to keep backward compatibility
	decorateElementOnModified: true,// true to keep backward compatibility
	errorClass: null,               // single class for error message and element
	errorElementClass: 'validationElement',  // class to decorate error element
	errorMessageClass: 'validationMessage',  // class to decorate error message
	allowHtmlMessages: false,		// allows HTML in validation messages
	grouping: {
		deep: false,        //by default grouping is shallow
		observable: true,   //and using observables
		live: false		    //react to changes to observableArrays if observable === true
	},
	validate: {
		// throttle: 10
	}
};

// make a copy  so we can use 'reset' later
var configuration = extend({}, defaults);

configuration.html5Attributes = ['required', 'pattern', 'min', 'max', 'step'];
configuration.html5InputTypes = ['email', 'number', 'date'];

configuration.reset = function () {
	extend(configuration, defaults);
};

kv.configuration = configuration;
;kv.utils = (function () {
	var seedId = new Date().getTime();

	var domData = {}; //hash of data objects that we reference from dom elements
	var domDataKey = '__ko_validation__';

	return {
		isArray: function (o) {
			return o.isArray || Object.prototype.toString.call(o) === '[object Array]';
		},
		isObject: function (o) {
			return o !== null && typeof o === 'object';
		},
		isNumber: function(o) {
			return !isNaN(o);	
		},
		isObservableArray: function(instance) {
			return !!instance &&
					typeof instance["remove"] === "function" &&
					typeof instance["removeAll"] === "function" &&
					typeof instance["destroy"] === "function" &&
					typeof instance["destroyAll"] === "function" &&
					typeof instance["indexOf"] === "function" &&
					typeof instance["replace"] === "function";
		},
		values: function (o) {
			var r = [];
			for (var i in o) {
				if (o.hasOwnProperty(i)) {
					r.push(o[i]);
				}
			}
			return r;
		},
		getValue: function (o) {
			return (typeof o === 'function' ? o() : o);
		},
		hasAttribute: function (node, attr) {
			return node.getAttribute(attr) !== null;
		},
		getAttribute: function (element, attr) {
			return element.getAttribute(attr);
		},
		setAttribute: function (element, attr, value) {
			return element.setAttribute(attr, value);
		},
		isValidatable: function (o) {
			return !!(o && o.rules && o.isValid && o.isModified);
		},
		insertAfter: function (node, newNode) {
			node.parentNode.insertBefore(newNode, node.nextSibling);
		},
		newId: function () {
			return seedId += 1;
		},
		getConfigOptions: function (element) {
			var options = kv.utils.contextFor(element);

			return options || kv.configuration;
		},
		setDomData: function (node, data) {
			var key = node[domDataKey];

			if (!key) {
				node[domDataKey] = key = kv.utils.newId();
			}

			domData[key] = data;
		},
		getDomData: function (node) {
			var key = node[domDataKey];

			if (!key) {
				return undefined;
			}

			return domData[key];
		},
		contextFor: function (node) {
			switch (node.nodeType) {
				case 1:
				case 8:
					var context = kv.utils.getDomData(node);
					if (context) { return context; }
					if (node.parentNode) { return kv.utils.contextFor(node.parentNode); }
					break;
			}
			return undefined;
		},
		isEmptyVal: function (val) {
			if (val === undefined) {
				return true;
			}
			if (val === null) {
				return true;
			}
			if (val === "") {
				return true;
			}
		},
		getOriginalElementTitle: function (element) {
			var savedOriginalTitle = kv.utils.getAttribute(element, 'data-orig-title'),
				currentTitle = element.title,
				hasSavedOriginalTitle = kv.utils.hasAttribute(element, 'data-orig-title');

			return hasSavedOriginalTitle ?
				savedOriginalTitle : currentTitle;
		},
		async: function (expr) {
			if (window.setImmediate) { window.setImmediate(expr); }
			else { window.setTimeout(expr, 0); }
		},
		forEach: function (object, callback) {
			if (kv.utils.isArray(object)) {
				return forEach(object, callback);
			}
			for (var prop in object) {
				if (object.hasOwnProperty(prop)) {
					callback(object[prop], prop);
				}
			}
		}
	};
}());;var api = (function () {

	var isInitialized = 0,
		configuration = kv.configuration,
		utils = kv.utils;

	function cleanUpSubscriptions(context) {
		forEach(context.subscriptions, function (subscription) {
			subscription.dispose();
		});
		context.subscriptions = [];
	}

	function dispose(context) {
		if (context.options.deep) {
			forEach(context.flagged, function (obj) {
				delete obj.__kv_traversed;
			});
			context.flagged.length = 0;
		}

		if (!context.options.live) {
			cleanUpSubscriptions(context);
		}
	}

	function runTraversal(obj, context) {
		context.validatables = [];
		cleanUpSubscriptions(context);
		traverseGraph(obj, context);
		dispose(context);
	}

	function traverseGraph(obj, context, level) {
		var objValues = [],
			val = obj.peek ? obj.peek() : obj;

		if (obj.__kv_traversed === true) {
			return;
		}

		if (context.options.deep) {
			obj.__kv_traversed = true;
			context.flagged.push(obj);
		}

		//default level value depends on deep option.
		level = (level !== undefined ? level : context.options.deep ? 1 : -1);

		// if object is observable then add it to the list
		if (ko.isObservable(obj)) {
			// ensure it's validatable but don't extend validatedObservable because it
			// would overwrite isValid property.
			if (!obj.errors && !utils.isValidatable(obj)) {
				obj.extend({ validatable: true });
			}
			context.validatables.push(obj);

			if (context.options.live && utils.isObservableArray(obj)) {
				context.subscriptions.push(obj.subscribe(function () {
					context.graphMonitor.valueHasMutated();
				}));
			}
		}

		//get list of values either from array or object but ignore non-objects
		// and destroyed objects
		if (val && !val._destroy) {
			if (utils.isArray(val)) {
				objValues = val;
			}
			else if (utils.isObject(val)) {
				objValues = utils.values(val);
			}
		}

		//process recursively if it is deep grouping
		if (level !== 0) {
			utils.forEach(objValues, function (observable) {
				//but not falsy things and not HTML Elements
				if (observable && !observable.nodeType && (!ko.isComputed(observable) || observable.rules)) {
					traverseGraph(observable, context, level + 1);
				}
			});
		}
	}

	function collectErrors(array) {
		var errors = [];
		forEach(array, function (observable) {
			// Do not collect validatedObservable errors
			if (utils.isValidatable(observable) && !observable.isValid()) {
				// Use peek because we don't want a dependency for 'error' property because it
				// changes before 'isValid' does. (Issue #99)
				errors.push(observable.error.peek());
			}
		});
		return errors;
	}

	return {
		//Call this on startup
		//any config can be overridden with the passed in options
		init: function (options, force) {
			//done run this multiple times if we don't really want to
			if (isInitialized > 0 && !force) {
				return;
			}

			//because we will be accessing options properties it has to be an object at least
			options = options || {};
			//if specific error classes are not provided then apply generic errorClass
			//it has to be done on option so that options.errorClass can override default
			//errorElementClass and errorMessage class but not those provided in options
			options.errorElementClass = options.errorElementClass || options.errorClass || configuration.errorElementClass;
			options.errorMessageClass = options.errorMessageClass || options.errorClass || configuration.errorMessageClass;

			extend(configuration, options);

			if (configuration.registerExtenders) {
				kv.registerExtenders();
			}

			isInitialized = 1;
		},

		// resets the config back to its original state
		reset: kv.configuration.reset,

		// recursively walks a viewModel and creates an object that
		// provides validation information for the entire viewModel
		// obj -> the viewModel to walk
		// options -> {
		//	  deep: false, // if true, will walk past the first level of viewModel properties
		//	  observable: false // if true, returns a computed observable indicating if the viewModel is valid
		// }
		group: function group(obj, options) { // array of observables or viewModel
			options = extend(extend({}, configuration.grouping), options);

			var context = {
				options: options,
				graphMonitor: ko.observable(),
				flagged: [],
				subscriptions: [],
				validatables: []
			};

			var result = null;

			//if using observables then traverse structure once and add observables
			if (options.observable) {
				result = ko.computed(function () {
					context.graphMonitor(); //register dependency
					runTraversal(obj, context);
					return collectErrors(context.validatables);
				});
			}
			else { //if not using observables then every call to error() should traverse the structure
				result = function () {
					runTraversal(obj, context);
					return collectErrors(context.validatables);
				};
			}

			result.showAllMessages = function (show) { // thanks @heliosPortal
				if (show === undefined) {//default to true
					show = true;
				}

				result.forEach(function (observable) {
					if (utils.isValidatable(observable)) {
						observable.isModified(show);
					}
				});
			};

			result.isAnyMessageShown = function () {
				var invalidAndModifiedPresent;

				invalidAndModifiedPresent = !!result.find(function (observable) {
					return utils.isValidatable(observable) && !observable.isValid() && observable.isModified();
				});
				return invalidAndModifiedPresent;
			};

			result.filter = function(predicate) {
				predicate = predicate || function () { return true; };
				// ensure we have latest changes
				result();

				return koUtils.arrayFilter(context.validatables, predicate);
			};

			result.find = function(predicate) {
				predicate = predicate || function () { return true; };
				// ensure we have latest changes
				result();

				return koUtils.arrayFirst(context.validatables, predicate);
			};

			result.forEach = function(callback) {
				callback = callback || function () { };
				// ensure we have latest changes
				result();

				forEach(context.validatables, callback);
			};

			result.map = function(mapping) {
				mapping = mapping || function (item) { return item; };
				// ensure we have latest changes
				result();

				return koUtils.arrayMap(context.validatables, mapping);
			};

			/**
			 * @private You should not rely on this method being here.
			 * It's a private method and it may change in the future.
			 *
			 * @description Updates the validated object and collects errors from it.
			 */
			result._updateState = function(newValue) {
				if (!utils.isObject(newValue)) {
					throw new Error('An object is required.');
				}
				obj = newValue;
				if (options.observable) {
					context.graphMonitor.valueHasMutated();
				}
				else {
					runTraversal(newValue, context);
					return collectErrors(context.validatables);
				}
			};
			return result;
		},

		formatMessage: function (message, params, observable) {
			if (utils.isObject(params) && params.typeAttr) {
				params = params.value;
			}
			if (typeof message === 'function') {
				return message(params, observable);
			}
			var replacements = unwrap(params);
            if (replacements == null) {
                replacements = [];
            }
			if (!utils.isArray(replacements)) {
				replacements = [replacements];
			}
			return message.replace(/{(\d+)}/gi, function(match, index) {
				if (typeof replacements[index] !== 'undefined') {
					return replacements[index];
				}
				return match;
			});
		},

		// addRule:
		// This takes in a ko.observable and a Rule Context - which is just a rule name and params to supply to the validator
		// ie: kv.addRule(myObservable, {
		//		  rule: 'required',
		//		  params: true
		//	  });
		//
		addRule: function (observable, rule) {
			observable.extend({ validatable: true });

			var hasRule = !!koUtils.arrayFirst(observable.rules(), function(item) {
				return item.rule && item.rule === rule.rule;
			});

			if (!hasRule) {
				//push a Rule Context to the observables local array of Rule Contexts
				observable.rules.push(rule);
			}
			return observable;
		},

		// addAnonymousRule:
		// Anonymous Rules essentially have all the properties of a Rule, but are only specific for a certain property
		// and developers typically are wanting to add them on the fly or not register a rule with the 'kv.rules' object
		//
		// Example:
		// var test = ko.observable('something').extend{(
		//	  validation: {
		//		  validator: function(val, someOtherVal){
		//			  return true;
		//		  },
		//		  message: "Something must be really wrong!',
		//		  params: true
		//	  }
		//  )};
		addAnonymousRule: function (observable, ruleObj) {
			if (ruleObj['message'] === undefined) {
				ruleObj['message'] = 'Error';
			}

			//make sure onlyIf is honoured
			if (ruleObj.onlyIf) {
				ruleObj.condition = ruleObj.onlyIf;
			}

			//add the anonymous rule to the observable
			kv.addRule(observable, ruleObj);
		},

		addExtender: function (ruleName) {
			ko.extenders[ruleName] = function (observable, params) {
				//params can come in a few flavors
				// 1. Just the params to be passed to the validator
				// 2. An object containing the Message to be used and the Params to pass to the validator
				// 3. A condition when the validation rule to be applied
				//
				// Example:
				// var test = ko.observable(3).extend({
				//	  max: {
				//		  message: 'This special field has a Max of {0}',
				//		  params: 2,
				//		  onlyIf: function() {
				//					  return specialField.IsVisible();
				//				  }
				//	  }
				//  )};
				//
				if (params && (params.message || params.onlyIf)) { //if it has a message or condition object, then its an object literal to use
					return kv.addRule(observable, {
						rule: ruleName,
						message: params.message,
						params: utils.isEmptyVal(params.params) ? true : params.params,
						condition: params.onlyIf
					});
				} else {
					return kv.addRule(observable, {
						rule: ruleName,
						params: params
					});
				}
			};
		},

		// loops through all kv.rules and adds them as extenders to
		// ko.extenders
		registerExtenders: function () { // root extenders optional, use 'validation' extender if would cause conflicts
			if (configuration.registerExtenders) {
				for (var ruleName in kv.rules) {
					if (kv.rules.hasOwnProperty(ruleName)) {
						if (!ko.extenders[ruleName]) {
							kv.addExtender(ruleName);
						}
					}
				}
			}
		},

		//creates a span next to the @element with the specified error class
		insertValidationMessage: function (element) {
			var span = document.createElement('SPAN');
			span.className = utils.getConfigOptions(element).errorMessageClass;
			utils.insertAfter(element, span);
			return span;
		},

		// if html-5 validation attributes have been specified, this parses
		// the attributes on @element
		parseInputValidationAttributes: function (element, valueAccessor) {
			forEach(kv.configuration.html5Attributes, function (attr) {
				if (utils.hasAttribute(element, attr)) {

					var params = element.getAttribute(attr) || true;

					if (attr === 'min' || attr === 'max')
					{
						// If we're validating based on the min and max attributes, we'll
						// need to know what the 'type' attribute is set to
						var typeAttr = element.getAttribute('type');
						if (typeof typeAttr === "undefined" || !typeAttr)
						{
							// From http://www.w3.org/TR/html-markup/input:
							//   An input element with no type attribute specified represents the
							//   same thing as an input element with its type attribute set to "text".
							typeAttr = "text";
						}
						params = {typeAttr: typeAttr, value: params};
					}

					kv.addRule(valueAccessor(), {
						rule: attr,
						params: params
					});
				}
			});

			var currentType = element.getAttribute('type');
			forEach(kv.configuration.html5InputTypes, function (type) {
				if (type === currentType) {
					kv.addRule(valueAccessor(), {
						rule: (type === 'date') ? 'dateISO' : type,
						params: true
					});
				}
			});
		},

		// writes html5 validation attributes on the element passed in
		writeInputValidationAttributes: function (element, valueAccessor) {
			var observable = valueAccessor();

			if (!observable || !observable.rules) {
				return;
			}

			var contexts = observable.rules(); // observable array

			// loop through the attributes and add the information needed
			forEach(kv.configuration.html5Attributes, function (attr) {
				var ctx = koUtils.arrayFirst(contexts, function (ctx) {
					return ctx.rule && ctx.rule.toLowerCase() === attr.toLowerCase();
				});

				if (!ctx) {
					return;
				}

				// we have a rule matching a validation attribute at this point
				// so lets add it to the element along with the params
				ko.computed({
					read: function() {
						var params = ko.unwrap(ctx.params);

						// we have to do some special things for the pattern validation
						if (ctx.rule === "pattern" && params instanceof RegExp) {
							// we need the pure string representation of the RegExpr without the //gi stuff
							params = params.source;
						}

						element.setAttribute(attr, params);
					},
					disposeWhenNodeIsRemoved: element
				});
			});

			contexts = null;
		},

		//take an existing binding handler and make it cause automatic validations
		makeBindingHandlerValidatable: function (handlerName) {
			var init = ko.bindingHandlers[handlerName].init;

			ko.bindingHandlers[handlerName].init = function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {

				init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);

				return ko.bindingHandlers['validationCore'].init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);
			};
		},

		// visit an objects properties and apply validation rules from a definition
		setRules: function (target, definition) {
			var setRules = function (target, definition) {
				if (!target || !definition) { return; }

				for (var prop in definition) {
					if (!definition.hasOwnProperty(prop)) { continue; }
					var ruleDefinitions = definition[prop];

					//check the target property exists and has a value
					if (!target[prop]) { continue; }
					var targetValue = target[prop],
						unwrappedTargetValue = unwrap(targetValue),
						rules = {},
						nonRules = {};

					for (var rule in ruleDefinitions) {
						if (!ruleDefinitions.hasOwnProperty(rule)) { continue; }
						if (kv.rules[rule]) {
							rules[rule] = ruleDefinitions[rule];
						} else {
							nonRules[rule] = ruleDefinitions[rule];
						}
					}

					//apply rules
					if (ko.isObservable(targetValue)) {
						targetValue.extend(rules);
					}

					//then apply child rules
					//if it's an array, apply rules to all children
					if (unwrappedTargetValue && utils.isArray(unwrappedTargetValue)) {
						for (var i = 0; i < unwrappedTargetValue.length; i++) {
							setRules(unwrappedTargetValue[i], nonRules);
						}
						//otherwise, just apply to this property
					} else {
						setRules(unwrappedTargetValue, nonRules);
					}
				}
			};
			setRules(target, definition);
		}
	};

}());

// expose api publicly
extend(ko.validation, api);
;//Validation Rules:
// You can view and override messages or rules via:
// kv.rules[ruleName]
//
// To implement a custom Rule, simply use this template:
// kv.rules['<custom rule name>'] = {
//      validator: function (val, param) {
//          <custom logic>
//          return <true or false>;
//      },
//      message: '<custom validation message>' //optionally you can also use a '{0}' to denote a placeholder that will be replaced with your 'param'
// };
//
// Example:
// kv.rules['mustEqual'] = {
//      validator: function( val, mustEqualVal ){
//          return val === mustEqualVal;
//      },
//      message: 'This field must equal {0}'
// };
//
kv.rules = {};
kv.rules['required'] = {
	validator: function (val, required) {
		var testVal;

		if (val === undefined || val === null) {
			return !required;
		}

		testVal = val;
		if (typeof (val) === 'string') {
			if (String.prototype.trim) {
				testVal = val.trim();
			}
			else {
				testVal = val.replace(/^\s+|\s+$/g, '');
			}
		}

		if (!required) {// if they passed: { required: false }, then don't require this
			return true;
		}

		return ((testVal + '').length > 0);
	},
	message: 'This field is required.'
};

function minMaxValidatorFactory(validatorName) {
    var isMaxValidation = validatorName === "max";

    return function (val, options) {
        if (kv.utils.isEmptyVal(val)) {
            return true;
        }

        var comparisonValue, type;
        if (options.typeAttr === undefined) {
            // This validator is being called from javascript rather than
            // being bound from markup
            type = "text";
            comparisonValue = options;
        } else {
            type = options.typeAttr;
            comparisonValue = options.value;
        }

        // From http://www.w3.org/TR/2012/WD-html5-20121025/common-input-element-attributes.html#attr-input-min,
        // if the value is parseable to a number, then the minimum should be numeric
        if (!isNaN(comparisonValue) && !(comparisonValue instanceof Date)) {
            type = "number";
        }

        var regex, valMatches, comparisonValueMatches;
        switch (type.toLowerCase()) {
            case "week":
                regex = /^(\d{4})-W(\d{2})$/;
                valMatches = val.match(regex);
                if (valMatches === null) {
                    throw new Error("Invalid value for " + validatorName + " attribute for week input.  Should look like " +
                        "'2000-W33' http://www.w3.org/TR/html-markup/input.week.html#input.week.attrs.min");
                }
                comparisonValueMatches = comparisonValue.match(regex);
                // If no regex matches were found, validation fails
                if (!comparisonValueMatches) {
                    return false;
                }

                if (isMaxValidation) {
                    return (valMatches[1] < comparisonValueMatches[1]) || // older year
                        // same year, older week
                        ((valMatches[1] === comparisonValueMatches[1]) && (valMatches[2] <= comparisonValueMatches[2]));
                } else {
                    return (valMatches[1] > comparisonValueMatches[1]) || // newer year
                        // same year, newer week
                        ((valMatches[1] === comparisonValueMatches[1]) && (valMatches[2] >= comparisonValueMatches[2]));
                }
                break;

            case "month":
                regex = /^(\d{4})-(\d{2})$/;
                valMatches = val.match(regex);
                if (valMatches === null) {
                    throw new Error("Invalid value for " + validatorName + " attribute for month input.  Should look like " +
                        "'2000-03' http://www.w3.org/TR/html-markup/input.month.html#input.month.attrs.min");
                }
                comparisonValueMatches = comparisonValue.match(regex);
                // If no regex matches were found, validation fails
                if (!comparisonValueMatches) {
                    return false;
                }

                if (isMaxValidation) {
                    return ((valMatches[1] < comparisonValueMatches[1]) || // older year
                        // same year, older month
                        ((valMatches[1] === comparisonValueMatches[1]) && (valMatches[2] <= comparisonValueMatches[2])));
                } else {
                    return (valMatches[1] > comparisonValueMatches[1]) || // newer year
                        // same year, newer month
                        ((valMatches[1] === comparisonValueMatches[1]) && (valMatches[2] >= comparisonValueMatches[2]));
                }
                break;

            case "number":
            case "range":
                if (isMaxValidation) {
                    return (!isNaN(val) && parseFloat(val) <= parseFloat(comparisonValue));
                } else {
                    return (!isNaN(val) && parseFloat(val) >= parseFloat(comparisonValue));
                }
                break;

            default:
                if (isMaxValidation) {
                    return val <= comparisonValue;
                } else {
                    return val >= comparisonValue;
                }
        }
    };
}

kv.rules['min'] = {
	validator: minMaxValidatorFactory("min"),
	message: 'Please enter a value greater than or equal to {0}.'
};

kv.rules['max'] = {
	validator: minMaxValidatorFactory("max"),
	message: 'Please enter a value less than or equal to {0}.'
};

kv.rules['minLength'] = {
	validator: function (val, minLength) {
		if(kv.utils.isEmptyVal(val)) { return true; }
		var normalizedVal = kv.utils.isNumber(val) ? ('' + val) : val;
		return normalizedVal.length >= minLength;
	},
	message: 'Please enter at least {0} characters.'
};

kv.rules['maxLength'] = {
	validator: function (val, maxLength) {
		if(kv.utils.isEmptyVal(val)) { return true; }
		var normalizedVal = kv.utils.isNumber(val) ? ('' + val) : val;
		return normalizedVal.length <= maxLength;
	},
	message: 'Please enter no more than {0} characters.'
};

kv.rules['pattern'] = {
	validator: function (val, regex) {
		return kv.utils.isEmptyVal(val) || val.toString().match(regex) !== null;
	},
	message: 'Please check this value.'
};

kv.rules['step'] = {
	validator: function (val, step) {

		// in order to handle steps of .1 & .01 etc.. Modulus won't work
		// if the value is a decimal, so we have to correct for that
		if (kv.utils.isEmptyVal(val) || step === 'any') { return true; }
		var dif = (val * 100) % (step * 100);
		return Math.abs(dif) < 0.00001 || Math.abs(1 - dif) < 0.00001;
	},
	message: 'The value must increment by {0}.'
};

kv.rules['email'] = {
	validator: function (val, validate) {
		if (!validate) { return true; }

		//I think an empty email address is also a valid entry
		//if one want's to enforce entry it should be done with 'required: true'
		return kv.utils.isEmptyVal(val) || (
			// jquery validate regex - thanks Scott Gonzalez
			validate && /^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i.test(val)
		);
	},
	message: 'Please enter a proper email address.'
};

kv.rules['date'] = {
	validator: function (value, validate) {
		if (!validate) { return true; }
		return kv.utils.isEmptyVal(value) || (validate && !/Invalid|NaN/.test(new Date(value)));
	},
	message: 'Please enter a proper date.'
};

kv.rules['dateISO'] = {
	validator: function (value, validate) {
		if (!validate) { return true; }
		return kv.utils.isEmptyVal(value) || (validate && /^\d{4}[-/](?:0?[1-9]|1[012])[-/](?:0?[1-9]|[12][0-9]|3[01])$/.test(value));
	},
	message: 'Please enter a proper date.'
};

kv.rules['number'] = {
	validator: function (value, validate) {
		if (!validate) { return true; }
		return kv.utils.isEmptyVal(value) || (validate && /^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(value));
	},
	message: 'Please enter a number.'
};

kv.rules['digit'] = {
	validator: function (value, validate) {
		if (!validate) { return true; }
		return kv.utils.isEmptyVal(value) || (validate && /^\d+$/.test(value));
	},
	message: 'Please enter a digit.'
};

kv.rules['phoneUS'] = {
	validator: function (phoneNumber, validate) {
		if (!validate) { return true; }
		if (kv.utils.isEmptyVal(phoneNumber)) { return true; } // makes it optional, use 'required' rule if it should be required
		if (typeof (phoneNumber) !== 'string') { return false; }
		phoneNumber = phoneNumber.replace(/\s+/g, "");
		return validate && phoneNumber.length > 9 && phoneNumber.match(/^(1-?)?(\([2-9]\d{2}\)|[2-9]\d{2})-?[2-9]\d{2}-?\d{4}$/);
	},
	message: 'Please specify a valid phone number.'
};

kv.rules['equal'] = {
	validator: function (val, params) {
		var otherValue = params;
		return val === kv.utils.getValue(otherValue);
	},
	message: 'Values must equal.'
};

kv.rules['notEqual'] = {
	validator: function (val, params) {
		var otherValue = params;
		return val !== kv.utils.getValue(otherValue);
	},
	message: 'Please choose another value.'
};

//unique in collection
// options are:
//    collection: array or function returning (observable) array
//              in which the value has to be unique
//    valueAccessor: function that returns value from an object stored in collection
//              if it is null the value is compared directly
//    external: set to true when object you are validating is automatically updating collection
kv.rules['unique'] = {
	validator: function (val, options) {
		var c = kv.utils.getValue(options.collection),
			external = kv.utils.getValue(options.externalValue),
			counter = 0;

		if (!val || !c) { return true; }

		koUtils.arrayFilter(c, function (item) {
			if (val === (options.valueAccessor ? options.valueAccessor(item) : item)) { counter++; }
		});
		// if value is external even 1 same value in collection means the value is not unique
		return counter < (!!external ? 1 : 2);
	},
	message: 'Please make sure the value is unique.'
};


//now register all of these!
(function () {
	kv.registerExtenders();
}());
;// The core binding handler
// this allows us to setup any value binding that internally always
// performs the same functionality
ko.bindingHandlers['validationCore'] = (function () {

	return {
		init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
			var config = kv.utils.getConfigOptions(element);
			var observable = valueAccessor();

			// parse html5 input validation attributes, optional feature
			if (config.parseInputAttributes) {
				kv.utils.async(function () { kv.parseInputValidationAttributes(element, valueAccessor); });
			}

			// if requested insert message element and apply bindings
			if (config.insertMessages && kv.utils.isValidatable(observable)) {

				// insert the <span></span>
				var validationMessageElement = kv.insertValidationMessage(element);

				// if we're told to use a template, make sure that gets rendered
				if (config.messageTemplate) {
					ko.renderTemplate(config.messageTemplate, { field: observable }, null, validationMessageElement, 'replaceNode');
				} else {
					ko.applyBindingsToNode(validationMessageElement, { validationMessage: observable });
				}
			}

			// write the html5 attributes if indicated by the config
			if (config.writeInputAttributes && kv.utils.isValidatable(observable)) {

				kv.writeInputValidationAttributes(element, valueAccessor);
			}

			// if requested, add binding to decorate element
			if (config.decorateInputElement && kv.utils.isValidatable(observable)) {
				ko.applyBindingsToNode(element, { validationElement: observable });
			}
		}
	};

}());

// override for KO's default 'value', 'checked', 'textInput' and selectedOptions bindings
kv.makeBindingHandlerValidatable("value");
kv.makeBindingHandlerValidatable("checked");
if (ko.bindingHandlers.textInput) {
	kv.makeBindingHandlerValidatable("textInput");
}
kv.makeBindingHandlerValidatable("selectedOptions");


ko.bindingHandlers['validationMessage'] = { // individual error message, if modified or post binding
	update: function (element, valueAccessor) {
		var obsv = valueAccessor(),
			config = kv.utils.getConfigOptions(element),
			val = unwrap(obsv),
			msg = null,
			isModified = false,
			isValid = false;

		if (obsv === null || typeof obsv === 'undefined') {
			throw new Error('Cannot bind validationMessage to undefined value. data-bind expression: ' +
				element.getAttribute('data-bind'));
		}

		isModified = obsv.isModified && obsv.isModified();
		isValid = obsv.isValid && obsv.isValid();

		var error = null;
		if (!config.messagesOnModified || isModified) {
			error = isValid ? null : obsv.error;
		}

		var isVisible = !config.messagesOnModified || isModified ? !isValid : false;
		var isCurrentlyVisible = element.style.display !== "none";

		if (config.allowHtmlMessages) {
			koUtils.setHtml(element, error);
		} else {
			ko.bindingHandlers.text.update(element, function () { return error; });
		}

		if (isCurrentlyVisible && !isVisible) {
			element.style.display = 'none';
		} else if (!isCurrentlyVisible && isVisible) {
			element.style.display = '';
		}
	}
};

ko.bindingHandlers['validationElement'] = {
	update: function (element, valueAccessor, allBindingsAccessor) {
		var obsv = valueAccessor(),
			config = kv.utils.getConfigOptions(element),
			val = unwrap(obsv),
			msg = null,
			isModified = false,
			isValid = false;

		if (obsv === null || typeof obsv === 'undefined') {
			throw new Error('Cannot bind validationElement to undefined value. data-bind expression: ' +
				element.getAttribute('data-bind'));
		}

		isModified = obsv.isModified && obsv.isModified();
		isValid = obsv.isValid && obsv.isValid();

		// create an evaluator function that will return something like:
		// css: { validationElement: true }
		var cssSettingsAccessor = function () {
			var css = {};

			var shouldShow = ((!config.decorateElementOnModified || isModified) ? !isValid : false);

			// css: { validationElement: false }
			css[config.errorElementClass] = shouldShow;

			return css;
		};

		//add or remove class on the element;
		ko.bindingHandlers.css.update(element, cssSettingsAccessor, allBindingsAccessor);
		if (!config.errorsAsTitle) { return; }

		ko.bindingHandlers.attr.update(element, function () {
			var
				hasModification = !config.errorsAsTitleOnModified || isModified,
				title = kv.utils.getOriginalElementTitle(element);

			if (hasModification && !isValid) {
				return { title: obsv.error, 'data-orig-title': title };
			} else if (!hasModification || isValid) {
				return { title: title, 'data-orig-title': null };
			}
		});
	}
};

// ValidationOptions:
// This binding handler allows you to override the initial config by setting any of the options for a specific element or context of elements
//
// Example:
// <div data-bind="validationOptions: { insertMessages: true, messageTemplate: 'customTemplate', errorMessageClass: 'mySpecialClass'}">
//      <input type="text" data-bind="value: someValue"/>
//      <input type="text" data-bind="value: someValue2"/>
// </div>
ko.bindingHandlers['validationOptions'] = (function () {
	return {
		init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
			var options = unwrap(valueAccessor());
			if (options) {
				var newConfig = extend({}, kv.configuration);
				extend(newConfig, options);

				//store the validation options on the node so we can retrieve it later
				kv.utils.setDomData(element, newConfig);
			}
		}
	};
}());
;// Validation Extender:
// This is for creating custom validation logic on the fly
// Example:
// var test = ko.observable('something').extend{(
//      validation: {
//          validator: function(val, someOtherVal){
//              return true;
//          },
//          message: "Something must be really wrong!',
//          params: true
//      }
//  )};
ko.extenders['validation'] = function (observable, rules) { // allow single rule or array
	forEach(kv.utils.isArray(rules) ? rules : [rules], function (rule) {
		// the 'rule' being passed in here has no name to identify a core Rule,
		// so we add it as an anonymous rule
		// If the developer is wanting to use a core Rule, but use a different message see the 'addExtender' logic for examples
		kv.addAnonymousRule(observable, rule);
	});
	return observable;
};

//This is the extender that makes a Knockout Observable also 'Validatable'
//examples include:
// 1. var test = ko.observable('something').extend({validatable: true});
// this will ensure that the Observable object is setup properly to respond to rules
//
// 2. test.extend({validatable: false});
// this will remove the validation properties from the Observable object should you need to do that.
ko.extenders['validatable'] = function (observable, options) {
	if (!kv.utils.isObject(options)) {
		options = { enable: options };
	}

	if (!('enable' in options)) {
		options.enable = true;
	}

	if (options.enable && !kv.utils.isValidatable(observable)) {
		var config = kv.configuration.validate || {};
		var validationOptions = {
			throttleEvaluation : options.throttle || config.throttle
		};

		observable.error = ko.observable(null); // holds the error message, we only need one since we stop processing validators when one is invalid

		// observable.rules:
		// ObservableArray of Rule Contexts, where a Rule Context is simply the name of a rule and the params to supply to it
		//
		// Rule Context = { rule: '<rule name>', params: '<passed in params>', message: '<Override of default Message>' }
		observable.rules = ko.observableArray(); //holds the rule Contexts to use as part of validation

		//in case async validation is occurring
		observable.isValidating = ko.observable(false);

		//the true holder of whether the observable is valid or not
		observable.__valid__ = ko.observable(true);

		observable.isModified = ko.observable(false);

		// a semi-protected observable
		observable.isValid = ko.computed(observable.__valid__);

		//manually set error state
		observable.setError = function (error) {
			var previousError = observable.error.peek();
			var previousIsValid = observable.__valid__.peek();

			observable.error(error);
			observable.__valid__(false);

			if (previousError !== error && !previousIsValid) {
				// if the observable was not valid before then isValid will not mutate,
				// hence causing any grouping to not display the latest error.
				observable.isValid.notifySubscribers();
			}
		};

		//manually clear error state
		observable.clearError = function () {
			observable.error(null);
			observable.__valid__(true);
			return observable;
		};

		//subscribe to changes in the observable
		var h_change = observable.subscribe(function () {
			observable.isModified(true);
		});

		// we use a computed here to ensure that anytime a dependency changes, the
		// validation logic evaluates
		var h_obsValidationTrigger = ko.computed(extend({
			read: function () {
				var obs = observable(),
					ruleContexts = observable.rules();

				kv.validateObservable(observable);

				return true;
			}
		}, validationOptions));

		extend(h_obsValidationTrigger, validationOptions);

		observable._disposeValidation = function () {
			//first dispose of the subscriptions
			observable.isValid.dispose();
			observable.rules.removeAll();
			h_change.dispose();
			h_obsValidationTrigger.dispose();

			delete observable['rules'];
			delete observable['error'];
			delete observable['isValid'];
			delete observable['isValidating'];
			delete observable['__valid__'];
			delete observable['isModified'];
            delete observable['setError'];
            delete observable['clearError'];
            delete observable['_disposeValidation'];
		};
	} else if (options.enable === false && observable._disposeValidation) {
		observable._disposeValidation();
	}
	return observable;
};

function validateSync(observable, rule, ctx) {
	//Execute the validator and see if its valid
	if (!rule.validator(observable(), (ctx.params === undefined ? true : unwrap(ctx.params)))) { // default param is true, eg. required = true

		//not valid, so format the error message and stick it in the 'error' variable
		observable.setError(kv.formatMessage(
					ctx.message || rule.message,
					unwrap(ctx.params),
					observable));
		return false;
	} else {
		return true;
	}
}

function validateAsync(observable, rule, ctx) {
	observable.isValidating(true);

	var callBack = function (valObj) {
		var isValid = false,
			msg = '';

		if (!observable.__valid__()) {

			// since we're returning early, make sure we turn this off
			observable.isValidating(false);

			return; //if its already NOT valid, don't add to that
		}

		//we were handed back a complex object
		if (valObj['message']) {
			isValid = valObj.isValid;
			msg = valObj.message;
		} else {
			isValid = valObj;
		}

		if (!isValid) {
			//not valid, so format the error message and stick it in the 'error' variable
			observable.error(kv.formatMessage(
				msg || ctx.message || rule.message,
				unwrap(ctx.params),
				observable));
			observable.__valid__(isValid);
		}

		// tell it that we're done
		observable.isValidating(false);
	};

	kv.utils.async(function() {
	    //fire the validator and hand it the callback
        rule.validator(observable(), ctx.params === undefined ? true : unwrap(ctx.params), callBack);
	});
}

kv.validateObservable = function (observable) {
	var i = 0,
		rule, // the rule validator to execute
		ctx, // the current Rule Context for the loop
		ruleContexts = observable.rules(), //cache for iterator
		len = ruleContexts.length; //cache for iterator

	for (; i < len; i++) {

		//get the Rule Context info to give to the core Rule
		ctx = ruleContexts[i];

		// checks an 'onlyIf' condition
		if (ctx.condition && !ctx.condition()) {
			continue;
		}

		//get the core Rule to use for validation
		rule = ctx.rule ? kv.rules[ctx.rule] : ctx;

		if (rule['async'] || ctx['async']) {
			//run async validation
			validateAsync(observable, rule, ctx);

		} else {
			//run normal sync validation
			if (!validateSync(observable, rule, ctx)) {
				return false; //break out of the loop
			}
		}
	}
	//finally if we got this far, make the observable valid again!
	observable.clearError();
	return true;
};
;
var _locales = {};
var _currentLocale;

kv.defineLocale = function(name, values) {
	if (name && values) {
		_locales[name.toLowerCase()] = values;
		return values;
	}
	return null;
};

kv.locale = function(name) {
	if (name) {
		name = name.toLowerCase();

		if (_locales.hasOwnProperty(name)) {
			kv.localize(_locales[name]);
			_currentLocale = name;
		}
		else {
			throw new Error('Localization ' + name + ' has not been loaded.');
		}
	}
	return _currentLocale;
};

//quick function to override rule messages
kv.localize = function (msgTranslations) {
	var rules = kv.rules;

	//loop the properties in the object and assign the msg to the rule
	for (var ruleName in msgTranslations) {
		if (rules.hasOwnProperty(ruleName)) {
			rules[ruleName].message = msgTranslations[ruleName];
		}
	}
};

// Populate default locale (this will make en-US.js somewhat redundant)
(function() {
	var localeData = {};
	var rules = kv.rules;

	for (var ruleName in rules) {
		if (rules.hasOwnProperty(ruleName)) {
			localeData[ruleName] = rules[ruleName].message;
		}
	}
	kv.defineLocale('en-us', localeData);
})();

// No need to invoke locale because the messages are already defined along with the rules for en-US
_currentLocale = 'en-us';
;/**
 * Possible invocations:
 * 		applyBindingsWithValidation(viewModel)
 * 		applyBindingsWithValidation(viewModel, options)
 * 		applyBindingsWithValidation(viewModel, rootNode)
 *		applyBindingsWithValidation(viewModel, rootNode, options)
 */
ko.applyBindingsWithValidation = function (viewModel, rootNode, options) {
	var node = document.body,
		config;

	if (rootNode && rootNode.nodeType) {
		node = rootNode;
		config = options;
	}
	else {
		config = rootNode;
	}

	kv.init();

	if (config) {
		config = extend(extend({}, kv.configuration), config);
		kv.utils.setDomData(node, config);
	}

	ko.applyBindings(viewModel, node);
};

//override the original applyBindings so that we can ensure all new rules and what not are correctly registered
var origApplyBindings = ko.applyBindings;
ko.applyBindings = function (viewModel, rootNode) {

	kv.init();

	origApplyBindings(viewModel, rootNode);
};

ko.validatedObservable = function (initialValue, options) {
	if (!options && !kv.utils.isObject(initialValue)) {
		return ko.observable(initialValue).extend({ validatable: true });
	}

	var obsv = ko.observable(initialValue);
	obsv.errors = kv.group(kv.utils.isObject(initialValue) ? initialValue : {}, options);
	obsv.isValid = ko.observable(obsv.errors().length === 0);

	if (ko.isObservable(obsv.errors)) {
		obsv.errors.subscribe(function(errors) {
			obsv.isValid(errors.length === 0);
		});
	}
	else {
		ko.computed(obsv.errors).subscribe(function (errors) {
			obsv.isValid(errors.length === 0);
		});
	}

	obsv.subscribe(function(newValue) {
		if (!kv.utils.isObject(newValue)) {
			/*
			 * The validation group works on objects.
			 * Since the new value is a primitive (scalar, null or undefined) we need
			 * to create an empty object to pass along.
			 */
			newValue = {};
		}
		// Force the group to refresh
		obsv.errors._updateState(newValue);
		obsv.isValid(obsv.errors().length === 0);
	});

	return obsv;
};
;}));

/**
 * Listing Website AJAX calls.
 *
 * @requires
 *     jquery
 *
 */

var listing = (function () {
    /** Public functions and state. */
    var pub = {};
    /** Dynamic variable for different ajax call. */
    var message = '';
    window["xhr" + message] = null;

    /**
     * Make an AJAX call.  All AJAX calls should go through this function.
     *
     * @param messageName
     *        Message to send to server.  For example, CorrectAddress.
     * @param message
     *        This parameter is translated into JSON and sent in the HTTP body.  Default: emptyString.
     * @param onSuccess
     *        Callback on success.
     * @param onFailure
     *        Callback on failure.
     * @param isRW5
     *        Type of data expected back.  Default: json.
     * @param dataType
     *        Type of data expected back.  Default: json.
     *
     */

    pub.ajax = ajax;
    pub.ajaxrw = ajaxrw;
    pub.ajaxUnauthenticated = ajaxUnauthenticated;

    function ajax(messageName, message, onSuccess, onFailure, dataType, async, allowParallelCalls) {
        ajax_call(messageName, message, onSuccess, onFailure, dataType, async, "/v4/AjaxHandler", allowParallelCalls)
    }

    function ajaxrw(messageName, message, onSuccess, onFailure, dataType, async, allowParallelCalls) {
        ajax_call(messageName, message, onSuccess, onFailure, dataType, async, "/v4/AjaxRWHandler", allowParallelCalls)
    }

    function ajaxUnauthenticated(messageName, message, onSuccess, onFailure, dataType, async, allowParallelCalls) {
        ajax_call(messageName,
            message,
            onSuccess,
            onFailure,
            dataType,
            async,
            "/v4/AjaxHandlerUnauthenticated",
            allowParallelCalls);
    }

    function ajax_call(messageName, message, onSuccess, onFailure, dataType, async, ajaxpath, allowParallelCalls) {
        if (dataType === undefined || dataType === null)
            dataType = "json";
        if (async === undefined || async === null)
            async = true;
        if (allowParallelCalls === undefined || allowParallelCalls === null)
            allowParallelCalls = false;

        var data = message === undefined || message === null ? "" : JSON.stringify(message);

        var path = ajaxpath;

        if ((data.indexOf('<') >= 0 || data.indexOf('>') >= 0 || data.indexOf('&lt;') >= 0 || data.indexOf('&gt;') >= 0) && messageName != 'BuildFile' && messageName !='LandlordInboxSendEmail') {
            console.log("Cross-site script exploit attempt detected.  Ignoring request.");
        }
        else {
            message = messageName;
            if (window["xhr" + message] != null && !allowParallelCalls) {
                window["xhr" + message].abort();
                window["xhr" + message] = null;
            }
            window["xhr" + message] = $.ajax
                ({
                    type: "post",
                    async: async,
                    url: path + "?message=" + messageName,
                    contentType: "application/json; charset=utf-8",
                    dataType: dataType,
                    data: data,
                    success: onSuccess,
                    error: onFailure
                });
        }
    }

    pub.composeAddressString = function (model) {
        return `${model.address}${model.unit ? ', Unit #' + model.unit : ''}, ${model.city}, ${model.state} ${model.zip}`;
    }

    pub.redirectToLDashboard = function (redirectToLDashboardOnSuccess, redirectToLDashboardOnFailure) {
        var message;
        ajax("RedirectToHaDashboard", message, redirectToLDashboardOnSuccess, redirectToLDashboardOnFailure);
    }

    pub.getUserType = function (getUserTypeOnSuccess, getUserTypeOnFailure) {
        var message;
        ajax("GetUserType", message, getUserTypeOnSuccess, getUserTypeOnFailure);
    }

    pub.loginWithToken = function (token, formInstanceId, voucherApplicationId, haId, waitlistName, userRole, waitlistId, loginWithTokenOnSuccess, loginWithTokenOnFailure) {
        var message =
        {
            authToken: token,
            providerType: "hadashboard"

        };
        $.ajax
            ({
                type: "post",
                url: "/v4/AjaxRWHandler?message=TokenLogin",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                data: JSON.stringify(message),
                formInstanceId: formInstanceId,
                voucherApplicationId: voucherApplicationId,
                haId: haId,
                waitlistName: waitlistName,
                userRole: userRole,
                waitlistId: waitlistId,
                success: loginWithTokenOnSuccess,
                error: loginWithTokenOnFailure
            });
    }

    // action for checking email used during tenant sign up
    // returns:
    // bool exists
    pub.emailExists = function (email, emailExistsOnSuccess, emailExistsOnFailure) {
        var message =
        {
            valuetoCheck: email
        };
        ajaxUnauthenticated("EmailExists", message, emailExistsOnSuccess, emailExistsOnFailure);
    }

    pub.phoneExists = function (phone, emailExistsOnSuccess, emailExistsOnFailure) {
        var message =
        {
            valuetoCheck: phone
        };
        ajaxUnauthenticated("PhoneExists", message, emailExistsOnSuccess, emailExistsOnFailure);
    }

    pub.checkScammerIPAddress = function (checkScammerIPAddressOnSuccess, checkScammerIPAddressOnFailure) {
        var message =
        {

        };
        ajaxUnauthenticated("CheckScammerIPAddress", message, checkScammerIPAddressOnSuccess, checkScammerIPAddressOnSuccess);
    }

    // action for tenant signup
    // returns :
    // bool success
    // string errorMessage
    pub.signup = function (password, firstName, lastName, email, phone, userType, company, title, redirectUrl, signupOnSuccess, signupOnFailure) {
        var message =
        {
            password: password,
            firstName: firstName,
            lastName: lastName,
            email: email,
            phone: phone,
            userType: userType,
            company: company,
            title: title,
            emailRedirectUrl: redirectUrl
        };
        ajaxrw("Signup", message, signupOnSuccess, signupOnFailure);
    }

    // action for clicking on the link on activation email
    // returns:
    // bool success
    pub.activateTenantAccount = function (token, activateTenantAccountOnSuccess, activateTenantAccountOnFailure) {
        var message =
        {
            token: token
        };
        ajax("ActivateTenantAccount", message, activateTenantAccountOnSuccess, activateTenantAccountOnFailure);
    }

    // action for clicking on login
    // returns:
    // bool success
    // bool locked - provide link to reset password if true
    pub.login = function (userName, password, userType, loginOnSuccess, loginOnFailure) {
        var message =
        {
            userName: userName,
            password: password,
            userType: userType
        };
        ajaxrw("Login", message, loginOnSuccess, loginOnFailure);
    }

    // action for favourites
    // returns:
    // bool saved Favourite true/false
    pub.saveFavourites = function (communityId, userId, IsTenantFavourite, favouriteSavedSuccess, favouriteSavedFailure, clickSource) {
        var message =
        {
            communityId: communityId,
            userId: userId,
            IsTenantFavourite: IsTenantFavourite
        };
        ajax("SaveTenantFavorite", message, favouriteSavedSuccess, favouriteSavedFailure);

        // Must negate parameter because false means "is favorite" and true means "is favorite".  Stored procedure negates value.
        var isFavorite = !IsTenantFavourite;
        ahEvent.listingMarkedAsFavorite (communityId, isFavorite, clickSource);
    }

    /**
     * gets property details for print flyer
     * @param {communityId}
     */
    pub.getPrintFlyerData = function (communityId, getPropertyDetailsOnSuccess, getPropertyDetailsOnFailure) {
        var message = {
            CommunityId: communityId
        };
        ajax("GetPrintFlyerData", message, getPropertyDetailsOnSuccess, getPropertyDetailsOnFailure)
    }

    /**
     * Gets the PDF
     * @param {any} HTML
     */
    pub.getDownloadPDFflyer = function (PDFHTML, GetPDFFlyerOnSuccess, GetPDFFlyerOnFailure) {
        var message = {
            strHTML: PDFHTML
        };
        ajax("BuildFile", message, GetPDFFlyerOnSuccess, GetPDFFlyerOnFailure)
    }

    // action for Saving Tenant Search Filters
    // returns:
    pub.saveSearchFilter = function (tenantsSavedSearchesId, searchFilters, saveSearch, savedSearchName, saveSearchFilterOnSuccess, saveSearchFilterOnFailure) {

        var message =
        {
            SearchFilers: searchFilters,
            TenantsSavedSearchesId: tenantsSavedSearchesId,
            SaveSearch: saveSearch,
            SearchLabel: savedSearchName
        };
        ajax("SaveSearchFilters", message, saveSearchFilterOnSuccess, saveSearchFilterOnFailure);
    }

    // action for Saving Tenant Search Filters
    // returns:
    pub.saveSearchFilters = function (tenantsSavedSearchesId, searchFilters, saveSearch, saveSearchFilterOnSuccess, saveSearchFilterOnFailure) {
        var message =
        {
            SearchFilers: searchFilters,
            TenantsSavedSearchesId: tenantsSavedSearchesId,
            SaveSearch: saveSearch,
            SearchLabel: savedSearchName
        };
        ajax("SaveSearchFilters", message, saveSearchFilterOnSuccess, saveSearchFilterOnFailure);
    }

    // action for Saving Tenant Search Filters
    // returns:
    pub.saveSearchFilters = function (tenantsSavedSearchesId, searchFilters, saveSearch, saveSearchFilterOnSuccess, saveSearchFilterOnFailure) {
        var message =
        {
            SearchFilers: searchFilters,
            TenantsSavedSearchesId: tenantsSavedSearchesId,
            SaveSearch: saveSearch
        };
        ajax("SaveSearchFilters", message, saveSearchFilterOnSuccess, saveSearchFilterOnFailure);
    }

    pub.updateSearchName = function (tenantsSavedSearchesId, savedSearchName, updateSearchNameOnSuccess, updateSearchNameOnFailure) {
        var message = {
            TenantSavedSearchId: tenantsSavedSearchesId,
            SearchLabel: savedSearchName
        };
        ajax("UpdateSearchLabel", message, updateSearchNameOnSuccess, updateSearchNameOnFailure);
    }

    // Action to get all the tenant favorites count
    pub.getTenantFavoritesCount = function (getTenantFavoritesCountSuccess, getTenantFavoritesCountFailure) {
        var message = {

        }
        ajax("GetTenantsTotalFavoriteCount", message, getTenantFavoritesCountSuccess, getTenantFavoritesCountFailure);
    }

    pub.updateLeaseTerms = function (datas, updateSearchTermsOnSuccess, updateSearchTermsOnFailure) {
        const promises = datas.map(function ({
            propertyGuid,
            monthlyRent,
            securityDeposit,
            heatingFuelPaidBy,
            cookingFuelPaidBy,
            coolingPaidBy,
            sewerPaidBy,
            waterPaidBy,
            hotWaterPaidBy,
            electricPaidBy,
            trashPickupPaidBy,
            lawnPaidBy,
            pestPaidBy
        }) {
            var message = {
                propertyGuid,
                monthlyRent,
                securityDeposit,
                heatingFuelPaidBy,
                cookingFuelPaidBy,
                coolingPaidBy,
                sewerPaidBy,
                waterPaidBy,
                hotWaterPaidBy,
                electricPaidBy,
                trashPickupPaidBy,
                lawnPaidBy,
                pestPaidBy
            };
            return new Promise(function (resolve, reject) { return ajax("UpdateLeaseTerms", message, resolve, reject, 'json', true, true) });
        })
        Promise.all(promises).then(updateSearchTermsOnSuccess).catch(updateSearchTermsOnFailure);
    }

    pub.GetLeaseStatusFromPropertyGuid = function (propertyUnitGuids, saveLanloardFavouriteOnSuccess, saveLanloardFavouriteOnFailure) {
        const promises = propertyUnitGuids.map(function (propertyUnitGuid) {
            var message =
            {
                propertyUnitGuid
            };
            return new Promise(function (resolve, reject) { return ajax("GetLeaseStatusFromPropertyGuid", message, resolve, reject, 'json', true, true) });
        })
        Promise.all(promises).then(saveLanloardFavouriteOnSuccess).catch(saveLanloardFavouriteOnFailure);
    }
    // action for favourites
    pub.saveLandlordFavourite = function (IsFavoriteLandlord, landlordUserId, saveLanloardFavouriteOnSuccess, saveLanloardFavouriteOnFailure, clickSource) {
        var message =
        {
            LandlordUserId: landlordUserId,
            IsFavoriteLandlord: IsFavoriteLandlord
        };
        ajax("SaveTenantsFavoriteLandlords", message, saveLanloardFavouriteOnSuccess, saveLanloardFavouriteOnFailure);

        // Must negate parameter because false means "is favorite" and true means "is favorite".  Stored procedure negates value.
        var isFavorite = !IsFavoriteLandlord;
        ahEvent.landlordMarkedAsFavorite (landlordUserId, isFavorite, clickSource);
    }
    // action for saving listing contact info
    pub.saveLandlordListingContact = function (userId, firstName, lastName, email, phoneNumber, title, saveLandlordListingContactOnSuccess, saveLandlordListingContactOnFailure) {
        var message =
        {
            UserId: userId,
            FirstName: firstName,
            LastName: lastName,
            Email: email,
            PhoneNumber: phoneNumber,
            Title: title
        };
        ajaxrw("SaveLandlordListingContact", message, saveLandlordListingContactOnSuccess, saveLandlordListingContactOnFailure);
    }
    // Action for getting Landlord favourites for tanents
    pub.getTenantsFavorites = function (communityId, landlordUserId, getTenantsFavoritesOnSuccess, getTenantsFavoritesOnFailure) {
        var message = {
            CommunityId: communityId,
            LandlordUserId: landlordUserId
        }
        ajax("GetTenantsFavoritesForDetails", message, getTenantsFavoritesOnSuccess, getTenantsFavoritesOnFailure);
    }

    // action for sending reset password email
    // returns:
    // bool success
    // bool emailNotExist - give email doesn't exist in system message if true
    pub.sendResetPasswordEmail = function (userName, userType, redirectUrl, sendResetPasswordEmailOnSuccess, sendResetPasswordEmailOnFailure) {
        var message =
        {
            userName: userName,
            userType: userType,
            redirectUrl: redirectUrl
        };
        ajaxUnauthenticated("SendResetPasswordEmail", message, sendResetPasswordEmailOnSuccess, sendResetPasswordEmailOnFailure);
    }

    // action for reset password
    // returns:
    // bool success
    // failed reasons: expired token, consumed token, or token doesn't exist
    pub.resetPassword = function (token, newPassword, resetPasswordOnSuccess, resetPasswordOnFailure) {
        var message =
        {
            token: token,
            newPassword: newPassword
        };
        ajaxUnauthenticated("ResetPassword", message, resetPasswordOnSuccess, resetPasswordOnFailure);
    }

    pub.sendForgotUsernameEmail = function (userName, renterRedirect, ownerRedirect, sendForgotUsernameEmailOnSuccess, sendForgotUsernameEmailOnFailure) {
        var message =
        {
            email: userName,
            renterRedirect: renterRedirect,
            ownerRedirect: ownerRedirect
        };
        ajaxUnauthenticated("SendForgotUserNameEmail", message, sendForgotUsernameEmailOnSuccess, sendForgotUsernameEmailOnFailure);
    }

    pub.sendDirectInquiryMessage = function (isPremiumOwner, communityId, communityAddress, listingStatus, email, phone, firstName, lastName, message, moveInDate, quickMatchRegistration, sendDirectInquiryMessageOnSuccess, sendDirectInquiryMessageOnFailure) {
        ahEvent.on_ah_listing_ownerContactedByTenant
            (communityId, email, isPremiumOwner, listingStatus, phone, moveInDate, quickMatchRegistration, firstName, lastName, message);

        var message =
        {
            email: email,
            phone: phone,
            firstName: firstName,
            lastName: lastName,
            message: message,

            moveInDate: moveInDate,
            quickMatchRegistration: quickMatchRegistration,

            communityId: communityId,
            isPremiumOwner: isPremiumOwner,
            communityAddress: communityAddress,
            listingStatus: listingStatus
        };
        ajax("SendDirectInquiryMessage", message, sendDirectInquiryMessageOnSuccess, sendDirectInquiryMessageOnFailure);
    }

    pub.getOwnerPremiumData = function (onSuccess, onFailure) {
        var message = {};
        ajax("GetOwnerPremiumData", message, onSuccess, onFailure);
    };

    pub.sendInviteApplicantMessage = function (applicantName, emailAddress, phoneNumber, noteForApplicant, contactOption, address, link, sendInviteApplicantMessageOnSuccess, sendInviteApplicantMessageOnFailure) {
        var message =
        {
            applicantName: applicantName,
            emailAddress: emailAddress,
            phoneNumber: phoneNumber,
            noteForApplicant: noteForApplicant,
            contactOption: contactOption,
            address: address,
            link: link
        };

        ajax("SendInviteApplicantMessage", message, sendInviteApplicantMessageOnSuccess, sendInviteApplicantMessageOnFailure);
    }

    pub.saveQuickMatchInformation = function (hasVoucher, hasPets, accessibilityNeeds, SaveQuickMatchInformationOnSuccess, SaveQuickMatchInformationOnFailure) {
        var message =
        {
            hasVoucher: hasVoucher,
            hasPets: hasPets,
            accessibilityNeeds: accessibilityNeeds
        };
        ajax("SaveQuickMatchInformation", message, SaveQuickMatchInformationOnSuccess, SaveQuickMatchInformationOnFailure);
    }

    pub.getHaDashboardRedirect = function (userName, getHaDashboardRedirectOnSuccess, getHaDashboardRedirectOnFailure) {
        var message =
        {
            userName: userName
        };
        ajaxUnauthenticated("GetHaDashboardRedirect", message, getHaDashboardRedirectOnSuccess, getHaDashboardRedirectOnFailure);
    }

    pub.getTenatnsAllSearches = function (getTenatnsAllSearchesOnSuccess, getTenatnsAllSearchesOnFailure) {
        var message =
        {

        };
        ajax("GetTenatnsAllSearches", message, getTenatnsAllSearchesOnSuccess, getTenatnsAllSearchesOnFailure);
    }

    pub.GetAllHa = function (GetAllHaOnSuccess, GetAllHaOnFailure) {
        var message;
        ajax("GetAllHa", message, GetAllHaOnSuccess, GetAllHaOnFailure);
    }

    pub.GetLocationSuggestion = function (prefix, GetLocationSuggestionOnSuccess, GetLocationSuggestionOnFailure) {
        var message =
        {
            Prefix: prefix
        };
        ajax("GetLocationSuggestion", message, GetLocationSuggestionOnSuccess, GetLocationSuggestionOnFailure);
    }

    pub.GetFilteredHa = function (filter, GetFilteredHaOnSuccess, GetFilteredHaOnFailure) {
        var message =
        {
            Filter: filter
        };
        ajax("GetFilteredHa", message, GetFilteredHaOnSuccess, GetFilteredHaOnFailure);
    }

    // get translation synchronously
    pub.getLocalizationContent = function (regionId, getLocalizationContentOnSuccess, getLocalizationContentOnFailure) {
        var message =
        {
            regionId: regionId
        };
        ajax("GetLocalizationContent", message, getLocalizationContentOnSuccess, getLocalizationContentOnFailure, "json", false);
    }

    pub.updateApplicationForm = function (appForm, currentStep, saveAsWorkInProgress, appCompleted,
        formInstanceId, haId, isIncompleteFormSubmitted, waitlistId, updateApplicationFormOnSuccess,
        updateApplicationFormOnFailure, updateApplicationReceiveDate, newApplicationReceiveDate) {
        var message =
        {
            appForm: appForm,
            saveAsWorkInProgress: saveAsWorkInProgress,
            appCompleted: appCompleted,
            formInstanceId: formInstanceId,
            haId: haId,
            isIncompleteFormSubmitted: isIncompleteFormSubmitted,
            waitlistId: waitlistId,
            updateApplicationReceiveDate: updateApplicationReceiveDate,
            newApplicationReceiveDate: newApplicationReceiveDate
        };
        $.ajax
            ({
                type: "post",
                url: "/v4/AjaxRWHandler?message=UpdateApplicationForm",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                data: JSON.stringify(message),
                currentStep: currentStep,
                success: updateApplicationFormOnSuccess,
                error: updateApplicationFormOnFailure
            });
    }

    pub.isSsnExists = function (ssn, formInstanceId, isSsnExistsOnsuccess, isSsnExistsOnFailure) {
        var message =
        {
            Ssn: ssn,
            FormInstanceId: formInstanceId
        };
        ajax("IsSsnExists", message, isSsnExistsOnsuccess, isSsnExistsOnFailure);
    }
    pub.isAlienIdExists = function (alienID, formInstanceId, isAlienIdExistsOnsuccess, isAlienIdExistsOnFailure) {
        var message =
        {
            AlienId: alienID,
            FormInstanceId: formInstanceId
        };
        ajax("IsAlienIdExists", message, isAlienIdExistsOnsuccess, isAlienIdExistsOnFailure);
    }
    pub.getApplicationForm = function (formInstanceId, version, getApplicationFormOnSuccess, getApplicationFormOnFailure) {
        var message =
        {
            formInstanceId: formInstanceId,
            version: version
        };
        ajaxrw("GetApplicationForm", message, getApplicationFormOnSuccess, getApplicationFormOnFailure);
    }

    pub.getApplicationFormNotLoggedIn = function (formInstanceId, getApplicationFormOnSuccess, getApplicationFormOnFailure) {
        var message =
        {
            formInstanceId: formInstanceId
        };
        ajaxrw("GetApplicationFormNotLoggedIn", message, getApplicationFormOnSuccess, getApplicationFormOnFailure);
    }

    // exclude null or false, return form applied to the current HA's waitlist
    // exclude true, return form applied to all but the current HA's waitlist
    pub.getFormAppliedWaitlist = function (exclude, getFormAppliedWaitlistOnSuccess, getFormAppliedWaitlistOnFailure) {
        var message =
        {
            exclude: exclude
        };
        ajaxrw("GetFormAppliedWaitlist", message, getFormAppliedWaitlistOnSuccess, getFormAppliedWaitlistOnFailure);
    }

    // fmIndex: family member index
    // phoneIndex: phone index
    // both are passed down to OnSuccess function
    pub.verifyPhones = function (inputPhones, fmIndex, phoneIndex, verifyPhonesOnSuccess, verifyPhonesOnFailure) {
        var message =
        {
            inputPhones: inputPhones
        };
        $.ajax
            ({
                type: "post",
                url: "/v4/AjaxHandler?message=VerifyPhones",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                data: JSON.stringify(message),
                fmIndex: fmIndex,
                phoneIndex: phoneIndex,
                success: verifyPhonesOnSuccess,
                error: verifyPhonesOnFailure
            });
    }

    // fmIndex: family member index
    // emailIndex: email index
    // both are passed down to OnSuccess function
    pub.verifyEmails = function (inputEmails, fmIndex, emailIndex, verifyEmailsOnSuccess, verifyEmailsOnFailure) {
        var message =
        {
            inputEmails: inputEmails
        };
        $.ajax
            ({
                type: "post",
                url: "/v4/AjaxHandler?message=VerifyEmails",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                data: JSON.stringify(message),
                fmIndex: fmIndex,
                emailIndex: emailIndex,
                success: verifyEmailsOnSuccess,
                error: verifyEmailsOnFailure
            });
    }

    // addrIndex: address index, passed down to OnSuccess function
    pub.verifyAddresses = function (inputAddresses, verifyAddressesOnSuccess, verifyAddressesOnFailure) {
        var message =
        {
            SmartyStreetsInputAddresses: inputAddresses
        };
        $.ajax
            ({
                type: "post",
                url: "/v4/AjaxHandler?message=VerifyAddresses",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                data: JSON.stringify(message),
                success: verifyAddressesOnSuccess,
                error: verifyAddressesOnFailure
            });
    }

    pub.isZipCodeValid = function (addresszip, IsZipCodeValidOnSuccess, IsZipCodeValidOnFailure)
    {

        var message =
        {
            ZipCode: addresszip
        };
        $.ajax
            ({
                type: "post",
                url: "/v4/AjaxHandler?message=IsZipCodeValid",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                data: JSON.stringify(message),
                success: IsZipCodeValidOnSuccess,
                error: IsZipCodeValidOnFailure
            });
    }

    // fmIndex: family member index, pass down to OnSuccess function
    pub.generateTempId = function (fmIndex, generateTempIdOnSuccess, generateTempIdOnFailure) {
        var message = {};
        $.ajax
            ({
                type: "post",
                url: "/v4/AjaxHandler?message=GenerateTempId",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                data: JSON.stringify(message),
                fmIndex: fmIndex,
                success: generateTempIdOnSuccess,
                error: generateTempIdOnFailure
            });
    }

    pub.getHaApplicationNotes = function (waitlistId, voucherApplicationIds, getHaApplicationNotesOnSuccess, getHaApplicationNotesOnFailure) {
        var message = {
            voucherApplicationIds: voucherApplicationIds,
            waitlistId: waitlistId
        };
        ajaxrw("GetHaApplicationNotes", message, getHaApplicationNotesOnSuccess, getHaApplicationNotesOnFailure);
    }


    pub.saveHaApplicationNotes = function (note, voucherApplicationIds, saveHaApplicationNotesOnSuccess, saveHaApplicationNotesOnFailure) {
        var message =
        {
            text: note,
            voucherApplicationIds: voucherApplicationIds
        };
        ajaxrw("SaveHaApplicationNotes", message, saveHaApplicationNotesOnSuccess, saveHaApplicationNotesOnFailure);
    }

    pub.getChangeLog = function (formInstanceId, waitlistId, getChangeLogOnSuccess, getChangeLogOnFailure) {
        var message =
        {
            formInstanceId: formInstanceId,
            waitlistId: waitlistId
        };
        ajaxrw("GetChangeLog", message, getChangeLogOnSuccess, getChangeLogOnFailure);
    }

    pub.getWaitlistCreateDate = function (waitlistId, getWaitlistCreateDateOnsuccess, getWaitlistCreateDateOnFailure) {
        var message =
        {
            waitlistId: waitlistId, //appFormModel.domain.haOnly.waitlistId(),
            startingVersion: 1,
            ascending: false,
            maxNumberOfVersions: 1
        };
        ajax("GetWaitlistVersions", message, getWaitlistCreateDateOnsuccess, getWaitlistCreateDateOnFailure);
    };

    pub.getVoucherApplicationById = function (voucherApplicationId, getVoucherApplicationByIdOnSuccess, getVoucherApplicationByIdOnFailure) {
        var message =
        {
            voucherApplicationId: voucherApplicationId
        };
        ajax("GetVoucherApplicationById", message, getVoucherApplicationByIdOnSuccess, getVoucherApplicationByIdOnFailure);
    }

    pub.getVoucherApplicantByFormInstanceId = function (formInstanceId, getVoucherApplicantByFormInstanceIdOnSuccess, getVoucherApplicantByFormInstanceIdOnFailure) {
        var message =
        {
            formInstanceId: formInstanceId
        };
        ajax("GetVoucherApplicantByFormInstanceId", message, getVoucherApplicantByFormInstanceIdOnSuccess, getVoucherApplicantByFormInstanceIdOnFailure);
    }

    pub.updateVoucherApplicationReceivedDate = function (voucherApplicationId, receivedDate, updateVoucherApplicationReceivedDateOnSuccess, updateVoucherApplicationReceivedDateOnFailure, async) {
        var message =
        {
            voucherApplicationId: voucherApplicationId,
            newApplicationReceivedDate: receivedDate
        };
        ajax("UpdateVoucherApplicationReceivedDate", message, updateVoucherApplicationReceivedDateOnSuccess, updateVoucherApplicationReceivedDateOnFailure, async);
    }

    pub.getApplicationType = function (waitlistId, voucherApplicationId, formInstanceId, getApplicationTypeOnSuccess, getApplicationTypeOnFailure) {
        var message =
        {
            waitlistId: waitlistId,
            voucherApplicationId: voucherApplicationId,
            formInstanceId: formInstanceId
        };
        ajax("GetApplicationType", message, getApplicationTypeOnSuccess, getApplicationTypeOnFailure);
    }

    pub.getLocationByIPAddress = function (getLocationByIPAddresseOnSuccess, getLocationByIPAddressOnFailure) {
        var message;
        ajaxUnauthenticated("GetLocationByIPAddress", message, getLocationByIPAddresseOnSuccess, getLocationByIPAddressOnFailure);
    }

    pub.getRecommendedProperties = function (city, county, state, minCount, count, getRecommendedPropertiesOnSuccess, getRecommendedPropertiesOnFailure) {
        var message =
        {
            city: city,
            county: county,
            state: state,
            mincount: minCount,
            pageSize: count
        }
        ajaxUnauthenticated("GetRecommendedProperties", message, getRecommendedPropertiesOnSuccess, getRecommendedPropertiesOnFailure);
    }

    pub.getLocationByLatLong = function (latitude, longitude, getLocationByLatLongOnSuccess, getLocationByLatLongOnFailure) {
        var message =
        {
            latitude: latitude,
            longitude: longitude,
        }
        ajaxUnauthenticated("GetLocationByLatLong", message, getLocationByLatLongOnSuccess, getLocationByLatLongOnFailure);
    }

    pub.getNearByZipCodesByLatLong = function (latitude, longitude, getNearByZipCodesByLatLongOnSuccess, getNearByZipCodesByLatLongOnFailure) {
        var message =
        {
            latitude: latitude,
            longitude: longitude,
        }
        ajaxUnauthenticated("GetNearByZipCodesByLatLong", message, getNearByZipCodesByLatLongOnSuccess, getNearByZipCodesByLatLongOnFailure);
    }

    /* This method is also used in 'js/rentalDetail.js' and 'JS/results.js' files which are not in use anywhere in the project.
     *  So new parameter changes are not adding to those files.
      */
    pub.getClosestHa = function (latitude, longitude, stateCode, city, getClosestHaOnSuccess, getClosestHaOnFailure) {
        var message =
        {
            locationLatitude: latitude,
            locationLongitude: longitude,
            locationStateCode: stateCode,
            locationCity: city
        }
        ajaxUnauthenticated("GetClosestHa", message, getClosestHaOnSuccess, getClosestHaOnFailure);
    }

    //onlineApplication: true/false
    //waitlistStatus: ["Open", "Closed", "OpeningSoon", "Unknown"]
    pub.getHaResults = function (city, county, zip, stateCode, latitude, longitude, pageSize, pageNumber, waitlistStatus, onlineApplication, includeAppPool, SoryByOption, getHaResultsOnSuccess, getHaResultsOnFailure) {
        var searchAddress = {
            city: city,
            county: county,
            zip: zip,
            state: stateCode,
            accuracy: 'Unknown',
            latitude: latitude,
            longitude: longitude
        }

        var searchFilter = {
            waitlistStatus: waitlistStatus,
            onlineApplication: onlineApplication
        }

        var message =
        {
            searchAddress: searchAddress,
            searchFilter: searchFilter,
            includeAppPool: includeAppPool,
            pageNumber: pageNumber,
            pageSize: pageSize,
            orderByExpression: SoryByOption
        }

        ajaxUnauthenticated("GetHaResults", message, getHaResultsOnSuccess, getHaResultsOnFailure);
    }

    pub.getSearchAddress = function (searchString, getSearchAddressOnSuccess, getSearchAddressOnFailure) {
        var message =
        {
            searchString: searchString
        }
        ajaxUnauthenticated("GetSearchAddress", message, getSearchAddressOnSuccess, getSearchAddressOnFailure);
    }

    pub.getLocationAutocompleteSuggestions = function (searchString, getLocationAutocompleteSuggestionsOnSuccess, getLocationAutocompleteSuggestionsOnFailure) {
        var message =
        {
            searchString: searchString
        }
        ajaxUnauthenticated("GetLocationAutocompleteSuggestions", message, getLocationAutocompleteSuggestionsOnSuccess, getLocationAutocompleteSuggestionsOnFailure);
    }

    pub.checkIsFavoriteProperty = function (propertyIds, checkIsFavoritePropertyOnSuccess, checkIsFavoritePropertyOnFailure) {
        var message =
        {
            propertyIds: propertyIds
        }
        ajax("IsFavoriteProperty", message, checkIsFavoritePropertyOnSuccess, checkIsFavoritePropertyOnFailure);
    }

    pub.getHaDetails = function (haId, getHaDetailsOnSuccess, getHaDetailsOnFailure) {
        var message =
        {
            haId: haId
        }
        ajaxUnauthenticated("GetHaDetails", message, getHaDetailsOnSuccess, getHaDetailsOnFailure);
    }

    pub.updateEmail = function (email, updateUserName, redirectUrl, onSuccess, onFailure) {
        var message =
        {
            email: email,
            redirectUrl: redirectUrl,
            updateUserName: updateUserName
        }
        ajaxrw("UpdateEmail", message, onSuccess, onFailure);
    }

    pub.updateTenantPhone = function (phone, updateTenantPhoneOnSuccess, updateTenantPhoneOnFailure) {
        var message =
        {
            phone: phone
        }
        ajax("UpdateTenantPhone", message, updateTenantPhoneOnSuccess, updateTenantPhoneOnFailure);
    }
    pub.getUser = function (async, getUserOnSuccess, getUserOnFailure) {
        var message =
        {
        };
        ajax("GetUser", message, getUserOnSuccess, getUserOnFailure, null, async);
    }
    pub.getUserBellNotifications = function (onSuccess, onFailure) {
        var message = {};
        ajax("GetUserBellNotifications", message, onSuccess, onFailure);
    }
    pub.getWaitlistAlertsForUser = function (onSuccess, onFailure) {
        var message = {};
        ajax("GetWaitlistAlertsForUser", message, onSuccess, onFailure);
    }
    pub.updateWaitlistAlertsForUser = function (waitlistAlertLogId, onSuccess, onFailure) {
        var message = {
            waitlistAlertLogId: waitlistAlertLogId
        };
        ajax("UpdateWaitlistAlertsForUser", message, onSuccess, onFailure);
    }
    pub.watchUserBellNotification = function (notificationId, onSuccess, onFailure) {
        var message = {
            notificationId: notificationId
        };
        ajax("WatchUserBellNotification", message, onSuccess, onFailure);
    }
    pub.resendConfirmationEmail = function (redirectUrl, onSuccess, onFailure) {
        var message =
        {
            redirectUrl: redirectUrl
        };
        ajax("ResendConfirmationEmail", message, onSuccess, onFailure);
    }
    pub.setupTenantPassword = function (password, redirectUrl, setupTenantPasswordOnSuccess, setupTenantPasswordOnFailure) {
        var message =
        {
            password: password,
            redirectUrl: redirectUrl
        };
        ajaxrw("SetupTenantPassword", message, setupTenantPasswordOnSuccess, setupTenantPasswordOnFailure);
    }
    pub.logout = function (logOutFromNonsecuredAccount, logoutOnSuccess, logoutOnFailure) {
        var message =
        {
            logOutFromNonsecuredAccount: logOutFromNonsecuredAccount
        };
        ajaxrw("Logout", message, logoutOnSuccess, logoutOnFailure);
    }

    pub.saveTenantViewedLandingPage = function (haId, saveTenantViewedLandingPageOnSuccess, saveTenantViewedLandingPageOnFailure) {
        var message =
        {
            haId: haId
        };
        ajax("SaveTenantViewedLandingPage", message, saveTenantViewedLandingPageOnSuccess, saveTenantViewedLandingPageOnFailure);
    }

    pub.isEmailTokenValid = function (token, isEmailTokenValidOnSuccess, isEmailTokenValidOnFailure) {
        var message =
        {
            token: token
        };
        ajaxUnauthenticated("IsEmailTokenValid", message, isEmailTokenValidOnSuccess, isEmailTokenValidOnFailure);
    }

    pub.getWaitlistsByHaId = function (haId, getWaitlistsByHaIdOnSuccess, getWaitlistsByHaIdOnFailure) {
        var message =
        {
            haId: haId
        };
        ajax("GetWaitlistsByHaId", message, getWaitlistsByHaIdOnSuccess, getWaitlistsByHaIdOnFailure);
    }

    pub.getWaitlistsWithApplicationPoolByHaId = function (haId, onSuccess, onFailure) {
        var message =
        {
            haId: haId
        };
        ajax("GetWaitlistsWithApplicationPoolByHaId", message, onSuccess, onFailure);
    }

    pub.pingServer = function () {
        $.ajax
            ({
                type: "get",
                url: "/v4/pages/ping.aspx",
                contentType: "text/html;",
                dataType: "json"
            });
    }

    pub.findWaitlistAppForm = function (ssn, lastName, findWaitlistAppFormOnSuccess, findWaitlistAppFormOnFailure) {
        var message =
        {
            ssn: ssn,
            lastName: lastName
        };
        ajax("FindWaitlistAppForm", message, findWaitlistAppFormOnSuccess, findWaitlistAppFormOnFailure);
    }

    pub.linkTenantToWaitlistAppForm = function (ssn, lastName, roleMatch, waitlistAppId, linkTenantToWaitlistAppFormOnSuccess, linkTenantToWaitlistAppFormOnFailure) {
        var message =
        {
            ssn: ssn,
            lastName: lastName,
            roleMatch: roleMatch,
            formInstanceId: waitlistAppId
        };
        ajax("LinkTenantToFormInstance", message, linkTenantToWaitlistAppFormOnSuccess, linkTenantToWaitlistAppFormOnFailure);
    }

    pub.getEmailTokenRedirect = function (token, emailType, getEmailTokenRedirectOnSuccess, getEmailTokenRedirectOnFailure) {
        var message =
        {
            token: token,
            emailType: emailType
        };
        ajaxUnauthenticated("GetEmailTokenRedirect", message, getEmailTokenRedirectOnSuccess, getEmailTokenRedirectOnFailure);
    }

    pub.saveTenantPersonalInfo = function (firstName, lastName, email, phone, emailUrlRedirect, saveTenantPersonalInfoOnSuccess, saveTenantPersonalInfoOnFailure) {
        var message =
        {
            firstName: firstName,
            lastName: lastName,
            email: email,
            phone: phone,
            emailUrlRedirect: emailUrlRedirect
        };
        ajaxrw("SaveTenantPersonalInfo", message, saveTenantPersonalInfoOnSuccess, saveTenantPersonalInfoOnFailure);
    }

    pub.saveTenantAdditionalInfo = function (message, saveTenantAdditionalInfoOnSuccess, saveTenantAdditionalInfoOnFailure) {
        ajax("SaveTenantAdditionalInfo", message, saveTenantAdditionalInfoOnSuccess, saveTenantAdditionalInfoOnFailure);
    }

    pub.saveTenantContactPreference = function (emailNewRentals, quickMatch, hasConsentToReceiveAlerts, saveTenantContactPreferenceOnSuccess, saveTenantContactPreferenceOnFailure) {
        var message =
        {
            emailNewRentals: emailNewRentals,
            quickMatch: quickMatch,
            hasConsentToReceiveAlerts: hasConsentToReceiveAlerts,
        };
        ajax("SaveTenantContactPreference", message, saveTenantContactPreferenceOnSuccess, saveTenantContactPreferenceOnFailure);
    }

    pub.saveWaitListSubscribedLocationAndPreferences = function (state, zip, saveWaitListSubscribedLocationOnSuccess, saveWaitListSubscribedLocationOnFailure) {
        var message =
        {
            state: state,
            zip: zip
        };
        ajax("SaveWaitListSubscribedLocationAndPreferences", message, saveWaitListSubscribedLocationOnSuccess, saveWaitListSubscribedLocationOnFailure);
    }

    pub.updatePassword = function (currentPassword, newPassword, onSuccess, onFailure) {
        var message =
        {
            currentPassword: currentPassword,
            newPassword: newPassword
        };
        ajax("UpdatePassword", message, onSuccess, onFailure);
    }

    pub.getHaLogo = function (ha, size, getHaLogoOnSuccess, getHaLogoOnFailure) {
        //size options: 40x40; 75x75; 100x100; 225x113; 263x169
        var message =
        {
            ha: ha,
            size: size
        };
        ajaxUnauthenticated("GetHaLogo", message, getHaLogoOnSuccess, getHaLogoOnFailure);
    }

    pub.getTenantApplications = function (haId, waitlistName, applicationPoolName, isInternal, getTenantApplicationsOnSuccess, getTenantApplicationsOnFailure) {
        var message =
        {
            haId: haId,
            waitlistName: waitlistName,
            applicationPoolName: applicationPoolName,
            isInternal: isInternal
        };
        ajax("GetTenantApplications", message, getTenantApplicationsOnSuccess, getTenantApplicationsOnFailure);
    }

    pub.getLeaseIdsByApplication = function (applicationIds, onSuccess, onFailure) {
        ajax("GetLeaseIdsByApplication", applicationIds, onSuccess, onFailure);
    }

    pub.getRentalPropertyApplications = function (onSuccess, onFailure) {
        var message =
        {
            statusCodes: []
        };
        ajax("GetRentalPropertyApplications", message, onSuccess, onFailure);
    }

    pub.getLandlordApplications = function (propertyUnitGuid, search, statusCodes, voucherStatus, onSuccess, onFailure) {
        var message =
        {
            unitGuid: propertyUnitGuid,
            search: search,
            statusCodes: statusCodes,
            voucherStatus: voucherStatus,
        };
        ajax("GetUnitLandlordApplications", message, onSuccess, onFailure);
    }

    pub.getApplicationStatuses = function (onSuccess, onFailure) {
        ajax("GetApplicationStatuses", undefined, onSuccess, onFailure);
    }
    pub.getWaitlistStatusForTenantApplications = function (tenantUserId, onSuccess, onFailure) {
        var message =
        {
            tenantUserId: tenantUserId
        };
        ajax("GetWaitlistStatusForTenantApplications", message, onSuccess, onFailure);
    }

    pub.updateLLLearnMorePopUp = function (stopPopupForever, onSuccess, onFailure) {
        var message =
        {
            StopPopupForever: stopPopupForever
        };
        ajaxrw("UpdateLLLearnMorePopUp", message, onSuccess, onFailure);
    }

    pub.getLandlordApplicationsForCommunity = function (communityId, search, statusCodes, voucherStatus, onSuccess, onFailure)
    {
        var message =
        {
            communityId: communityId,
            search: search,
            statusCodes: statusCodes,
            voucherStatus: voucherStatus,
        };
        ajax("GetCommunityDetailsWithAppications", message, onSuccess, onFailure);
    }

    pub.getApplicationDetailsById = function (applicationId, onSuccess, onFailure)
    {
        var message =
        {
            ApplicationId: applicationId
        };
        ajax("GetApplicationDetailsById", message, onSuccess, onFailure);
    }

    pub.addUnitForModel = function (communityId, modelGuid, unit, price, onSuccess, onFailure) {
        var message =
        {
            communityId: communityId,
            modelGuid: modelGuid,
            unit: unit,
            price: price,
        };
        ajax("AddUnitForModel", message, onSuccess, onFailure);
    }

    pub.applyToModelsUnit = function (applicationId, unitGuid, onSuccess, onFailure) {
        var message =
        {
            applicationId: applicationId,
            unitGuid: unitGuid
        };
        ajax("ApplyToModelsUnit", message, onSuccess, onFailure);
    }

    pub.setApplicantsNotes = function (applicantUserIds, text, onSuccess, onFailure) {
        var message = {
            applicantUserIds: applicantUserIds,
            text: text
        };
        ajax("SetApplicantsNotes", message, onSuccess, onFailure);
    }

    pub.changeApplicationsStatusByIds = function (isOwner, applicationsIds, statusCode, onSuccess, onFailure) {
        var message = {
            isOwner: isOwner,
            applicationsIds: applicationsIds,
            statusCode: statusCode
        };
        ajax("ChangeApplicationsStatusByIds", message, onSuccess, onFailure);
    }

    pub.applyToRentalProperty = function (unitGuid, onSuccess, onFailure) {
        var message =
        {
            status: 2, //submitted
            propertyUnitGuid: unitGuid
        };
        ajax("SetRentalPropertyApplications", message, onSuccess, onFailure);
    }

    pub.applyToProperty = function (modelGuid, unitGuid, onSuccess, onFailure) {
        var message =
        {
            modelGuid: modelGuid,
            unitGuid: unitGuid
        };
        ajax("ApplyToProperty", message, onSuccess, onFailure);
    }

    pub.withdrawRentalPropertyApplicationById = function (applicationId, currentStatus, onSuccess, onFailure) {
        var message =
        {
            applicationId: applicationId,
            currentStatus: currentStatus
        };
        ajax("WithdrawRentalPropertyApplicationById", message, onSuccess, onFailure);
    }

    pub.reapplyRentalPropertyApplication = function (propertyUnitGuid, onSuccess, onFailure) {
        var message =
        {
            propertyUnitGuid: propertyUnitGuid,
        };
        ajax("ReapplyRentalPropertyApplication", message, onSuccess, onFailure);
    }

    pub.reapplyToProperty = function (applicationId, onSuccess, onFailure) {
        var message =
        {
            applicationID: applicationId,
        };
        ajax("ReapplyToProperty", message, onSuccess, onFailure);
    }

    pub.applyToModelRentalProperty = function (modelGuid, onSuccess, onFailure) {
        var message =
        {
            status: 2, //submitted
            modelGuid: modelGuid
        };
        ajax("SetRentalPropertyApplications", message, onSuccess, onFailure);
    }

    pub.withdrawModelRentalPropertyApplication = function (modelGuid, onSuccess, onFailure) {
        var message =
        {
            modelGuid: modelGuid
        };
        ajax("WithdrawRentalPropertyApplication", message, onSuccess, onFailure);
    }

    pub.reapplyModelRentalPropertyApplication = function (modelGuid, onSuccess, onFailure) {
        var message =
        {
            modelId: modelGuid
        };
        ajax("ReapplyRentalPropertyApplication", message, onSuccess, onFailure);
    }

    pub.getHaDefaultTimeZone = function (haId, getHaDefaultTimeZoneOnSuccess, getHaDefaultTimeZoneOnFailure, async) {
        var message =
        {
            haId: haId
        };
        ajaxUnauthenticated("GetHaDefaultTimeZone", message, getHaDefaultTimeZoneOnSuccess, getHaDefaultTimeZoneOnFailure, null, async);
    }

    pub.getHaInfoByWaitinglistId = function (waitlistId, getHaInfoByWaitinglistIdOnSuccess, getHaInfoByWaitinglistIdOnFailure, async) {
        var message =
        {
            waitlistId: waitlistId
        };
        ajaxUnauthenticated("GetHaInfoByWaitinglistId", message, getHaInfoByWaitinglistIdOnSuccess, getHaInfoByWaitinglistIdOnFailure, null, async);
    }

    //
    pub.getHaEmailSetting = function (waitlistId, getHaEmailSettingOnSuccess, getHaEmailSettingOnFailure, async) {
        var message =
        {
            waitlistId: waitlistId
        };
        ajax("GetHaEmailSetting", message, getHaEmailSettingOnSuccess, getHaEmailSettingOnFailure, null, async);
    }

    pub.getHaPhoneSetting = function (waitlistId, getHaPhoneSettingOnSuccess, getHaPhoneSettingOnFailure, async) {
        var message =
        {
            waitlistId: waitlistId
        };
        ajax("GetHaPhoneSetting", message, getHaPhoneSettingOnSuccess, getHaPhoneSettingOnFailure, null, async);
    }

    pub.getShowConfirmationReceiptChanges = function (getShowConfirmationReceiptChangesOnSuccess, getShowConfirmationReceiptChangesOnFailure) {
        var message = {};
        ajax("GetShowConfirmationReceiptChanges", message, getShowConfirmationReceiptChangesOnSuccess, getShowConfirmationReceiptChangesOnFailure);
    }

    pub.getShowIncomeCalculations = function (getShowIncomeCalculationsOnSuccess, getShowIncomeCalculationsOnFailure) {
        var message = {};
        ajax("GetShowIncomeCalculations", message, getShowIncomeCalculationsOnSuccess, getShowIncomeCalculationsOnFailure);
    }

    pub.getHaUser = function (getHaUserOnSuccess, getHaUserOnFailure) {
        var message = {};
        ajax("GetHaUser", message, getHaUserOnSuccess, getHaUserOnFailure);
    }

    pub.getUnauthenticatedUserNavigation = function (getUnauthenticatedUserNavigationOnSuccess, getUnauthenticatedUserNavigationOnFailure) {
        var message = {};
        ajaxUnauthenticated("GetUnauthenticatedUserNavigation", message, getUnauthenticatedUserNavigationOnSuccess, getUnauthenticatedUserNavigationOnFailure);
    }

    pub.getTenantNavigation = function (getTenantNavigationOnSuccess, getTenantNavigationOnFailure) {
        var message = {};
        ajax("GetTenantNavigation", message, getTenantNavigationOnSuccess, getTenantNavigationOnFailure);
    }

    pub.getLandlordNavigation = function (getLandlordNavigationOnSuccess, getLandlordNavigationOnFailure) {
        var message = {};
        ajax("GetLandlordNavigation", message, getLandlordNavigationOnSuccess, getLandlordNavigationOnFailure);
    }

    pub.getAdvertiserNavigation = function (getAdvertiserNavigationOnSuccess, getAdvertiserNavigationOnFailure) {
        var message = {};
        ajax("GetAdvertiserNavigation", message, getAdvertiserNavigationOnSuccess, getAdvertiserNavigationOnFailure);
    }

    pub.getTenantFavorites = function (getTenantFavoritesOnSuccess, getTenantFavoritesOnFailure) {
        var message = {};
        ajax("GetTenantsFavorites", message, getTenantFavoritesOnSuccess, getTenantFavoritesOnFailure);
    }

    pub.getPricingDetails = function (upgradePath, getPricingDetailsOnSuccess, getPricingDetailsOnFailure) {
        var message = {
            UpgradePath: upgradePath
        };
        ajax("GetPricingDetails", message, getPricingDetailsOnSuccess, getPricingDetailsOnFailure);
    }

    pub.getCheckoutDetails = function (upgradePath, prodId, promoCode, getCheckoutDetailsOnSuccess, getCheckoutDetailsOnFailure) {
        var message = {
            UpgradePath: upgradePath,
            ProdId: prodId,
            PromoCode: promoCode
        };
        ajax("GetCheckoutDetails", message, getCheckoutDetailsOnSuccess, getCheckoutDetailsOnFailure);
    }

    pub.getSimpleCheckoutDetails = function (upgradePath, prodId, promoCode, getCheckoutDetailsOnSuccess, getCheckoutDetailsOnFailure) {
        var message = {
            UpgradePath: upgradePath,
            ProdId: prodId,
            PromoCode: promoCode
        };
        ajax("GetSimpleCheckoutDetails", message, getCheckoutDetailsOnSuccess, getCheckoutDetailsOnFailure);
    }

    pub.processPayment = function (paymentMode, productId, billingInfo, paymentInfo, processPaymentOnSuccess, processPaymentOnFailure) {
        var message = null;

        if (billingInfo && paymentInfo) {
            var billingContact = {
                city: billingInfo.city(),
                address1: billingInfo.street(),
                zip: billingInfo.zip(),
                state: billingInfo.selectedState().Code,
                firstName: billingInfo.firstName(),
                lastName: billingInfo.lastName()
            };

            var payment = {
                AccountNumber: paymentInfo.creditCardNumber(),
                ExpirationMonth: paymentInfo.selectedMonth(),
                ExpirationYear: paymentInfo.selectedYear(),
                CVV: paymentInfo.securityCode()
            };

            message = {
                BillingContact: billingContact,
                Card: payment,
                ProductId: productId,
                PaymentMethod: paymentMode
            };
        }
        else {
            message = {
                ProductId: productId,
                PaymentMethod: paymentMode,
                CancelUrl: window.location.href
            };
        }

        if (paymentMode === 'PPL') {
            ajaxrw("ProcessPaypalPayment", message, processPaymentOnSuccess, processPaymentOnFailure);
        }
        // else if (paymentMode === 'apple pay') {
        //  ajax("ProcessApplePayment", message, processPaymentOnSuccess, processPaymentOnFailure);
        //}
        else
            ajaxrw("ProcessPayment", message, processPaymentOnSuccess, processPaymentOnFailure);
        //}

        // Card: paymentInfo,
        //ajax("ProcessPayment", message, processPaymentOnSuccess, processPaymentOnFailure);
    }

    //pub.processPayment = function (paymentMode, productId, processPaymentOnSuccess, processPaymentOnFailure)
    //{
    //    var message = {
    //        ProductId: productId,
    //        PaymentMethod: paymentMode,
    //        CancelUrl: window.location.href
    //    };

    //    if (paymentMode === 'PPL') {
    //        ajax("ProcessPaypalPayment", message, processPaymentOnSuccess, processPaymentOnFailure);
    //    }
    //    else {
    //        ajax("ProcessPayment", message, processPaymentOnSuccess, processPaymentOnFailure);
    //    }
    //}

    pub.getPaypalToken = function (amount, cancelUrl, productId, getTokenOnSuccess, getTokenOnFailure) {
        var message = {
            ProductId: productId,
            CancelUrl: cancelUrl,
            Amount: amount
        };

        ajax("GetPaypalToken", message, getTokenOnSuccess, getTokenOnFailure, "json", false);
    }

    pub.getApplePayMerchantIdentifier = function (getApplePayMerchantIdentifierOnSuccess, getApplePayMerchantIdentifierOnFailure) {
        var message = {};

        ajax("GetApplePayMerchantIdentifier", message, getApplePayMerchantIdentifierOnSuccess, getApplePayMerchantIdentifierOnFailure, "json", false);
    }

    pub.getApplePayMerchantSession = function (validationUrl, getApplePayMerchantSessionOnSuccess, getApplePayMerchantSessionOnFailure) {
        var message = {
            ValidationUrl: validationUrl
        };

        ajax("GetApplePayMerchantSession", message, getApplePayMerchantSessionOnSuccess, getApplePayMerchantSessionOnFailure, "json", false);
    }

    pub.processApplePayPayment = function (paymentMethod, productId, billingContact, shippingContact, paymentToken, processApplePayPaymentOnSuccess, processApplePayPaymentOnFailure) {
        var message = {
            PaymentMethod: paymentMethod,
            ProductId: productId,
            BillingContact: billingContact,
            ShippingContact: shippingContact,
            Token: paymentToken
        };



        ajaxrw("ProcessApplePayPayment", message, processApplePayPaymentOnSuccess, processApplePayPaymentOnFailure, "json", false);
    }

    pub.ProcessOwnerApplePayPayment = function (paymentMethod, productId, billingContact, shippingContact, paymentToken, processApplePayPaymentOnSuccess, processApplePayPaymentOnFailure) {
        var message = {
            PaymentMethod: paymentMethod,
            ProductId: productId,
            BillingContact: billingContact,
            ShippingContact: shippingContact,
            Token: paymentToken
        };

        ajaxrw("ProcessOwnerApplePayPayment", message, processApplePayPaymentOnSuccess, processApplePayPaymentOnFailure, "json", false);
    }

    //used on simpleCheckout
    //pub.processPaypalPayment = function (paymentMode, productId, processPaymentOnSuccess, processPaymentOnFailure) {
    //    var message = {
    //        ProductId: productId,
    //        PaymentMethod: paymentMode
    //       // IsPPL : true

    //    };
    //    // Card: paymentInfo,
    //    ajax("ProcessPaypalPayment", message, processPaymentOnSuccess, processPaymentOnFailure);
    //}

    pub.getWlHousingHistoryYearCount = function (haId, getWlHousingHistoryYearCountOnSuccess, getWlHousingHistoryYearCountOnFailure) {
        var message =
        {
            haId: haId
        };
        ajax("GetWlHousingHistoryYearCount", message, getWlHousingHistoryYearCountOnSuccess, getWlHousingHistoryYearCountOnFailure);
    }

    pub.getWaitlistById = function (waitlistId, getWorkInProgressVersion, getWaitlistByIdOnSuccess, getWaitlistByIdOnFailure) {
        var message =
        {
            waitlistId: waitlistId,
            getWorkInProgressVersion: getWorkInProgressVersion
        };
        ajax("GetWaitlistById", message, getWaitlistByIdOnSuccess, getWaitlistByIdOnFailure);
    }

    pub.getHasInApplicationPool = function (poolNames, getHasInApplicationPoolOnSuccess, getHasInApplicationPoolOnFailure) {
        var message =
        {
            applicationPoolNames: poolNames
        };
        ajax("GetHasInApplicationPools", message, getHasInApplicationPoolOnSuccess, getHasInApplicationPoolOnFailure);
    }

    pub.getWaitlistsInApplicationPool = function (poolName, includeInternal, getWaitlistsInApplicationPoolOnSuccess, getWaitlistsInApplicationPoolOnFailure) {
        var message =
        {
            applicationPoolName: poolName,
            includeInternal: includeInternal
        };
        ajax("GetWaitlistsInApplicationPool", message, getWaitlistsInApplicationPoolOnSuccess, getWaitlistsInApplicationPoolOnFailure);
    }

    pub.getApplicationPoolIncomeLimit = function (poolCode, incomeLimitCategory, getApplicationPoolIncomeLimitOnSuccess, getApplicationPoolIncomeLimitOnFailure) {
        var message =
        {
            applicationPoolCode: poolCode,
            incomeLimitCategory: incomeLimitCategory
        };
        ajax("GetApplicationPoolIncomeLimit", message, getApplicationPoolIncomeLimitOnSuccess, getApplicationPoolIncomeLimitOnFailure);
    }

    pub.getFormInstanceIdBySsn = function (ssn, getFormInstanceIdBySsnOnSuccess, getFormInstanceIdBySsnOnFailure) {
        var message =
        {
            Ssn: ssn
        };
        ajax("GetFormInstanceIdBySsn", message, getFormInstanceIdBySsnOnSuccess, getFormInstanceIdBySsnOnFailure);
    }

    pub.getFormDetailForSsnLookup = function (waitlistId, formInstanceId, getFormDetailForSsnLookupOnSuccess, getFormDetailForSsnLookupOnFailure) {
        var message =
        {
            waitlistId: waitlistId,
            formInstanceId: formInstanceId
        };
        ajax("GetFormDetailForSsnLookup", message, getFormDetailForSsnLookupOnSuccess, getFormDetailForSsnLookupOnFailure);
    }

    pub.sendSmsConfirmationCodeToOptIn = function (phone, sendSmsConfirmationCodeOnSuccess, sendSmsConfirmationCodeOnFailure) {
        var message =
        {
            contactValue: phone
        };
        ajax("SendSmsConfirmationCode", message, sendSmsConfirmationCodeOnSuccess, sendSmsConfirmationCodeOnFailure);
    }

    pub.verifySmsConfirmationCode = function (confirmationData, verifySmsConfirmationCodeOnSuccess, verifySmsConfirmationCodeOnFailure) {
        var message =
        {
            confirmationCode: confirmationData.confirmationCode,
            contactValue: confirmationData.contactValue
        };
        ajax("VerifySmsConfirmationCode", message, verifySmsConfirmationCodeOnSuccess, verifySmsConfirmationCodeOnFailure);
    }

    pub.getLandlordListings =
        function (status, search, sortBy, pageSize, pageNumber, getLandlordListingsOnSuccess, getLandlordListingsOnFailure) {
            var message =
            {
                status: status,
                search: search,
                sortBy: sortBy,
                pageSize: pageSize,
                pageNumber: pageNumber
            };
            ajax("GetLandlordListings",
                message,
                getLandlordListingsOnSuccess,
                getLandlordListingsOnFailure);
        };

    pub.getLandlordListingsDropdown =
        function (getLandlordListingsDropdownOnSuccess, getLandlordListingsDropdownOnFailure) {
            var message = {};
            ajax("GetLandlordListingsDropdown",
                message,
                getLandlordListingsDropdownOnSuccess,
                getLandlordListingsDropdownOnFailure);
        };

    pub.saveLoggedPropertyView = function (userId,
        guid,
        propertyId,
        saveLoggedPropertyViewOnSuccess,
        saveLoggedPropertyViewOnFailure) {
        var message = {
            UserId: userId,
            GUID: guid,
            PropertyId: propertyId
        };
        $.ajax
            ({
                type: "post",
                url: "/v4/AjaxHandler?message=SaveLoggedPropertyView",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                data: JSON.stringify(message),
                success: saveLoggedPropertyViewOnSuccess,
                error: saveLoggedPropertyViewOnFailure
            });
    };

    pub.saveLoggedCommunityView = function (communityId, saveCommunityViewOnSuccess, saveCommunityViewOnFailure) {
        var message = {
            communityId: communityId
        };
        ajax("SaveLoggedCommunityView", message, saveCommunityViewOnSuccess, saveCommunityViewOnFailure);
    };

    pub.saveLoggedCommunityModelView = function (modelId, saveCommunityModelViewOnSuccess, saveCommunityModelViewOnFailure) {
        var message = {
            modelId: modelId
        };
        ajax("SaveLoggedCommunityModelView", message, saveCommunityModelViewOnSuccess, saveCommunityModelViewOnFailure);
    };

    pub.isWaitlistExistsInMassNehroApplicationPool = function (waitlistId, isWaitlistExistsInMassNehroApplicationPoolOnSuccess, isWaitlistExistsInMassNehroApplicationPoolOnFailure) {
        var message =
        {
            waitlistId: waitlistId
        };
        ajax("IsWaitlistExistsInMassNehroApplicationPool", message, isWaitlistExistsInMassNehroApplicationPoolOnSuccess, isWaitlistExistsInMassNehroApplicationPoolOnFailure);
    }

    pub.getListingHistory =
        function (communityId, getListingHistoryOnSuccess, getListingHistoryOnFailure) {
            var message =
            {
                CommunityId: communityId
            };
            ajaxUnauthenticated("GetListingHistory",
                message,
                getListingHistoryOnSuccess,
                getListingHistoryOnFailure);
        };

    pub.getListingHistoryUnits =
        function (communityChangeLogId, getListingHistoryUnitsOnSuccess, getListingHistoryUnitsOnFailure) {
            var message =
            {
                CommunityChangeLogId: communityChangeLogId
            };
            ajaxUnauthenticated("GetListingUnitHistory",
                message,
                getListingHistoryUnitsOnSuccess,
                getListingHistoryUnitsOnFailure);
        };

    pub.getPropertyViewStats =
        function (communityId, duration, getPropertyViewStatsOnSuccess, getPropertyViewStatsOnFailure) {
            var message =
            {
                CommunityId: communityId,
                Duration: duration
            };
            ajaxUnauthenticated("GetPropertyViewStats",
                message,
                getPropertyViewStatsOnSuccess,
                getPropertyViewStatsOnFailure);
        };

    pub.getCommunityDetailsById = function (communityId, getCommunityDetailsByIdOnSuccess, getCommunityDetailsByIdOnFailure) {
        var message =
        {
            CommunityId: communityId,
        };
        ajaxUnauthenticated("GetCommunityDetailsById", message, getCommunityDetailsByIdOnSuccess, getCommunityDetailsByIdOnFailure);
    };

    pub.getSimilarByCommunityId = function (communityId, getSimilarByCommunityIdOnSuccess, getSimilarByCommunityIdOnFailure) {
        var message =
        {
            CommunityId: communityId,
        };
        ajax("GetSimilarByCommunityId", message, getSimilarByCommunityIdOnSuccess, getSimilarByCommunityIdOnFailure);
    };

    pub.getPropertyAddress =
        function (propertyId, getPropertyAddressOnSuccess, getPropertyAddressOnFailure) {
            var message =
            {
                PropertyId: propertyId
            };
            ajax("GetPropertyAddress",
                message,
                getPropertyAddressOnSuccess,
                getPropertyAddressOnFailure);
        };

    pub.archiveCommunity =
        function (archiveCommunityObject, archiveCommunityOnSuccess, archiveCommunityOnFailure) {
            var message =
            {
                communityId: archiveCommunityObject.communityId,
                listingDeletionReason: archiveCommunityObject.listingDeletionReason,
                propertyRentedFor: archiveCommunityObject.propertyRentedFor,
                receiveGovtAssistance: archiveCommunityObject.receiveGovtAssistance,
                leaseIncentivesIncluded: archiveCommunityObject.leaseIncentivesIncluded,
                otherReason: archiveCommunityObject.otherReason,
                leaseIncentiveOption: archiveCommunityObject.leaseIncentiveOption
            };
            ajax("ArchiveCommunity",
                message,
                archiveCommunityOnSuccess,
                archiveCommunityOnFailure);
        };

    pub.removeCommunity =
        function (communityId, id, removeCommunityOnSuccess, removeCommunityOnFailure) {
            var message =
            {
                communityId: communityId,
                id: id
            };
            ajax("RemoveCommunity",
                message,
                removeCommunityOnSuccess,
                removeCommunityOnFailure);
        };

    /*
     * 	0:  user is not verified and trusted
     *	1:  free landlord can boost
     *	2;  property is not active
     *	3: free membership already has a different property in boost
     *	4: free membership already used his boost credit
     *	5: premium member's current property already in boost
     *	6: premium landlord can boost
     *	7: free membership already has the same property in boost
     */

    pub.checkIfPropertyIsBoostable =
        function (communityId, checkIfPropertyIsBoostableOnSuccess, checkIfPropertyIsBoostableOnFailure) {
            var message =
            {
                CommunityId: communityId
            };
            ajaxUnauthenticated("CheckIfListingIsBoostable",
                message,
                checkIfPropertyIsBoostableOnSuccess,
                checkIfPropertyIsBoostableOnFailure);
        };


    pub.removeProperty =
        function (propertyId, removePropertyOnSuccess, removePropertyOnFailure) {
            var message =
            {
                PropertyId: propertyId
            };
            ajax("RemoveProperty",
                message,
                removePropertyOnSuccess,
                removePropertyOnFailure);
        };

    pub.refreshSessionAjax = function (refreshSessionAjaxOnSuccess, refreshSessionAjaxOnFailure) {
        var message =
        {
        };
        ajaxrw("RefreshSessionAjax", message, refreshSessionAjaxOnSuccess, refreshSessionAjaxOnFailure);
    }


    pub.unlinkAndTerminateFormInstance = function (unlinkAndTerminateFormInstanceOnSuccess, unlinkAndTerminateFormInstanceOnFailure) {
        var message =
        {
        };
        ajaxrw("UnlinkAndTerminateFormInstance", message, unlinkAndTerminateFormInstanceOnSuccess, unlinkAndTerminateFormInstanceOnFailure);
    }


    pub.boostListingToTop =
        function (communityId, boostListingToTopOnSuccess, boostListingToTopOnFailure) {
            var message =
            {
                CommunityId: communityId
            };
            ajaxrw("BoostListingToTop",
                message,
                boostListingToTopOnSuccess,
                boostListingToTopOnFailure);
        };



    pub.getFormInstanceVersions = function (formInstanceId, getFormInstanceVersionsOnSuccess,
        getFormInstanceVersionsOnFailure) {
        var message =
        {
            formInstanceId: formInstanceId
        };
        ajax("GetFormInstanceVersions", message, getFormInstanceVersionsOnSuccess,
            getFormInstanceVersionsOnFailure);
    };

    pub.getIncomeCalculationSummary = function (formInstanceId, version, getIncomeCalculationSummaryOnSuccess, getIncomeCalculationSummaryOnFailure) {
        var message =
        {
            formInstanceId: formInstanceId,
            version: version
        };
        ajax("GetIncomeCalculationSummary", message, getIncomeCalculationSummaryOnSuccess,
            getIncomeCalculationSummaryOnFailure);
    }

    pub.withdrawApplication = function (voucherApplicationId, applicationPoolName, onSuccess, onFailure) {
        var message =
        {
            voucherApplicationId: voucherApplicationId,
            applicationPoolName: applicationPoolName
        };
        ajax("WithdrawApplication", message, onSuccess, onFailure);
    }

    pub.sendOtpForEmailVerification = function (email, sendOtpForEmailVerificationonSuccess, sendOtpForEmailVerificationonFailure) {
        var message =
        {
            email: email
        };
        ajax("SendOtpForEmailVerification", message, sendOtpForEmailVerificationonSuccess, sendOtpForEmailVerificationonFailure);
    }

    pub.validateEmailVerificationOtp = function (email, otp, validateEmailVerificationOtponSuccess, validateEmailVerificationOtponFailure) {
        var message =
        {
            email: email,
            otp: otp
        };
        ajax("ValidateEmailVerificationOtp", message, validateEmailVerificationOtponSuccess, validateEmailVerificationOtponFailure);
    }

    pub.isAnyOfTenantApplicationInTerminalStatus = function (formInstanceId, success, failure) {
        var message =
        {
            formInstanceId: formInstanceId
        };
        ajax("IsAnyOfTenantApplicationInTerminalStatus", message, success, failure);
    }

    pub.isHaFormValidationRequired = function (success, failure) {
        var message = {};
        ajax("IsHaFormValidationRequired", message, success, failure);
    }

    pub.isRentBurdenedFeatureVisible = function (success, failure) {
        var message = {};
        ajax("IsRentBurdenedFeatureVisible", message, success, failure);
    }

    pub.getApplicationPoolByCode = function (poolCodes, onSuccess, onFailure) {
        var message =
        {
            applicationPoolCode: poolCodes
        };
        ajax("GetApplicationPoolByCode", message, onSuccess, onFailure);
    }

    pub.getWaitlistApplicationPool = function (waitlistId, onSuccess, onFailure) {
        var message =
        {
            waitlistId: waitlistId
        };
        ajax("GetWaitlistApplicationPool", message, onSuccess, onFailure);
    }

    pub.calculateIncome = function (appform, formInstanceId, calculateIncomeOnSuccess, calculateIncomeOnFailure) {
        var message =
        {
            appForm: appform,
            formInstanceId: formInstanceId,

        };
        $.ajax
            ({
                type: "post",
                url: "/v4/AjaxHandler?message=CalculateIncome",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                data: JSON.stringify(message),
                success: calculateIncomeOnSuccess,
                error: calculateIncomeOnFailure
            });
    }

    pub.getSearchResultProperties = function (searchResultParameters, getSearchPropertiesListSuccess, getSearchPropertiesListFailure) {
        var message =
        {
            searchParameters: searchResultParameters
        };
        ajax("SearchListings", message, getSearchPropertiesListSuccess, getSearchPropertiesListFailure);
    }

    pub.getSearchResultPropertyCounts = function (searchResultParameters, getSearchPropertiesListSuccess, getSearchPropertiesListFailure) {
        var message =
        {
            searchParameters: searchResultParameters
        };
        ajaxUnauthenticated("GetSearchListingCount", message, getSearchPropertiesListSuccess, getSearchPropertiesListFailure);
    }

    pub.isCommunityInBrandJurisdcition = function (brandId, communityId, onSuccess, onFailure) {
        var message =
        {
            brandId,
            communityId
        };
        ajaxUnauthenticated("IsCommunityInBrandJurisdiction", message, onSuccess, onFailure, null, false);
    }

    pub.getCommunityMaxRangeByLocation = function (searchParameters, getCommunityMaxRangeByLocationOnSuccess, getCommunityMaxRangeByLocationOnFailure) {
        var message =
        {
            state: searchParameters.state,
            county: searchParameters.county,
            city: searchParameters.city,
            zip: searchParameters.zip,
            landlordUserId: searchParameters.landlordUserId,
            maxLatitude: searchParameters.maxLatitude,
            maxLongitude: searchParameters.maxLongitude,
            minLatitude: searchParameters.minLatitude,
            minLongitude: searchParameters.minLongitude
        }
        ajaxUnauthenticated("GetCommunityMaxRangeByLocation", message, getCommunityMaxRangeByLocationOnSuccess, getCommunityMaxRangeByLocationOnFailure);
    }

    pub.getMoreFiltersStatus = function (searchParameters, getMoreFiltersStatusOnSuccess, getMoreFiltersStatusOnFailure) {
        var message =
        {
            state: searchParameters.state,
            county: searchParameters.county,
            city: searchParameters.city,
            zip: searchParameters.zip,
            landlordUserId: searchParameters.landlordUserId,
            maxLatitude: searchParameters.maxLatitude,
            maxLongitude: searchParameters.maxLongitude,
            minLatitude: searchParameters.minLatitude,
            minLongitude: searchParameters.minLongitude
        }
        ajaxUnauthenticated("GetMoreFiltersStatus", message, getMoreFiltersStatusOnSuccess, getMoreFiltersStatusOnFailure);
    }

    pub.getMapAreaListings = function (searchResultParameters, getMapAreaListingsSuccess, getMapAreaListingsFailure) {
        var message =
        {
            searchParameters: searchResultParameters
        };
        ajax("SearchListingsMapArea", message, getMapAreaListingsSuccess, getMapAreaListingsFailure);
    }

    pub.getMapCalloutCommunityList = function (searchResultParameters, getMapCalloutCommunityListSuccess, getMapCalloutCommunityListFailure) {
        var message =
        {
            searchParameters: searchResultParameters
        };
        ajax("SearchListings", message, getMapCalloutCommunityListSuccess, getMapCalloutCommunityListFailure);
    }

    pub.getMapCalloutHAList = function (searchResultParameters, getMapCalloutHAListSuccess, getMapCalloutHAListFailure) {
        var message =
        {
            MaxLatitude: searchResultParameters.maxLatitude,
            MaxLongitude: searchResultParameters.maxLongitude,
            MinLatitude: searchResultParameters.minLatitude,
            MinLongitude: searchResultParameters.minLongitude,
            MaxMarkerToShow: searchResultParameters.maxMarkerToShow
        };
        ajaxUnauthenticated("GetHAFromLatLng", message, getMapCalloutHAListSuccess, getMapCalloutHAListFailure);
    }

    pub.getHAMapCardCallout = function (searchResultParameters, getMapHACardCalloutSuccess, getMapHACardCalloutFailure) {
        var message =
        {
            haId: searchResultParameters.HaId,
            logoSize: searchResultParameters.LogoSize,
        };
        ajaxUnauthenticated("GetHAMapCardCallout", message, getMapHACardCalloutSuccess, getMapHACardCalloutFailure);
    }

    pub.getSchooMapCardCallout = function (searchResultParameters, getSchooMapCardCalloutSuccess, getSchooMapCardCalloutFailure) {
        var message =
        {
            NCESSchoolID: searchResultParameters.NCESSchoolID
        };
        ajaxUnauthenticated("GetSchooMapCardCallout", message, getSchooMapCardCalloutSuccess, getSchooMapCardCalloutFailure);
    }

    pub.getMapCalloutSchoolList = function (searchResultParameters, getMapCalloutSchoolListSuccess, getMapCalloutSchoolListFailure) {
        var message =
        {
            State: searchResultParameters.state,
            County: searchResultParameters.county,
            City: searchResultParameters.city,
            Zip: searchResultParameters.zip,
            SchoolTypes: searchResultParameters.schoolTypes,
            GradeRanges: searchResultParameters.gradeRanges,
            SchoolRating: searchResultParameters.schoolRating,
            MaxLatitude: searchResultParameters.maxLatitude,
            MaxLongitude: searchResultParameters.maxLongitude,
            MinLatitude: searchResultParameters.minLatitude,
            MinLongitude: searchResultParameters.minLongitude,
            MaxMarkerToShow: searchResultParameters.maxMarkerToShow,
            SchoolId: searchResultParameters.schoolId
        };
        ajaxUnauthenticated("GetSchoolList", message, getMapCalloutSchoolListSuccess, getMapCalloutSchoolListFailure);
    }

    pub.getMinMaxLatLngByLocation = function (searchResultParameters, getMinMaxLatLngByLocationSuccess, getMinMaxLatLngByLocationFailure) {
        var message =
        {
            state: searchResultParameters.state,
            county: searchResultParameters.county,
            city: searchResultParameters.city,
            zip: searchResultParameters.zip
        };
        ajaxUnauthenticated("GetCommunityMinMaxLatLng", message, getMinMaxLatLngByLocationSuccess, getMinMaxLatLngByLocationFailure);
    }

    pub.getRentalPanelList = function (state, city, county, recentState, recentCity, recentCounty, minimumItem, maximumItem, getSearchPropertiesListSuccess, getSearchPropertiesListFailure) {
        var message =
        {
            state: state,
            city: city,
            county: county,
            recentState: recentState,
            recentCity: recentCity,
            recentCounty: recentCounty,
            minimumItem: minimumItem,
            maximumItem: maximumItem
        };
        ajax("GetRecommendedListings", message, getSearchPropertiesListSuccess, getSearchPropertiesListFailure);
    }

    pub.getUserByUserNameOrEmail = function (userName, onSuccess, onFailure) {
        var message =
        {
            userName: userName
        };
        ajaxUnauthenticated("GetUserByUserNameOrEmail", message, onSuccess, onFailure);
    }

    pub.deactivateDuplicateAccount = function (userName, userTypeToKeep, onSuccess, onFailure) {
        var message =
        {
            userName: userName,
            userTypeToKeep: userTypeToKeep
        };
        ajaxUnauthenticated("DeactivateDuplicateAccount", message, onSuccess, onFailure);
    }

    pub.confirmUserEmail = function (emailToken, userName, redirectUrl, onSuccess, onFailure) {
        var message =
        {
            emailToken: emailToken,
            userName: userName,
            redirectUrl: redirectUrl
        };
        ajaxrw("ConfirmUserEmail", message, onSuccess, onFailure);
    }

    pub.tokenLogin = function (authToken, providerType, onSuccess, onFailure) {
        var message =
        {
            authToken: authToken,
            providerType: providerType
        };
        ajaxrw("TokenLogin", message, onSuccess, onFailure);
    }

    pub.getUserExternalProfile = function (authToken, providerType, onSuccess, onFailure) {
        var message =
        {
            authToken: authToken,
            providerType: providerType
        };
        ajaxUnauthenticated("GetUserExternalProfile", message, onSuccess, onFailure);
    }

    pub.signUpWithToken = function (authToken, providerType, userType, lastName, phone, company, title, redirectUrl, onSuccess, onFailure) {
        var message =
        {
            authToken: authToken,
            providerType: providerType,
            lastName: lastName,
            phone: phone,
            userType: userType,
            company: company,
            title: title,
            emailRedirectUrl: redirectUrl
        };
        ajaxrw("SignUpWithToken", message, onSuccess, onFailure);
    }

    pub.getRentEstimate = function (address, bedCount, GetRentEstimateOnSuccess, GetRentEstimateOnFailure) {
        var message =
        {
            address: address,
            bedCount: bedCount
        };
        ajaxUnauthenticated("GetRentEstimate", message, GetRentEstimateOnSuccess, GetRentEstimateOnFailure);
    }

    pub.getCurrentLocationNameByLatLong = function (latitude, longitude, getCurrentLocationNameSuccess, getCurrentLocationNameFailure) {
        var message =
        {
            latitude: latitude,
            longitude: longitude
        };
        ajaxUnauthenticated("GetCurrentLocationNameByLatLong", message, getCurrentLocationNameSuccess, getCurrentLocationNameFailure);
    }

    pub.saveUserRecentSearchLocations = function (searchedLocation, searchedLocationText) {
        var message =
        {
            searchedLocation: searchedLocation,
            searchedLocationText: searchedLocationText
        };
        ajax("SaveRecentSearchLocations", message);
    }

    pub.getUserRecentSearchLocations = function (getUserRecentSearchLocationsSuccess, getUserRecentSearchLocationsFailure) {
        var message = {};
        ajax("GetRecentSearchLocations", message, getUserRecentSearchLocationsSuccess, getUserRecentSearchLocationsFailure);
    }

    pub.correctAddress = function (address1, address2, zip, correctAddressSuccess, correctAddressFailure) {
        var message =
        {
            address1: address1,
            address2: address2,
            zip: zip
        };
        ajaxUnauthenticated("CorrectAddress", message, correctAddressSuccess, correctAddressFailure);
    }

    pub.saveListingWizardInfo = function (listingWizard, saveListingWizardInfoSuccess, saveListingWizardInfoFailure) {
        var message =
        {
            listingWizard: listingWizard,
        };
        ajaxrw("SaveListingWizardInfo", message, saveListingWizardInfoSuccess, saveListingWizardInfoFailure);
    }

    pub.getIncomeLimits = function (fips, zip, getIncomeLimitsSuccess, getIncomeLimitsFailure) {
        var message =
        {
            fips: fips,
            zip: zip
        };
        ajax("GetIncomeLimits", message, getIncomeLimitsSuccess, getIncomeLimitsFailure);
    }

    pub.getListingWizardInfo = function (id, getListingWizardInfoSuccess, getListingWizardInfoFailure) {
        var message =
        {
            id: id
        };
        ajax("GetListingWizardInfo", message, getListingWizardInfoSuccess, getListingWizardInfoFailure);
    }
    pub.getCommunityById = function (id, getCommunityByIdSuccess, getCommunityByIdFailure) {
        var message =
        {
            CommunityId: id
        };
        ajax("GetCommunityById", message, getCommunityByIdSuccess, getCommunityByIdFailure);
    }

    pub.getInprocessLeasesAndApplications = function (modelGuids, unitGuids, getInprocessLeasesAndApplicationsSuccess, getInprocessLeasesAndApplicationsFailure) {
        var message =
        {
            modelGuids: modelGuids,
            unitGuids: unitGuids
        };
        ajax("GetInprocessLeasesAndApplications", message, getInprocessLeasesAndApplicationsSuccess, getInprocessLeasesAndApplicationsFailure);
    }

    pub.hasUserOptedInAnyCampaign = function (hasUserOptedInAnyCampaignSuccess, hasUserOptedInAnyCampaignFailure) {
        var message =
        {
        };
        ajax("HasUserOptedInAnyCampaign", message, hasUserOptedInAnyCampaignSuccess, hasUserOptedInAnyCampaignFailure);
    }
    pub.hasRespondedToNotification = function (hasRespondedToNotificationSuccess, hasRespondedToNotificationFailure) {
        var message =
        {
        };
        ajax("HasRespondedToNotification", message, hasRespondedToNotificationSuccess, hasRespondedToNotificationFailure);
    }
    pub.createContactPoint = function (verificationStatusId, allowMarketing, phoneNumber,
        createContactPointSuccess, createContactPointFailure) {
        var message =
        {
            verificationStatusId: verificationStatusId,
            allowMarketing: allowMarketing,
            phoneNumber: phoneNumber
        };
        ajax("CreateContactPoint", message, createContactPointSuccess, createContactPointFailure);
    }
    pub.saveCampaignUserFrequencyOpt = function (campaignId, campaignUserFrequency, campaignOptStatus,
        saveCampaignUserFrequencyOptSuccess, saveCampaignUserFrequencyOptFailure) {
        var message =
            [{
                campaignId: campaignId,
                campaignUserFrequency: campaignUserFrequency,
                campaignOptStatus: campaignOptStatus
            }];
        ajax("SaveCampaignUserFrequencyOpt", message, saveCampaignUserFrequencyOptSuccess, saveCampaignUserFrequencyOptFailure);
    }

    pub.saveAlertPreferences = function (userId, alertData,
        saveAlertPreferencesSuccess, saveAlertPreferencesFailure) {
        var message =
        {
            userId: userId,
            alertData: alertData
        };
        ajax("SaveAlertPreferences", message, saveAlertPreferencesSuccess, saveAlertPreferencesFailure);
    }
    pub.saveAlertPreferencesByToken = function (userId, alertData,
        saveAlertPreferencesSuccess, saveAlertPreferencesFailure) {
        var message =
        {
            userId: userId,
            alertData: alertData
        };
        ajaxrw("SaveAlertPreferencesByToken", message, saveAlertPreferencesSuccess, saveAlertPreferencesFailure);
    }
    pub.getModelsForCommunity = function (communityId, getModelsForCommunitySuccess, getModelsForCommunityFailure) {
        var message =
        {
            CommunityId: communityId
        };
        ajax("GetModelsForCommunity&cid=" + communityId, message, getModelsForCommunitySuccess, getModelsForCommunityFailure);
    }
    pub.saveModelsForCommunity = function (communityId, models, saveModelsForCommunitySuccess, saveModelsForCommunityFailure) {
        var message =
        {
            CommunityId: communityId,
            Models: models
        };
        ajax("SaveModelsForCommunity", message, saveModelsForCommunitySuccess, saveModelsForCommunityFailure);
    }
    pub.getUnitsForCommunity = function (communityId, id, getUnitsForCommunitySuccess, getUnitsForCommunityFailure) {
        var message =
        {
            CommunityId: communityId,
            Id: id
        };
        ajax("GetUnitsForCommunity", message, getUnitsForCommunitySuccess, getUnitsForCommunityFailure, undefined, undefined, true);
    }
    pub.saveUnitsForCommunity = function (communityId, units, saveUnitsForCommunitySuccess, saveUnitsForCommunityFailure) {
        var message =
        {
            CommunityId: communityId,
            Units: units
        };
        ajax("SaveUnitsForCommunity", message, saveUnitsForCommunitySuccess, saveUnitsForCommunityFailure);
    }

    pub.saveCommunityAvailableStatus = function (
        communityId,
        availabilityStatus,
        availableSoonDate,
        saveCommunityAvailableStatusSuccess,
        saveCommunityAvailableStatusFailure,
        notAvailableReasonsData
    ) {
        if (notAvailableReasonsData) {
            var message = {
                communityId: communityId,
                availability: availabilityStatus,
                availableDate: availableSoonDate,
                listingDeletionReason: notAvailableReasonsData.listingDeletionReason,
                propertyRentedFor: notAvailableReasonsData.propertyRentedFor,
                receiveGovtAssistance: notAvailableReasonsData.receiveGovtAssistance,
                leaseIncentivesIncluded: notAvailableReasonsData.leaseIncentivesIncluded,
                otherReason: notAvailableReasonsData.otherReason,
                leaseIncentiveOption: notAvailableReasonsData.leaseIncentiveOption,
                leaseEndDate: notAvailableReasonsData.leaseEndDate,
                receiveBackupApplication: notAvailableReasonsData.receiveBackupApplication,
                isRemove: notAvailableReasonsData.isRemove
            };
        } else {
            var message = {
                communityId: communityId,
                availability: availabilityStatus,
                availableDate: availableSoonDate
            }
        }

        ajax("SetListingAvailability", message, saveCommunityAvailableStatusSuccess, saveCommunityAvailableStatusFailure);
    }

    pub.getCommunityDetails = function (communityId, getCommunityDetailsSuccess, getCommunityDetailsFailure) {
        var message =
        {
            communityId: communityId
        };
        ajaxUnauthenticated("GetCommunityDetails", message, getCommunityDetailsSuccess, getCommunityDetailsFailure);
    }
    pub.getUserSocialLinks = function (onSuccess, onFailure) {
        var message =
        {
        };
        ajax("GetUserSocialLinks", message, onSuccess, onFailure);
    }
    pub.getCommunityContact = function (communityId, onSuccess, onFailure) {
        var message =
        {
            CommunityId: communityId
        };
        ajaxUnauthenticated("GetCommunityContact", message, onSuccess, onFailure);
    }
    pub.getSearchListingsForDetailsPage = function (searchResultParameters, onSuccess, onFailure) {
        var message =
        {
            searchParameters: searchResultParameters
        };
        ajaxUnauthenticated("GetSearchListingsForDetailsPage", message, onSuccess, onFailure);
    }

    pub.flagCommunity = function (communityId, communityAddress, flagType, comments, onSuccess, onFailure) {
        var message =
        {
            communityId: communityId,
            communityAddress: communityAddress,
            flagType: flagType,
            comments: comments
        };
        ajax("FlagCommunity", message, onSuccess, onFailure);
    }
    pub.getCommunityFlagCount = function (communityId, onSuccess, onFailure) {
        var message =
        {
            communityId: communityId
        };
        ajax("GetCommunityFlagCount", message, onSuccess, onFailure);
    }
    pub.checkDirectInquiryUserRules = function (emailAddress, onSuccess, onFailure) {
        var message =
        {
            emailAddress: emailAddress
        };
        ajaxUnauthenticated("CheckDirectInquiryUserRules", message, onSuccess, onFailure);
    }

    pub.getAlertPreferencesByToken = function (token, onSuccess, onFailure) {
        var message =
        {
            token: token
        };
        ajaxrw("GetUserAlertPreferencesByToken", message, onSuccess, onFailure);
    }
    pub.getAlertPreferencesByUserId = function (onSuccess, onFailure) {

        var message = {};

        ajax("GetUserAlertPreferencesByUserId", message, onSuccess, onFailure);
    }
    pub.isEmailForTenantOwnerHA = function (email, isEmailForTenantOwnerHAOnSuccess, isEmailForTenantOwnerHAOnFailure) {
        var message =
        {
            email: email
        };

        ajaxUnauthenticated("IsEmailForTenantOwnerHA", message, isEmailForTenantOwnerHAOnSuccess, isEmailForTenantOwnerHAOnFailure);
    }

    pub.getCommunityAffordability = function (communityId, calculatorType, annualIncome, voucherBed, maxFamilySize, onSuccess, onFailure) {
        var communityIdList = [];
        communityIdList.push(communityId);

        var message =
        {
            annualIncome: annualIncome,
            calculatorType: calculatorType,
            voucherBed: voucherBed,
            communityId: communityIdList,
            maxFamilySize: maxFamilySize
        };
        ajaxUnauthenticated("GetCommunityAffordability", message, onSuccess, onFailure);
    }

    pub.canCalculateSection8Affordability = function (communityId, onSuccess, onFailure) {
        var message =
        {
            communityId: communityId
        };
        ajaxUnauthenticated("CanCalculateSection8Affordability", message, onSuccess, onFailure);
    }

    pub.getUserAffordabilityCalculatorInput = function (onSuccess, onFailure) {
        var message =
        {
        };
        ajax("GetUserAffordabilityCalculatorInput", message, onSuccess, onFailure);
    }


    pub.SaveUserAffordabilityCalculatorInput = function (affordableModel, SaveUserAffordabilityCalculatorOnSuccess,
        SaveUserAffordabilityCalculatorOnFailure) {
        var message =
        {
            isIncomeBasedMatch: affordableModel.filter.isIncomeBasedMatch,
            isValidIncomeBasedMatch: affordableModel.filter.isValidIncomeBasedMatch,
            isSection8Voucher: affordableModel.filter.isSection8Voucher,
            familySize: affordableModel.filter.familySize,
            voucherSize: affordableModel.filter.voucherSize,
            annualIncome: affordableModel.filter.houseHoldIncome,
            incomeFrequency: affordableModel.filter.incomeFrequencyType
        };
        ajax("SaveUserAffordabilityCalculatorInput", message, SaveUserAffordabilityCalculatorOnSuccess, SaveUserAffordabilityCalculatorOnFailure);
    }
    /** Photo uploader Ajax function Starts */
    pub.getPhotos = function (photoModel, onSuccess, onFailure) {
        ajax("GetPhotos", photoModel, onSuccess, onFailure);
    }

    pub.getUserProperty = function (userId, onSuccess, onFailure) {
        ajax("GetUserProperty", userId, onSuccess, onFailure);
    }
    /** Photo uploader Ajax function Ends */

    pub.getTenantInboxMessages = function (getTenantInboxMessagesSuccess, getTenantInboxMessagesFailure) {
        var message =
        {

        };
        ajax("GetTenantInboxMessages", message, getTenantInboxMessagesSuccess, getTenantInboxMessagesFailure);
    }

    pub.loadInquiryandProspectsList = function (ResultParameters,loadInquiryandProspectsListOnSuccess, loadInquiryandProspectsListOnFailure) {
        var message =
        {
            Page: ResultParameters.page,
            ItemsPerPage: ResultParameters.itemsPerPage,
            CommunityId: ResultParameters.CommunityId,
            FetchDirectInquiries: ResultParameters.FetchDirectInquiries,
            FetchProspects: ResultParameters.FetchProspects,
            Unread: ResultParameters.Unread,
            Sent: ResultParameters.Sent,
            Received: ResultParameters.Received,
        };
        ajax("GetLandlordInboxMessages", message, loadInquiryandProspectsListOnSuccess, loadInquiryandProspectsListOnFailure);
    }

    pub.SetLandlordInboxViewStatus = function (isProspect, communityId, tenantUserId, SetLandlordInboxViewStatusOnSuccess, SetLandlordInboxViewStatusOnFailure) {
        var message =
        {
            IsProspect: isProspect,
            CommunityId: communityId,
            TenantUserId: tenantUserId
        };
        ajax("SetLandlordInboxViewStatus", message, SetLandlordInboxViewStatusOnSuccess, SetLandlordInboxViewStatusOnFailure);
    }

    pub.GetLandlordInboxMessageDetail = function (isProspect, communityId, tenantUserId, logId, GetLandlordInboxMessageDetailOnSuccess, GetLandlordInboxMessageDetailOnFailure) {
        var message =
        {
            IsProspect: isProspect,
            CommunityId: communityId,
            TenantUserId: tenantUserId,
            LogId: logId
        };
        ajax("GetLandlordInboxMessageDetail", message, GetLandlordInboxMessageDetailOnSuccess, GetLandlordInboxMessageDetailOnFailure);
    }


    pub.GetLandlordInboxMessageStatus = function (communityId, tenantUserId, logId, GetLandlordInboxMessageStatusOnSuccess, GetLandlordInboxMessageStatusOnFailure) {
        var message =
        {
            CommunityId: communityId,
            TenantUserId: tenantUserId,
            LogId: logId
        };
        ajax("GetLandlordInboxMessageStatus", message, GetLandlordInboxMessageStatusOnSuccess, GetLandlordInboxMessageStatusOnFailure);
    }


    pub.GetLandlordInboxNotes = function (tenantUserId, GetLandlordInboxNotesOnSuccess, GetLandlordInboxNotesOnFailure) {
        var message =
        {
            TenantUserId: tenantUserId
        };
        ajax("GetLandlordInboxNotes", message, GetLandlordInboxNotesOnSuccess, GetLandlordInboxNotesOnFailure);
    }

    pub.AddLandlordInboxNotes = function (tenantIdList, messageText, LandlordInboxSendEmailOnSuccess, LandlordInboxSendEmailOnFailure) {
        var message =
        {
            TenantIdList: tenantIdList,
            Notes: messageText
        };
        ajax("AddLandlordInboxNotes", message, LandlordInboxSendEmailOnSuccess, LandlordInboxSendEmailOnFailure);
    }
    pub.DeleteLandlordInboxContact = function (DeleteLandlordInboxContact, DeleteLandlordInboxContactOnSuccess, DeleteLandlordInboxContactOnFailure) {
        var message =
        {
            DeleteLandlordInboxContactList: DeleteLandlordInboxContact
        };
        ajax("DeleteLandlordInboxContact", message, DeleteLandlordInboxContactOnSuccess, DeleteLandlordInboxContactOnFailure);
    }
    pub.LandlordInboxSendEmail = function (messageList, isBulk, subject, messageText, isCCOwner, isSelfMail, isSaveTemplate, templateTitle, messageId, propertiesLinks, LandlordInboxSendEmailOnSuccess, LandlordInboxSendEmailOnFailure) {
        var message =
        {
            LandlordInboxSendEmailList: messageList,
            IsBulk: isBulk,
            Subject: subject,
            MessageText: messageText,
            IsCCOwner: isCCOwner,
            IsSelfMail: isSelfMail,
            IsSaveTemplate: isSaveTemplate,
            TemplateTitle: templateTitle,
            MessageId: messageId,
            LandlordInboxPropertyLinks: propertiesLinks
        };
        ajax("LandlordInboxSendEmail", message, LandlordInboxSendEmailOnSuccess, LandlordInboxSendEmailOnFailure);
    }

    pub.LandlordInboxSendText = function (isProspect, tenantUserId, tenantUserName, logId, messageText, communityId, listingFirstName, LandlordInboxSendTextOnSuccess, LandlordInboxSendTextOnFailure) {
        var message =
        {
            IsProspect: isProspect,
            LogId: logId,
            MessageText: messageText,
            TenantUserId: tenantUserId,
            TenantUserName: tenantUserName,
            CommunityId: communityId,
            ListingFirstName: listingFirstName
        };
        ajax("LandlordInboxSendText", message, LandlordInboxSendTextOnSuccess, LandlordInboxSendTextOnFailure);
    }

    pub.GetLandlordInboxCommunityList = function (GetLandlordInboxCommunityListOnSuccess, GetLandlordInboxCommunityListOnFailure) {
        var message =
        {

        };
        ajax("GetLandlordInboxCommunityList", message, GetLandlordInboxCommunityListOnSuccess, GetLandlordInboxCommunityListOnFailure);
    }

    pub.GetLandlordInboxCannedEmails = function (GetLandlordInboxTemplatesOnSuccess, GetLandlordInboxTemplatesOnFailure) {
        var message =
        {
        };
        ajax("GetLandlordInboxCannedEmails", message, GetLandlordInboxTemplatesOnSuccess, GetLandlordInboxTemplatesOnFailure);
    }

    pub.DeleteLandlordInboxCannedEmail = function (messageId, DeleteLandlordInboxCannedEmailOnSuccess, DeleteLandlordInboxCannedEmailOnFailure) {
        var message =
        {
            MessageId: messageId
        };
        ajax("DeleteLandlordInboxCannedEmail", message, DeleteLandlordInboxCannedEmailOnSuccess, DeleteLandlordInboxCannedEmailOnFailure);
    }
    pub.GetLandlordInboxMessageForEmailReply = function (isProspect, tenantUserId, communityId, GetLandlordInboxMessageForEmailReplyOnSuccess, GetLandlordInboxMessageForEmailReplyOnFailure) {
        var message =
        {
            IsProspect: isProspect,
            TenantUserId: tenantUserId,
            CommunityId: communityId
        };
        ajax("GetLandlordInboxMessageForEmailReply", message, GetLandlordInboxMessageForEmailReplyOnSuccess, GetLandlordInboxMessageForEmailReplyOnFailure);
    }

    pub.getTenantInboxLink = function (ownerId, communityId, onResult) {
        pub.getTenantInboxMessages(
            function (result) {
                var inboxItem;
                for (var i = 0; i < result.TenantInboxMessages.length; i++) {
                    var message = result.TenantInboxMessages[i];
                    if (
                        message.LandlordUserId == ownerId &&
                        message.CommunityId == communityId
                    ) {
                        inboxItem = message;
                        break;
                    }
                }

                if (!inboxItem) {
                    onResult(false);
                    return;
                }

                onResult('/v4/pages/renterInbox/renterInbox.aspx?pl=' + inboxItem.LogId);
                return;
            },
            function () {
                onResult(false);
            }
        );
    }

    pub.getTenantInboxDetails = function (LandlordUserId, communityId, MessageSource, getTenantInboxDetailsSuccess, getTenantInboxDetailsFailure) {
        var message =
        {
            LandlordUserId: LandlordUserId,
            communityId: communityId,
            MessageSource: MessageSource
        };
        ajax("GetTenantInboxDetails", message, getTenantInboxDetailsSuccess, getTenantInboxDetailsFailure);
    }

    pub.deleteTenantInboxMessage = function (DeleteTenantInboxMessages, deleteTenantInboxMessageSuccess, deleteTenantInboxMessageFailure) {
        var message =
        {
            DeleteTenantInboxMessages: DeleteTenantInboxMessages
        };
        ajax("DeleteTenantInboxMessage", message, deleteTenantInboxMessageSuccess, deleteTenantInboxMessageFailure);
    }

    pub.saveTenantInboxMessage = function (LogID, CommunityId, Comment, MessageSource, saveTenantInboxMessageSuccess, saveTenantInboxMessageFailure) {
        var message =
        {
            LogID: LogID,
            CommunityId: CommunityId,
            Comment: Comment,
            MessageSource: MessageSource
        };
        ajax("SaveTenantInboxMessage", message, saveTenantInboxMessageSuccess, saveTenantInboxMessageFailure);
    }

    pub.saveTenantInboxViewStatus = function (LandlordUserId, CommunityId, Viewed, MessageSource, saveTenantInboxViewStatusSuccess, saveTenantInboxViewStatusFailure) {
        var message =
        {
            LandlordUserId: LandlordUserId,
            CommunityId: CommunityId,
            Viewed: Viewed,
            MessageSource: MessageSource
        };
        ajax("SaveTenantInboxViewStatus", message, saveTenantInboxViewStatusSuccess, saveTenantInboxViewStatusFailure);
    }

    pub.hasNewInboundUserEmails = function (UserId, hasNewInboundTenantEmailsSuccess, hasNewInboundTenantEmailsFailure) {
        var message =
        {
            UserId: UserId
        };
        ajax("HasNewInboundUserEmails", message, hasNewInboundTenantEmailsSuccess, hasNewInboundTenantEmailsFailure);
    }
    pub.getAppPoolWaitListStatus = function (haId, appPoolCode, getAppPoolWaitListStatusOnSuccess, getAppPoolWaitListStatusOnFailure) {
        var message =
        {
            haId: haId,
            appPoolCode: appPoolCode
        };
        ajaxUnauthenticated("GetAppPoolWaitListStatus", message, getAppPoolWaitListStatusOnSuccess, getAppPoolWaitListStatusOnFailure);
    }
    pub.saveTenantSMSMessage = function (LogID, CommunityId, Comment, MessageSource, saveTenantSMSMessageSuccess, saveTenantSMSMessageFailure) {
        var message =
        {
            LogID: LogID,
            CommunityId: CommunityId,
            Comment: Comment,
            MessageSource: MessageSource
        };
        ajax("SaveTenantSMSMessage", message, saveTenantSMSMessageSuccess, saveTenantSMSMessageFailure);
    }


    // var portalEditorApi = "http://localhost:49453/api/";
    //  var portalEditorApi = "https://192.168.200.126:8009/api/";

    pub.getThemeData = function (HaId, GetThemeDataSuccess, GetThemeDataFailure) {

        $.ajax({
            type: "get",
            url: portalEditorApi + "PortalGeneral/GetThemeGeneral?HaId=" + HaId,
            dataType: "json",
            success: GetThemeDataSuccess,
            error: GetThemeDataFailure
        });
    }
    pub.getHomePageData = function (HaId, HomePageId, Status, GetHomePageDataSuccess, GetHomePageDataFailure) {

        $.ajax({
            type: "get",
            url: portalEditorApi + "PortalPages/GetHomePageById?HaId=" + HaId + "&HomePageId=" + HomePageId + "&Status=" + Status,
            dataType: "json",
            success: GetHomePageDataSuccess,
            error: GetHomePageDataFailure
        });
    }
    pub.getResourcePageById = function (haId, pageId, status, previewType, getResourcePageByIdOnSuccess, getResourcePageByIdOnFailure) {
        $.ajax({
            type: "get",
            url: portalEditorApi + "PortalPages/GetResourcePageById?HaId=" + haId + "&ResourcePageId=" + pageId + "&Status=" + status + "&PreviewType=" + previewType,
            dataType: "json",
            success: getResourcePageByIdOnSuccess,
            error: getResourcePageByIdOnFailure
        });
    }

    pub.getServicePageById = function (haId, pageId, status, previewType, getServiceDataSuccess, getServiceDataFailure) {
        $.ajax({
            type: "get",
            url: portalEditorApi + "PortalPages/GetServicePageById?HaId=" + haId + "&ServicePageId=" + pageId + "&Status=" + status + "&PreviewType=" + previewType,
            dataType: "json",
            success: getServiceDataSuccess,
            error: getServiceDataFailure
        });
    }


    pub.directMessageInitiationFromRenter = function (communityId, landlordUserId, message, onSuccess, onFailure) {
        var params =
        {
            communityId: communityId,
            landlordUserId: landlordUserId,
            message: message
        };
        ajax("DirectMessageInitiationFromRenter", params, onSuccess, onFailure);
    }


    pub.directMessageInitiationFromOwner = function (communityId, tenantUserId, message, onSuccess, onFailure) {
        var params =
        {
            communityId: communityId,
            tenantUserId: tenantUserId,
            message: message
        };
        ajax("DirectMessageInitiationFromOwner", params, onSuccess, onFailure);
    }


    pub.getOwnerConversationIdForTenant = function (communityId, tenantUserId, onSuccess, onFailure) {
        var params =
        {
            communityId: communityId,
            tenantUserId: tenantUserId
        };
        ajax("GetOwnerConversationIdForTenant", params, onSuccess, onFailure);
    }

    pub.notifyOwnerApplicationStatusChanged = function (tenantId, modelGuid, unitGuid, statusCode) {
        var params =
        {
            tenantId,
            modelGuid,
            unitGuid,
            statusCode
        };
        ajax("NotifyOwnerApplicationStatusChanged", params)
    }

    pub.notifyRenterLeaseCanceled = function (leaseId, userId, unitGuid, reason) {
        var params =
        {
            leaseId,
            userId,
            unitGuid,
            reason
        };
        ajax("NotifyRenterLeaseCanceled", params)
    }

    var availableMinDate = new Date();
    availableMinDate.setDate(availableMinDate.getDate() + 1);
    availableMinDate.setHours(0);
    availableMinDate.setMinutes(0);
    availableMinDate.setSeconds(0);
    availableMinDate.setMilliseconds(0);

    var availableMaxDate = new Date();
    availableMaxDate.setDate(availableMaxDate.getDate() + 90);

    var AVAILABLE_STATUSES = {
        AVAILABLE_NOW: "AVAILABLE_NOW",
        AVAILABLE_SOON: "AVAILABLE_SOON",
        WAITING_LIST: "WAITING_LIST",
        NOT_AVAILABLE: "NOT_AVAILABLE",
    };

    var AVAILABLE_STATUS_TITLES = {
        AVAILABLE_NOW: "Available Now",
        AVAILABLE_SOON: "Available Soon",
        WAITING_LIST: "Waiting List",
        NOT_AVAILABLE: "Not Available",
    };

    pub.availability = {
        minDate: availableMinDate,
        maxDate: availableMaxDate,
        statuses: AVAILABLE_STATUSES,
        statusTitles: AVAILABLE_STATUS_TITLES,
    }

    pub.getAvailableStatusFromDate = function (availabilityDateString, acceptingRentalApplications) {
        if (acceptingRentalApplications === false) {
            return pub.availability.statuses.NOT_AVAILABLE;
        }

        if (availabilityDateString === null) {
            return pub.availability.statuses.WAITING_LIST;
        }

        var availabilityDate = new Date(availabilityDateString);
        var today = new Date();
        var ahead90Days = new Date();
        ahead90Days.setDate(ahead90Days.getDate() + 90);

        if (availabilityDate.getTime() <= today.getTime() || typeof availabilityDateString === "undefined") {
            return pub.availability.statuses.AVAILABLE_NOW;
        }

        if (availabilityDate.getTime() > today.getTime() && availabilityDate.getTime() <= ahead90Days.getTime()) {
            return pub.availability.statuses.AVAILABLE_SOON;
        }

        return pub.availability.statuses.WAITING_LIST;
    };

    pub.onAvailableStatusChange = function (model) {
        try {
            var status = model.availableStatus();

            switch (status) {
                case pub.availability.statuses.AVAILABLE_NOW:
                    model.availableDate(moment().format('MM/DD/YYYY'));
                    model.acceptingRentalApplications(true);
                    break;
                case pub.availability.statuses.AVAILABLE_SOON:
                    model.availableDate(moment().add(1, 'days').format('MM/DD/YYYY'));
                    model.acceptingRentalApplications(true);
                    break;
                case pub.availability.statuses.WAITING_LIST:
                    model.availableDate(null);
                    model.acceptingRentalApplications(true);
                    break;
                case pub.availability.statuses.NOT_AVAILABLE:
                    model.availableDate(null);
                    model.acceptingRentalApplications(false);
                    break;
            }
        }
        catch (ex) {
            go8Error.handleException(ex);
        }
    };

    pub.getTenantTrackerNotes = function (tenantId, onSuccess, onFailure) {
        var params =
        {
            tenantId: tenantId
        };
        ajax("GetTenantTrackerNotes", params, onSuccess, onFailure);
    }

    pub.deleteTenantTrackerNotes = function (trackId, onSuccess, onFailure) {
        var params =
        {
            trackId: trackId
        };
        ajax("DeleteTenantTrackerNotes", params, onSuccess, onFailure);
    }

    pub.insertTenantTrackerNotes = function (userId, notes, LID, onSuccess, onFailure) {
        var params =
        {
            userId: userId,
            notes: notes,
            LID: LID,
            isMailNote: 0
        };
        ajax("InsertTenantTrackerNotes", params, onSuccess, onFailure);
    }

    pub.getInprocessLeaseIdByUnitGuid = function (unitGuid, onSuccess, onFailure) {
        var params =
        {
            unitGuid: unitGuid
        };
        ajax("GetInprocessLeaseIdByUnitGuid", params, onSuccess, onFailure);
    }


    pub.GetWaitlistQuestion = function (waitlistId, GetWaitlistQuestionOnSuccess, GetWaitlistQuestionOnFailure) {
        var message = {
            waitlistId: waitlistId
        };
        ajax("GetWaitlistQuestion", message, GetWaitlistQuestionOnSuccess, GetWaitlistQuestionOnFailure);
    }

    pub.getSerResPageNames = function (haId, respageIds, serviceIds, getPageNameSuccess, getPageNameFailure) {
        $.ajax({
            type: "get",
            url: portalEditorApi + "PortalPages/GetResourceServicePageName?haId=" + haId + "&respageIds=" + respageIds + "&serviceIds=" + serviceIds,
            dataType: "json",
            success: getPageNameSuccess,
            error: getPageNameFailure
        });
    }

    pub.notifyOwnerApplicationStatusChanged = function (tenantId, modelGuid, unitGuid, statusCode, onSuccess, onFailure) {
        var message =
        {
            tenantId,
            modelGuid,
            unitGuid,
            statusCode,
        };
        ajax("NotifyOwnerApplicationStatusChanged", message, onSuccess, onFailure);
    }

    pub.SubmitRentalApplication = function (modelGuid, unitGuid, personalMessage, OwnerQuestions, SubmitApplicationOnSuccess, SubmitApplicationOnFailure) {
        var message = {
            ModelGuid: modelGuid,
            UnitGuid: unitGuid,
            PersonalMessage: personalMessage,
            PrescreeningQuestionsJson: OwnerQuestions
        };
        ajax("SubmitRentalApplication", message, SubmitApplicationOnSuccess, SubmitApplicationOnFailure);
    }

    pub.hideApplicationStatusCanChangedNotification = function (onSuccess, onFailure) {
        ajax("AddHideApplicationStatusCanChangedNotification", { }, onSuccess, onFailure)
    }

    pub.HaveVoucherDifferenceForTenant = function (modelGuid, unitGuid, HaveVoucherDifferenceForTenantOnSuccess, HaveVoucherDifferenceForTenantOnFailure) {
        var message = {
            ModelGuid: modelGuid,
            UnitGuid: unitGuid
        };
        ajax("HaveVoucherDifferenceForTenant", message, HaveVoucherDifferenceForTenantOnSuccess, HaveVoucherDifferenceForTenantOnFailure);
    }
    pub.GetLandlordQuestions = function (modelGuid, unitGuid, GetLandlordQuestionsOnSuccess, GetLandlordQuestionsOnFailure) {
        var message = {
            ModelGuid: modelGuid,
            UnitGuid: unitGuid
        };
        ajax("GetLandlordQuestionsforPropertyByGuid", message, GetLandlordQuestionsOnSuccess, GetLandlordQuestionsOnFailure);
    }
    pub.GetPropertyInformationByGuid = function (modelGuid, unitGuid, GetPropertyInformationByGuidSuccess, GetPropertyInformationByGuidFailure) {
        var message = {
            ModelGuid: modelGuid,
            UnitGuid: unitGuid
        }
        ajax("GetPropertyInformationByGuid", message, GetPropertyInformationByGuidSuccess, GetPropertyInformationByGuidFailure);
    }
    pub.CheckRentalApplicationRequiredFields = function (modelGuid, unitGuid, CheckRentalApplicationRequiredFieldsOnSuccess, CheckRentalApplicationRequiredFieldsOnFailure) {
        var message = {
            ModelGuid: modelGuid,
            UnitGuid: unitGuid
        };
        ajax("CheckRentalApplicationRequiredFields", message, CheckRentalApplicationRequiredFieldsOnSuccess, CheckRentalApplicationRequiredFieldsOnFailure);
    }

    pub.saveUserTCModalAcceptedSetting = function (isModalAccepted, modalsource, saveUserTCModalAcceptedSettingOnSuccess, saveUserTCModalAcceptedSettingOnFailure) {
        var message = {
            isModalAccepted: isModalAccepted,
            modalsource: modalsource
        };
        ajax("SaveUserTCModalAcceptedSetting", message, saveUserTCModalAcceptedSettingOnSuccess, saveUserTCModalAcceptedSettingOnFailure);
    }

    pub.getUserTCModalAcceptedSetting = function (modalsource, getUserTCModalAcceptedSettingOnSuccess, getUserTCModalAcceptedSettingOnFailure) {
        var message = {
            modalsource: modalsource
        };
        ajax("GetUserTCModalAcceptedSetting", message, getUserTCModalAcceptedSettingOnSuccess, getUserTCModalAcceptedSettingOnFailure);
    }

    pub.getWebFlowPricingPageSetting = function (getWebFlowPricingPageSettingOnSuccess, getWebFlowPricingPageSettingOnFailure) {
        var message = {};
        ajaxUnauthenticated("IsWebFlowPricingPageEnabled", message, getWebFlowPricingPageSettingOnSuccess, getWebFlowPricingPageSettingOnFailure);
    }

    pub.saveMarketingFeatureBannerByUser = function (bannerName, frequency, saveMarketingFeatureBannerOnSuccess, saveMarketingFeatureBannerOnFailure) {
        var message = {
            bannerName: bannerName,
            frequencyInHours: frequency
        };
        ajax("SaveMarketingFeatureBannerByUser", message, saveMarketingFeatureBannerOnSuccess, saveMarketingFeatureBannerOnFailure);
    }

    pub.getMarketingFeatureBanner = function (getMarketingFeatureBannerOnSuccess, getMarketingFeatureBannerOnFailure) {
        var message = {};
        ajax("GetMarketingFeatureBannerByUser", message, getMarketingFeatureBannerOnSuccess, getMarketingFeatureBannerOnFailure);
    }

    pub.GetPrescreenCustomQuestions = function (communityId, getPrescreeningCustomQuestionsOnSuccess, getPrescreeningCustomQuestionsOnFailure) {
        var message = {
            communityId: communityId
        };
        ajax("GetPrescreenCustomQuestions", message, getPrescreeningCustomQuestionsOnSuccess, getPrescreeningCustomQuestionsOnFailure);
    }
    pub.GetLandlordStatusInfo = function (LoadOwnerInformationOnSuccess, LoadOwnerInformationOnFailure) {
        var message =
        {

        };
        ajax("GetLandlordStatusInfo", message, LoadOwnerInformationOnSuccess, LoadOwnerInformationOnFailure);
    }
    pub.getHaWaitingLists = function (onSuccess, onFailure) {
        var message = {};
        ajax("GetHaWaitingLists", message, onSuccess, onFailure);
    }
    pub.getHANavigationToManageListing = function (getHANavigationToManageListingOnSuccess, getHANavigationToManageListingOnFailure) {
        var message = {};
        ajax("GetHANavigationToManageListing", message, getHANavigationToManageListingOnSuccess, getHANavigationToManageListingOnFailure);
    }
    
    pub.getWaitlistProperties = function (waitlistid, Onsuccess, OnFailure) {
        var message =
        {
            waitlistid: waitlistid
        };
        ajax("GetWaitlistProperties&wlId=" + waitlistid, message, Onsuccess, OnFailure);
    }
    pub.getWaitlistIncomeLimitsForCommunity = function (fips, getWaitlistIncomeLimitsForCommunityOnSuccess, getWaitlistIncomeLimitsForCommunityOnFailure) {
        var message =
        {
            fips: fips
        };
        ajax("getWaitlistIncomeLimitsForCommunity", message, getWaitlistIncomeLimitsForCommunityOnSuccess, getWaitlistIncomeLimitsForCommunityOnFailure);
    }
    pub.getListingsIdsForWaitlist = function (waitlistList, Onsuccess, OnFailure) {
        var message =
        {
            waitlistid: waitlistList
        };
        ajax("GetListingsIdsForWaitlist", message, Onsuccess, OnFailure);
    }
    pub.getLeasesCount = function (getLeasesOnSuccess, getLeasesOnFailure) {
        var message = {};
        ajax("GetLeasesCount", message, getLeasesOnSuccess, getLeasesOnFailure);
    }

    pub.getBrand = function (brandId, getBrandOnSuccess, getBrandOnFailure) {
        var message = {
            brandId: brandId
        };
        ajaxUnauthenticated("GetBrand", message, getBrandOnSuccess, getBrandOnFailure);
    }
    pub.getOwnerPricingDetails = function (getOwnerPricingDetailsOnSuccess, getOwnerPricingDetailsOnFailure) {
        var message = {};
        ajax("GetOwnerPricingDetails", message, getOwnerPricingDetailsOnSuccess, getOwnerPricingDetailsOnFailure);
    }
    pub.hasRespondedToHaToRenterNotification = function (hasRespondedToHaToRenterNotificationSuccess, hasRespondedToHaToRenterNotificationFailure) {
        var message =
        {
        };
        ajax("HasRespondedToHaToRenterNotification", message, hasRespondedToHaToRenterNotificationSuccess, hasRespondedToHaToRenterNotificationFailure);
    }
    pub.updateHaToRenterNotifications = function (updateHaToRenterNotificationsSuccess, updateHaToRenterNotificationsFailure) {
        var message =
        {
        };
        ajax("UpdateHaToRenterNotifications", message, updateHaToRenterNotificationsSuccess, updateHaToRenterNotificationsFailure);
    }
    pub.validateUserForFormInstance = function (formInstanceId, updateHaToRenterNotificationsSuccess, updateHaToRenterNotificationsFailure) {
        var message =
        {
            formInstanceId: formInstanceId
        };
        ajax("ValidateUserForFormInstance", message, updateHaToRenterNotificationsSuccess, updateHaToRenterNotificationsFailure);
    }    

    pub.getOwnerCheckoutDetails = function (getOwnerCheckoutDetailsOnSuccess, getOwnerCheckoutDetailsOnFailure) {
        var message = {};
        ajax("GetOwnerCheckoutDetails", message, getOwnerCheckoutDetailsOnSuccess, getOwnerCheckoutDetailsOnFailure);
    }

    pub.getOwnerMembershipStatusDetails = function (includePaymentDetails,getOwnerMembershipStatusDetailsOnSuccess, getOwnerMembershipStatusDetailsOnFailure) {
        var message = { includePaymentDetails: includePaymentDetails };
        ajax("GetOwnerMembershipStatusDetails", message, getOwnerMembershipStatusDetailsOnSuccess, getOwnerMembershipStatusDetailsOnFailure);
    }

    pub.getOwnerMembershipPaymentDetails = function (getOwnerMembershipPaymentDetailsOnSuccess, getOwnerMembershipPaymentDetailsOnFailure) {
        var message = {};
        ajax("GetOwnerMembershipPaymentDetails", message, getOwnerMembershipPaymentDetailsOnSuccess, getOwnerMembershipPaymentDetailsOnFailure);
    }

    pub.getSettingsForNewTagMoreFilters = function (getSettingsForNewTagMoreFiltersOnSuccess, getSettingsForNewTagMoreFiltersOnFailure) {
        var message = {};
        ajax("GetSettingsForNewTagMoreFilters", message, getSettingsForNewTagMoreFiltersOnSuccess, getSettingsForNewTagMoreFiltersOnFailure);
    }

    pub.processOwnerPayment = function (paymentMode, productId, billingInfo, paymentInfo, isEnroll, processOwnerPaymentOnSuccess, processOwnerPaymentOnFailure) {
        var message = null;

        if (billingInfo && paymentInfo) {
            var billingContact = {
                city: billingInfo.city(),
                address1: billingInfo.street(),
                zip: billingInfo.zip(),
                state: billingInfo.selectedState().Code,
                firstName: billingInfo.firstName(),
                lastName: billingInfo.lastName()
            };

            var payment = {
                AccountNumber: paymentInfo.creditCardNumber(),
                ExpirationMonth: paymentInfo.selectedMonth(),
                ExpirationYear: paymentInfo.selectedYear(),
                CVV: paymentInfo.securityCode()
            };

            message = {
                BillingContact: billingContact,
                Card: payment,
                ProductId: productId,
                PaymentMethod: paymentMode,
                CancelUrl: window.location.href,
                IsEnroll: isEnroll
            };
        }
        else {
            message = {
                ProductId: productId,
                PaymentMethod: paymentMode,
                CancelUrl: window.location.href,
                IsEnroll: isEnroll
            };
        }

        if (paymentMode === 'PPL') {
            ajaxrw("ProcessOwnerPaypalPayment", message, processOwnerPaymentOnSuccess, processOwnerPaymentOnFailure);
        }
        else
            ajaxrw("ProcessOwnerPayment", message, processOwnerPaymentOnSuccess, processOwnerPaymentOnFailure);
    }
    pub.getHAJurisdictionlocationsListingsCount = function (haId, Onsuccess, OnFailure)
    {
        var message =
        {
            haId: haId
        };
        ajaxUnauthenticated("GetHAJurisdictionlocationsListingsCount", message, Onsuccess, OnFailure);
    }
    pub.getCancellationReasonList = function (GetCancellationReasonListOnSuccess, GetCancellationReasonListOnFailure) {
        var message = {};
        ajax("GetCancellationReasonList", message, GetCancellationReasonListOnSuccess, GetCancellationReasonListOnFailure);
    }
    pub.CancelOwnerSubscription = function (reasonId, reason, subscriptionId, CancelOwnerSubscriptionOnSuccess, CancelOwnerSubscriptionOnFailure) {
        var message = {
            reasonId: reasonId,
            reason: reason,
            subscriptionId: subscriptionId
        };
        ajaxrw("CancelOwnerSubscription", message, CancelOwnerSubscriptionOnSuccess, CancelOwnerSubscriptionOnFailure);
    }

    pub.SaveComparableConfirmation = function (message, onSaveComparableConfirmationSuccess, onSaveComparableConfirmationFailure) {
        ajax("SaveComparableConfirmation", message, onSaveComparableConfirmationSuccess, onSaveComparableConfirmationFailure);
    }
    pub.SaveNonComparable = function (message, onSaveNonComparableSuccess, onSaveNonComparableFailure) {
        ajax("SaveNonComparable", message, onSaveNonComparableSuccess, onSaveNonComparableFailure);
    }
    pub.CheckAddressExists = function (message, onCheckAddressExistsSuccess, onCheckAddressExistsFailure) {
        ajax("CheckAddressExists", message, onCheckAddressExistsSuccess, onCheckAddressExistsFailure);
    }

    pub.getOwnerBillingSubscriptionAddress = function (getOwnerBillingSubscriptionAddressOnSuccess, getOwnerBillingSubscriptionAddressOnFailure) {
        var message = {};
        ajax("GetOwnerBillingSubscriptionAddress", message, getOwnerBillingSubscriptionAddressOnSuccess, getOwnerBillingSubscriptionAddressOnFailure);
    }

    pub.updateSubscriptionCreditCard = function (billingInfo, paymentInfo   , updateSubscriptionCreditCardOnSuccess, updateSubscriptionCreditCardOnFailure) {
  
        var billingContact = {
            city: billingInfo.city(),
            address1: billingInfo.street(),
            zip: billingInfo.zip(),
            state: billingInfo.selectedState().Code,
            firstName: billingInfo.firstName(),
            lastName: billingInfo.lastName()
        };

        var payment = {
            AccountNumber: paymentInfo.creditCardNumber(),
            ExpirationMonth: paymentInfo.selectedMonth(),
            ExpirationYear: paymentInfo.selectedYear(),
            CVV: paymentInfo.securityCode()
        };

       var message = {
            BillingContact: billingContact,
           Card: payment           
        };
        ajax("UpdateSubscriptionCreditCard", message, updateSubscriptionCreditCardOnSuccess, updateSubscriptionCreditCardOnFailure);
    }
    pub.haPublicProfileRequestAccess = function (message, onPublicProfileRequestAccessSuccess, onPublicProfileRequestAccessFailure) {
        ajaxUnauthenticated("HAPublicProfileRequestAccess", message, onPublicProfileRequestAccessSuccess, onPublicProfileRequestAccessFailure);
    }
    pub.SaveComparableConfirmation = function (message, onSaveComparableConfirmationSuccess, onSaveComparableConfirmationFailure) {
        ajax("SaveComparableConfirmation", message, onSaveComparableConfirmationSuccess, onSaveComparableConfirmationFailure);
    }
    pub.SaveNonComparable = function (message, onSaveNonComparableSuccess, onSaveNonComparableFailure) {
        ajax("SaveNonComparable", message, onSaveNonComparableSuccess, onSaveNonComparableFailure);
    }
    pub.CheckAddressExists = function (message, onCheckAddressExistsSuccess, onCheckAddressExistsFailure) {
        ajax("CheckAddressExists", message, onCheckAddressExistsSuccess, onCheckAddressExistsFailure);
    }

    pub.getOwnerBillingSubscriptionAddress = function (getOwnerBillingSubscriptionAddressOnSuccess, getOwnerBillingSubscriptionAddressOnFailure) {
        var message = {};
        ajax("GetOwnerBillingSubscriptionAddress", message, getOwnerBillingSubscriptionAddressOnSuccess, getOwnerBillingSubscriptionAddressOnFailure);
    }

    pub.updateSubscriptionCreditCard = function (billingInfo, paymentInfo   , updateSubscriptionCreditCardOnSuccess, updateSubscriptionCreditCardOnFailure) {
  
        var billingContact = {
            city: billingInfo.city(),
            address1: billingInfo.street(),
            zip: billingInfo.zip(),
            state: billingInfo.selectedState().Code,
            firstName: billingInfo.firstName(),
            lastName: billingInfo.lastName()
        };

        var payment = {
            AccountNumber: paymentInfo.creditCardNumber(),
            ExpirationMonth: paymentInfo.selectedMonth(),
            ExpirationYear: paymentInfo.selectedYear(),
            CVV: paymentInfo.securityCode()
        };

       var message = {
            BillingContact: billingContact,
           Card: payment           
        };
        ajax("UpdateSubscriptionCreditCard", message, updateSubscriptionCreditCardOnSuccess, updateSubscriptionCreditCardOnFailure);
    }

    pub.getUserFeatureUsageDetails = function (getUserFeatureUsageDetailsOnSuccess, getUserFeatureUsageDetailsOnFailure) {
        var message = {};
        ajax("GetUserFeatureUsageDetails", message, getUserFeatureUsageDetailsOnSuccess, getUserFeatureUsageDetailsOnFailure);
    }

    pub.getConsumeFeature = function (featureId,consumptionCount,getConsumeFeatureOnSuccess, getConsumeFeatureOnFailure) {
        var message = {
            featureId: featureId,
            consumptionCount: consumptionCount
        };
        ajaxrw("ConsumeFeature", message, getConsumeFeatureOnSuccess, getConsumeFeatureOnFailure);
    }

    pub.getNextUpgradeProductFeatureLimit = function (getNextUpgradeProductFeatureLimitOnSuccess, getNextUpgradeProductFeatureLimitOnFailure) {
        var message = {};
        ajax("GetNextUpgradeProductFeatureLimit", message, getNextUpgradeProductFeatureLimitOnSuccess, getNextUpgradeProductFeatureLimitOnFailure);
    }
    pub.getLeaseInvitationStepsUnitId = function (applicationId, getLeaseInvitationStepsUnitIdOnSuccess, getLeaseInvitationStepsUnitIdOnFailure) {
        var message = {
            ApplicationId: applicationId
        };
        ajax("GetLeaseInvitationStepsUnitId", message, getLeaseInvitationStepsUnitIdOnSuccess, getLeaseInvitationStepsUnitIdOnFailure);
    }
    pub.deleteLeaseInvitationSteps = function (applicationId, deleteLeaseInvitationStepsOnSuccess, deleteLeaseInvitationStepsOnFailure) {
        var message = {
            ApplicationId: applicationId
        };
        ajax("DeleteLeaseInvitationSteps", message, deleteLeaseInvitationStepsOnSuccess, deleteLeaseInvitationStepsOnFailure);
    }
    pub.haPublicProfileRequestAccess = function (message, onPublicProfileRequestAccessSuccess, onPublicProfileRequestAccessFailure) {
        ajaxUnauthenticated("HAPublicProfileRequestAccess", message, onPublicProfileRequestAccessSuccess, onPublicProfileRequestAccessFailure);
    }
    pub.SaveComparableConfirmation = function (message, onSaveComparableConfirmationSuccess, onSaveComparableConfirmationFailure) {
        ajax("SaveComparableConfirmation", message, onSaveComparableConfirmationSuccess, onSaveComparableConfirmationFailure);
    }
    pub.SaveNonComparable = function (message, onSaveNonComparableSuccess, onSaveNonComparableFailure) {
        ajax("SaveNonComparable", message, onSaveNonComparableSuccess, onSaveNonComparableFailure);
    }
    pub.CheckAddressExists = function (message, onCheckAddressExistsSuccess, onCheckAddressExistsFailure) {
        ajax("CheckAddressExists", message, onCheckAddressExistsSuccess, onCheckAddressExistsFailure);
    }
    pub.checkComparablesIsUnderHaJurisdiction = function (PrecheckId, CityName, StateCode, checkComparablesIsUnderHaJurisdictionSuccess, checkComparablesIsUnderHaJurisdictionFailure) {
        var message =
        {
            PrecheckId: PrecheckId,
            CityName: CityName,
            StateCode: StateCode
        };
        ajax("CheckComparablesIsUnderHaJurisdiction", message, checkComparablesIsUnderHaJurisdictionSuccess, checkComparablesIsUnderHaJurisdictionFailure);
    }
    pub.requestForPricing = function (requestData,requestForPricingOnSuccess, requestForPricingOnFailure) {
        var message = {
            userId: requestData.userId,
            fullName: requestData.fullName,
            roleId: requestData.roleId,
            phoneNumber: requestData.phoneNumber,
            emailAddress: requestData.emailAddress,
            rentalCount: requestData.rentalCount,
            pricingRequestSourceCode: requestData.pricingRequestSourceCode,
            roleText: requestData.roleText,
            companyName: requestData.companyName,
            totalOwnedPropertiesCount: requestData.totalOwnedPropertiesCount,
            currentlyUsingPlatform: requestData.currentlyUsingPlatform,
        };
        ajax("RequestForPricing", message, requestForPricingOnSuccess, requestForPricingOnFailure);
    }
    pub.saveTenantUnsubscribe = function (requestData, saveTenantUnsubscribeOnSuccess, saveTenantUnsubscribeOnFailure) {
        var message = requestData;
        ajax("SaveTenantUnsubscribe", message, saveTenantUnsubscribeOnSuccess, saveTenantUnsubscribeOnFailure);
    }
    pub.getTenantUnsubscribe = function (requestData, getTenantUnsubscribeOnSuccess, getTenantUnsubscribeOnFailure) {
        var message = requestData;
        ajax("GetTenantUnsubscribe", message, getTenantUnsubscribeOnSuccess, getTenantUnsubscribeOnFailure);
    }

    pub.getTenantAccountPreferencesPreFilledData = function (getTenantAccountPreferencesPreFilledDataOnSuccess, getTenantAccountPreferencesPreFilledDataOnFailure) {
        var message = {};
        ajax("GetTenantAccountPreferencesPreFilledData", message, getTenantAccountPreferencesPreFilledDataOnSuccess, getTenantAccountPreferencesPreFilledDataOnFailure);
    }
    pub.saveTenantAccountPreferences = function (message, saveTenantAccountPreferencesOnSuccess, saveTenantAccountPreferencesOnFailure) {
        ajax("SaveTenantAccountPreferences", message, saveTenantAccountPreferencesOnSuccess, saveTenantAccountPreferencesOnFailure);
    }
    pub.signUpForHAOfferShown = function (signUpForHAOfferShownOnSuccess, signUpForHAOfferShownOnFailure) {
        var message = {};
        ajax("SignUpForHAOfferShown", message, signUpForHAOfferShownOnSuccess, signUpForHAOfferShownOnFailure);
    }
    pub.cancelSignUpForHAWizard = function (message, cancelSignUpForHAWizardOnSuccess, cancelSignUpForHAWizardOnFailure) {
        ajax("CancelSignUpForHAWizard", message, cancelSignUpForHAWizardOnSuccess, cancelSignUpForHAWizardOnFailure);
    }
    pub.signUpForHAOfferShouldShow = function (signUpForHAOfferShouldShowOnSuccess, signUpForHAOfferShouldShowOnFailure) {
        var message = {};
        ajax("SignUpForHAOfferShouldShow", message, signUpForHAOfferShouldShowOnSuccess, signUpForHAOfferShouldShowOnFailure);
    }

    pub.getLogoByEnterpriseContactId = function (enterpriseContactId, getLogoByEnterpriseContactIdOnSuccess, getLogoByEnterpriseContactIdOnFailure) {
        var message = {
            enterpriseContactId: enterpriseContactId
        };
        ajaxUnauthenticated("GetLogoByEnterpriseContactId", message, getLogoByEnterpriseContactIdOnSuccess, getLogoByEnterpriseContactIdOnFailure);
    }

    pub.getLimitForSpotlight = function (membershipTypeCode, limitCategory, getLimitForSpotlightOnSuccess, getLimitForSpotlightOnFailure) {
        var message = {
            membershipTypeCode: membershipTypeCode,
            limitCategory: limitCategory
        };

        ajaxrw("GetLimitForSpotlight", message, getLimitForSpotlightOnSuccess, getLimitForSpotlightOnFailure);
    }
    pub.getSpotlightAvailability = function (userId, getSpotlightAvailabilityOnSuccess, getSpotlightAvailabilityOnFailure) {
        var message = {
            userId: userId
        };

        ajaxrw("GetSpotlightAvailability", message, getSpotlightAvailabilityOnSuccess, getSpotlightAvailabilityOnFailure);
    }
    pub.getSpotlightsStatus = function (userId, getSpotlightsStatusOnSuccess, getSpotlightsStatusOnFailure) {
        var message = {
            userId: userId
        };
        ajax("GetSpotlightsStatus", message, getSpotlightsStatusOnSuccess, getSpotlightsStatusOnFailure);
    }
    pub.getCommunitiesForEnterpriseUsers = function (userId, getCommunitiesForEnterpriseUsersOnSuccess, getCommunitiesForEnterpriseUsersOnFailure) {
        var message = {
            userId: userId
        };
        ajax("GetCommunitiesForEnterpriseUsers", message, getCommunitiesForEnterpriseUsersOnSuccess, getCommunitiesForEnterpriseUsersOnFailure);
    }
    pub.saveSpotlights = function (data, saveSpotlightsOnSuccess, saveSpotlightsOnFailure) {
        var message = {
            spotlights: data.spotlights,
            userId: data.userId,
            updatedBy: data.updatedBy,
        };
        ajax("SaveSpotlights", message, saveSpotlightsOnSuccess, saveSpotlightsOnFailure);
    }
    pub.updateContactInfo = function (contactPointTypeId, verificationStatusId, allowMarketing, phoneNumber,
        createContactPointSuccess, createContactPointFailure)
    {
        var message =
        {
            contactPointTypeId: contactPointTypeId,
            verificationStatusId: verificationStatusId,
            allowMarketing: allowMarketing,
            phoneNumber: phoneNumber
        };
        ajax("CreateContactPoint", message, createContactPointSuccess, createContactPointFailure);
    }
    return pub;
}());


// Extend the default Number object with a formatMoney() method:
// usage: someVar.formatMoney(decimalPlaces, symbol, thousandsSeparator, decimalSeparator)
// defaults: (2, "$", ",", ".")

var profile = {
    FullName: "",
    FirstName: "",
    LastName: "",
    EmailAddress: "",
    PhoneNumber: "",
    UserId: "",
    UserType: "",
    CategoryType: "",
    UserDeactive: "",
    MembershipType: "",
    PropertyManager: "",
    ActiveListingsCount: "",
    InactiveListingsCount: "",
    IncompleteListingsCount: "",
    AllListingsCount: "",
    InboxCount: "",
    InboxCountNew: "",
    ProspectsCount: "",
    ProspectsCountNew: "",
    HasActiveListings: false,
    HasInactiveListings: false,
    ConfirmedEmail: '',
    Verified: '',
    HasReceivedProspectCredits: '',
    FullyRegistered: '',
    HasFreeListingBump: false,
    HasFreeProspectCredit: false,
    ListingAdded: false,
    ListingEdited: false,
    ListingIncomplete: false,
    AllowFreeListingBump: false,
    LastListingBumpExpired: false,
    ShowListingBumpExpiredBanner: false,
    ListingRemoved: false,
    QuickMatchEnabled: '',
    CanHaManageListings: false
}



//var userType = {
//    Landlord: "landlord",
//    Tenant: "tenant",
//    HousingAgency: "housingagency"
//}

Number.prototype.formatMoney = function (places, symbol, thousand, decimal) {
    places = !isNaN(places = Math.abs(places)) ? places : 2;
    symbol = symbol !== undefined ? symbol : "$";
    thousand = thousand || ",";
    decimal = decimal || ".";
    var number = this,
        negative = number < 0 ? "-" : "",
        i = parseInt(number = Math.abs(+number || 0).toFixed(places), 10) + "",
        j = (j = i.length) > 3 ? j % 3 : 0;
    return symbol + negative + (j ? i.substr(0, j) + thousand : "") + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thousand) + (places ? decimal + Math.abs(number - i).toFixed(places).slice(2) : "");
};

var usertype = {
    landlord: "landlord",
    tenant: "tenant",
    housingagency: "housingagency"
}
var ui = {
    view: "mobile"
}
var windowwidth, phone, desktop, mobile, activenav, carouselscroll, propertyid, landlordid, documentheight, windowheight, bplarge, bpmedium, bplarge, bpsmallresizecount, bplargeresizecount, usertype;
var searchplaceholder = "City, State or ZIP";
var focuscount = 0;
var mobileset = false;
var desktopset = false;
var modalvisible = false;
var lastSearch = $.cookie("searchquery");
bpsmall = "24em";
bplarge = "50em";
bpsmallresizecount = true;
bplargeresizecount = true;
var pagetitle = "";
var prospectspage = false;
var ie8 = false;
var validemail = /^\w+([-+.'\'']\w+)*@\w+([-.]\w+)*\.([A-Za-z]{2,4})$/;
var validphoneno = /^\d{10}$/;
if ($(window).width() < 800) { mobile = true; }
else { mobile = false; ui.view = "desktop" }

const recentSearchCookieName = "recent-match-data";
const lastsearchqueryCookieName = "searchquery";
const lastsearchRentalPanelList = "recent-rental-panel-list";
const lastsearchRentalPanelLocation = "recent-rental-panel-location";
const visitorAffordabilityFilter = "affordable-filter";
function closeModal() {
    $(".modal").fadeOut(300);
    $(".modalbg").fadeOut(300);
}

function displayModal(id) {
    alignModal(id);
    $("#" + id).fadeIn(300);
    $("#mainModalBg").fadeIn(300);
}

function alignPopup(id) {
}
function alignModal(id) {
}
function alignModal2(id) {
}

function searchrentals(searchlocation) {
    if (searchlocation != "" && searchlocation != searchplaceholder) {
        $.cookie("searchquery", searchlocation, { expires: 30, path: '/' });
        window.location = "/Tenant/tn_Results.aspx?Address=" + searchlocation + "&minRent=0&maxRent=20000&propertyTypeList=All Property Type&bedrooms=0&bathrooms=1&Accessible=False&radius=&pictures=False&pets=False&ac=False&coveredParking=False&MaxSqFt=20000&MinSqFt=0&keyword=&AgeRestricted=False&smoking=False";
    }
}

function loadMapApi(APIKey, channel, callback) {
    //commented this code to avoid loading of google map. as we have switched to mapBox
    /* 
    var script = document.createElement("script");
    script.type = "text/javascript";
    var serviceURL = "https://maps.googleapis.com/maps/api/js?v=3&sensor=false";
    
    if (APIKey) {
        serviceURL += "&key=" + APIKey;
    }
    if (channel) {
        serviceURL += "&channel=" + channel;
    }
    if (callback) {
        serviceURL += "&callback=" + callback;
    }
    else {
        serviceURL += "&callback=initialize";
    }
    
    script.src = serviceURL;
    document.body.appendChild(script);
    */
}

function getGlobalVars() {
    documentheight = $(document).height();
    windowheight = $(window).height();
    windowwidth = $(this).width();
    scrolltop = $(this).scrollTop();
}

function resize() {
    if (windowwidth < 783) { mobile = true; } /* bugfix ticket 11800, see comments */
    else { mobile = false; ui.view = "desktop" }
    setDevice();
}

function LogGoogleCall(source, channel, isMapping) {
    $.ajax(
        {
            type: "POST",
            url: "/googlelog.ashx",
            data: { src: source, chn: channel, ismap: isMapping }
        });
}


function setDevice() {
    if (mobile && !mobileset) {
        $("#olark").css("opacity", "0");

        $(".detailpagecontact, .mobilemenu, .mobilerefinesearch, .mobilelogo").show();
        $("body.tenant .whitelabel .mobilemenu").hide();
        $(".fixed").removeClass("fixed");
        $(".refine, nav, .submenu, .printlistfilters").hide();
        $(".noscroll").removeClass("noscroll");
        $(".mobilemenu").removeClass("close").removeClass("close2");
        $(".modalbg").first().hide();
        $(".devicetype").val("mobile");
        $(".regarding, .profilebuttons").hide();
        $("body").removeClass("back");
        $(".inboxpage  .ajax__tab_header").hide();

        $("#tabsInbox #tabsInbox_header").show();
        $(".dxgvStatusBar").css("border", "none");
        $('html,body').animate({ scrollTop: 0 });

        if ($('.inboxfilters:visible')) {
            $('body .wrapper #UpdatePanel2').css('padding', '60px 0px');
            $('#divTenantConversation').hide();
            $('#divProspectsConversation').hide();
        }
        else
        {
            $('body .wrapper #UpdatePanel2').css('padding', '0');
        }
        $("#headerControl header #portalEditorNav").show();
        mobileset = true;
        desktopset = false;
    }
    else if (!mobile && !desktopset) {
        $("#divInbox").show();
        $(".contactlandlord, .refine, nav, .mobilelogo").show();
        $(".noscroll").removeClass("noscroll");
        $(".tempactive").removeClass("tempactive");
        $(".devicetype").val("desktop");
        $(".mobilemenu, .mobilerefinesearch").removeClass("close").removeClass("close2");
        $(".detailpagecontact, .submenu").hide();
        $(".mobiletitle").html(pagetitle);
        desktopset = true;
        mobileset = false;
    }
}


function validateNumeric(event) {
    var enteredKey = (window.event) ? event.keyCode : event.which;
    if (!(enteredKey == 8                             // backspace
        || enteredKey == 9                            // Tab  
        || enteredKey == 16                           // Shift  
        || enteredKey == 46                           // delete
        || (enteredKey >= 35 && enteredKey <= 40)     // arrow keys
        || (enteredKey >= 48 && enteredKey <= 57)     // numbers on keyboard
        || (enteredKey >= 96 && enteredKey <= 105))   // number on keypad
    ) {
        event.returnValue = false;
        return false;
    }
    else {
        return true;
    }
}

function usecurrentlocation(position) {
    searchrentals(position.coords.latitude + ", " + position.coords.longitude);
}

function currentlocationerror(err) {
    alert("Sorry, we are unable to get your location at this time.");
}

function GetParameters() {
    var data = [];
    for (x = 0; x < arguments.length; ++x)
        data.push(unescape(window.location.href).match(new RegExp("/\?".concat(arguments[x], "=", "([^\n&]*)")))[1])
    return data;
}


function GetParameter() {
    var data = [];
    try {
        var value;
        for (x = 0; x < arguments.length; ++x) {
            value = unescape(window.location.href).match(new RegExp("/\?".concat(arguments[x], "=", "([^\n&]*)")));
            if (value != null)
                data.push(value[1]);
        }
        return data[0];
    }
    catch (err) { return false; }
}

function CanFavoriteHome() {
    var retVal = true;
    var ajaxData = "";
    var tenantAction = $.ajax({
        url: '/AJAX/TenantService.asmx/CanFavoriteHome',
        data: ajaxData,
        dataType: "json",
        async: false,
        type: "POST",
        contentType: "application/json; charset=utf-8",
        success: function (response) {
            retVal = response.d;
        }
    });
    return retVal;
}

function saveHome(deleteOldFavs) {
    if (deleteOldFavs === undefined)
        deleteOldFavs = true;
    if (propertyid !== '')
        SaveFavoriteHome(propertyid, deleteOldFavs);
}

function SaveFavoriteHome(propertyid, deleteOldFavs) {
    var ajaxData = JSON.stringify({ PropertyID: propertyid, DeleteOldFavs: deleteOldFavs });
    var tenantAction = $.ajax({
        url: '/AJAX/TenantService.asmx/SaveFavoriteHome',
        data: ajaxData,
        dataType: "json",
        async: false,
        type: "POST",
        contentType: "application/json; charset=utf-8",
        success: function (data) { SaveFavoriteHomeOnSuccess(data); },
    });
}

function SaveFavoriteHomeOnSuccess(response) {
    $("#SaveHomeDiv").hide();
    $("#SaveHomeDivDeactivate").show();
    //update recommended panel heart
    var itemIndex = -1;
    if (typeof (indexModel) != 'undefined' && indexModel.domain.propertyList) {
        itemIndex = _.findIndex(indexModel.domain.propertyList(), function (p) {
            return p.propertyId() == response.d;
        });
        if (itemIndex > -1) {
            indexModel.domain.propertyList()[itemIndex].propertyFavoriteClass("prop-like-icon-red");
        }
    }
    else if (typeof (haResultsModel) != 'undefined' && haResultsModel.domain.propertyList) {
        itemIndex = _.findIndex(haResultsModel.domain.propertyList(), function (p) {
            return p.propertyId() == response.d;
        });
        if (itemIndex > -1) {
            haResultsModel.domain.propertyList()[itemIndex].propertyFavoriteClass("prop-like-icon-red");
        }
    }
    else if (typeof (nonPartnerHaLandingModel) != 'undefined' && nonPartnerHaLandingModel.domain.propertyList) {
        itemIndex = _.findIndex(nonPartnerHaLandingModel.domain.propertyList(), function (p) {
            return p.propertyId() == response.d;
        });
        if (itemIndex > -1) {
            nonPartnerHaLandingModel.domain.propertyList()[itemIndex].propertyFavoriteClass("prop-like-icon-red");
        }
    }
}

function removeTenantFavoriteGridItem(ajaxMethod, ajaxData, id, type) {
    $.when(
        performTenantAction(ajaxMethod, ajaxData)
    ).then(function () {
        if (type == "favoritehomes") {
            $(".favoritehomes-" + id).remove();
            var cnt = parseInt($(".favoritehomesCnt").html().replace("(", "").replace(")", "")) - 1;
            if (cnt === 0) {
                $(".favoritehomesCnt").hide();
                $(".dvHomeNoResults").show();
            }
            else
                $(".favoritehomesCnt").html(" (" + cnt + ")");

            //update recommended panel heart
            var itemIndex = -1;
            if (typeof (indexModel) != 'undefined' && indexModel.domain.propertyList) {
                itemIndex = _.findIndex(indexModel.domain.propertyList(), function (p) {
                    return p.propertyId() == id;
                });
                if (itemIndex > -1) {
                    indexModel.domain.propertyList()[itemIndex].propertyFavoriteClass("prop-like-icon");
                }
            }
            if (typeof (haResultsModel) != 'undefined' && haResultsModel.domain.propertyList) {
                itemIndex = _.findIndex(haResultsModel.domain.propertyList(), function (p) {
                    return p.propertyId() == id;
                });
                if (itemIndex > -1) {
                    haResultsModel.domain.propertyList()[itemIndex].propertyFavoriteClass("prop-like-icon");
                }
            }
            else {
                //details page              
                var currertItemID = type + "-" + id;
                if (currertItemID === type + "-" + propertyid) {
                    $("#SaveHomeDiv").show();
                    $("#SaveHomeDivDeactivate").hide();
                }
            }



        }
        else if (type == "favoritelandlords")
        {
            var cnt = parseInt($(".favoritelandlordsCnt").html().replace("(", "").replace(")", "")) - 1;
            var intervalFn = setInterval(function () {
                if ($("#favoritelandlords-" + id).length > 0)    {
                    $("#favoritelandlords-" + id).remove();
                } else {
                    var cnt = parseInt($(".favoritelandlordsCnt").html().replace("(", "").replace(")", "")) - 1;
                    if (cnt === 0)   {
                        $(".favoritelandlordsCnt").hide();
                        $(".dvLandLordsNoResults").show();
                    }else { $(".favoritelandlordsCnt").html(" (" + cnt + ")"); }
                    clearInterval(intervalFn);
                }
            }, 100);
            var currertItemID = type + "-" + id;
            if (currertItemID === type + "-" + landlordid)  {
                $("#SaveLandlordDiv").show();
                $("#SaveLandlordDivDeactivate").hide();
            }
        }
        else {
            var intervalFn = setInterval(function () {
                if ($("#savedsearches-" + id).length > 0) {
                    $("#savedsearches-" + id).remove();
                } else {
                    var cnt = parseInt($(".favoritesearchesCnt").html().replace("(", "").replace(")", "")) - 1;
                    if (cnt === 0) {
                        $(".favoritesearchesCnt").hide();
                        $(".dvSearchesNoResults").show();
                    } else
                    { $(".favoritesearchesCnt").html(" (" + cnt + ")"); clearInterval(intervalFn); }
                }
            }, 100);
        }

    });

}
function showLoggedinTenantTopNav(callback) {

    $.ajax({ url: "/tenant/TenantNavigation.aspx", cache: false, async: false }).done(function (data) {
        var MasterNavigationWrapperHTML = $(data).find("#MasterNavigationWrapper").html();
        $("#MasterNavigationWrapper").html(MasterNavigationWrapperHTML);

      var GetUserProfile = $.ajax({
            url: "/AJAX/TenantService.asmx/GetUserProfile",
            dataType: "json",
            type: "POST",
            async: false,
            contentType: "application/json; charset=utf-8"
        });
        GetUserProfile.done(function (msg) {
            if (msg && msg.d != null) {
                var updateProfile = msg.d;
                profile.FullName = updateProfile.UserName;
                profile.FirstName = updateProfile.FirstName;
                profile.LastName = updateProfile.LastName;
                profile.EmailAddress = updateProfile.EmailAddress;
                profile.PhoneNumber = updateProfile.PhoneNumber;
                profile.UserId = updateProfile.UserId;
                profile.UserType = usertype.tenant;

                // Load header model for authenticated user
                if (profile.UserType.toLowerCase() == "tenant")
                {
                    if (ko.components.isRegistered('Tenant_Auth-Header'))
                    {
                        ko.components.unregister('Tenant_Auth-Header');
                    }
                }
                else if (profile.UserType.toLowerCase() == "landlord")
                {
                    if (ko.components.isRegistered('LL_Auth-Header'))
                    {
                        ko.components.unregister('LL_Auth-Header');
                    }
                }
               
                headerTopNav.onPageLoad();

                bindTopNavEvents();
            }
            if (callback != undefined)
            {
                callback();
            }
        });
    });

}
function performTenantAction(ajaxMethod, ajaxData) {
    var tenantAction = $.ajax({
        url: '/AJAX/TenantService.asmx/' + ajaxMethod,
        data: ajaxData,
        dataType: "json",
        async: false,
        type: "POST",
        contentType: "application/json; charset=utf-8"
    });
}
function showTenantFavorites() {
    $("#submenufavorites .submenuwrapper").addClass("loadingbg");
    $.ajax({ url: "/tenant/TenantFavorites.aspx?return=Fav", cache: false, async: true }).done(function (data)
    {
        var FavHTML = $(data).find("#favorites").html();
        $("#submenufavorites .submenuwrapper").removeClass("loadingbg").html(FavHTML);
        toggleFavorites();
    })
        .fail(function (error) {
        });
}
function showTenantSavedSearches() {
    $("#submenusavedsearches .submenuwrapper").addClass("loadingbg");
    $.ajax({ url: "/tenant/TenantFavorites.aspx?return=search", cache: false, async: true }).done(function (data)
    {
        var FavHTML = $(data).find("#savedsearches").html();
        $("#submenusavedsearches .submenuwrapper").removeClass("loadingbg").html(FavHTML);
        toggleFavorites();
    })
        .fail(function (error) {
        });
}
function bindTopNavEvents() {
    $('.menu').click(function (event) {
        event.stopPropagation();
    });
    $('#favoritehomeslink').click(function (event) {
        if (!$(this).hasClass("tempactive")) {
            showTenantFavorites();
        }
    });

    $('#savedsearcheslink').click(function (event) {
        if (!$(this).hasClass("tempactive")) {
            showTenantSavedSearches();
        }
    });

    $('#favoritehomeslinkmobile').click(function (event) {
        if (!$(this).hasClass("tempactive")) {
            showTenantFavorites();
        }
    });
    // Toggle Favorites
    toggleFavorites();

    $(".submenu").click(function () {
        if ($(this).not(".submenuwrapper")) {
            $(this).fadeOut(300);
            $(".tempactive").removeClass("tempactive");
            if (!mobile)
                $("body").removeClass("noscroll");
        }
    });

    $(".topnavsubmenu").click(function () {
        if ($(this).not(".topnavsubmenuwrapper")) {
            $(this).fadeOut(300);
            $(".tempactive").removeClass("tempactive");
            if (!mobile)
                $("body").removeClass("noscroll");
        }
    });

    $('.submenuwrapper, .topnavsubmenuwrapper').click(function (event) {
        event.stopPropagation();
    });

    bindTopMenuEvents();


    $("nav .menu li").on("click", "a.popup-show", function (event) {
        if ($(this).next().hasClass('landlord')) { $(".top-popup-outer").hide();}
        var is_visible = $(this).next().is(":visible");
        $(".top-popup-outer").hide();
        if (is_visible != false) {
            $(this).next().hide();
        }
        else {
            $(this).next().show();
        }
    });

    $("nav .menu li a").click(function () {
        $("body").removeClass("noscroll");
        $("html").removeClass("noscroll");
        $(".mobilemenu").removeClass("close2");
        $("body").addClass("bodyscroll");
    });

    $(".mobile-links-show nav .menu li a").click(function () {
        $("nav").hide();
    });

    $(document).on('click touch', function (event) {
        if (!$(event.target).parents().addBack().is('nav .menu li a')) {
            $('.top-popup-outer').hide();
            $('.top-fav-icon').removeClass("active");
            $('nav .menu li a').removeClass("tempactive");
            $("body").removeClass("noscroll");
            $("body").removeClass("bodyscroll");
        }
    });

    $('.top-popup-outer').on('click touch', function (event) {
        event.stopPropagation();
    });

    if ($('#firstName_mob').html() != undefined) {
        var profileImage = $('#profileImage').html($('#firstName').html().charAt(0));
    }

    if ($('#firstName_mob').html() != undefined) {
        var profileImage = $('#profileImage_mob').html($('#firstName_mob').html().charAt(0));
    }

}

function bindTopMenuEvents()
{
    // Patch to fix the menu binding issues until we rewrite the top menu
    for (var counter = 0; counter < $(".menu li a").length; counter++)
    {
        if ($._data($(".menu li a")[counter], "events") != undefined)
        {
            if ($._data($(".menu li a")[counter], "events").click != undefined)
            {
                if ($(".menu li a")[counter].id == "" || $(".menu li a")[counter].id == "Admenuaccount")
                {
                    while ($._data($(".menu li a")[counter], "events").click.length > 0)
                    {
                        $._data($(".menu li a")[counter], "events").click.pop();
                    }
                }
            }
        }
    }
    // Patch to fix the menu binding issues until we rewrite the top menu

}

function bindTopMenuEvents()
{
    // Patch to fix the menu binding issues until we rewrite the top menu
    for (var counter = 0; counter < $(".menu li a").length; counter++)
    {
        if ($._data($(".menu li a")[counter], "events") != undefined)
        {
            if ($._data($(".menu li a")[counter], "events").click != undefined)
            {
                if ($(".menu li a")[counter].id == "" || $(".menu li a")[counter].id == "Admenuaccount")
                {
                    while ($._data($(".menu li a")[counter], "events").click.length > 0)
                    {
                        $._data($(".menu li a")[counter], "events").click.pop();
                    }
                }
            }
        }
    }
    // Patch to fix the menu binding issues until we rewrite the top menu

    $(".menu li a").click(function ()
    {

        if ($(this).hasClass("down"))
        {

            // Close

            if ($(this).hasClass("tempactive"))
            {
                $("#" + $(this).attr("data-id")).fadeOut(300);
                $(this).removeClass("tempactive");
                if (!mobile)
                    // $(".pagecontainer").removeClass("noscroll");
                    $("body").removeClass("noscroll");
            }

            // Open

            else
            {
                $(".tempactive").removeClass("tempactive");
                $(this).addClass("tempactive");
                $(".submenu").fadeOut(300, function ()
                {
                    $("#" + $(this).attr("data-id")).fadeIn(300);
                    if (!mobile)
                        $("body").addClass("noscroll");
                });
                $(".topnavsubmenu").fadeOut(300, function ()
                {
                    $("#" + $(this).attr("data-id")).fadeIn(300);
                    if (!mobile)
                        $("body").addClass("noscroll");
                });
                $(".mobilemenu").addClass("close2");
                $("#" + $(this).attr("data-id")).fadeIn(300);
                $(".mobiletitle").html($(this).clone().children().remove().end().text());
            }
        }

    });
}

function toggleFavorites() {
    $("#submenufavorites .tab").click(function () {
        $("#submenufavorites .tabcontent").hide();
        $("#submenufavorites .tab").removeClass("active");
        $(this).addClass("active");

        if (helper.isMobile() || helper.isTablet())
        {
            $(".mobile-links-show").find("#" + $(this).attr("data-click")).show();
        }
        else
        {
            $("#" + $(this).attr("data-click")).show();
        }
    });

    // Delete Alert
    $("#submenusavedsearches .delete").click(function () {
        $(this).closest(".savedsearch").slideUp(300, function () {
            $(this).remove();
        });
    });
}

$(document).ready(function () {




    $('#savedsearcheslink').click(function (event) {
        if (!$(this).hasClass("tempactive")) {
            showTenantSavedSearches();
        }
    });

    
    switch (profile.UserType.toLowerCase()) {
        case "landlord":
            // $("body").addClass("landlord");
            break;
        case "tenant":
            $("body").addClass("tenant");
            break;
        default:
            $("body").addClass("unauthenticated");
    }

    // Set Save Search Checkbox
    if ($.cookie("savesearch") === "false")
        $("input[id$='chkSaveSearch']").prop("checked", false);

    // Close Tenant Registration Modal
    $(".closetenantregistration").click(function () {
        closeModals();
        $("input[id$='chkSaveSearch']").prop("checked", false);
        $.cookie("savesearch", false, { expires: 1, path: '/' });
        $.cookie("tnCachedSearchescookie", null, { path: '/' });
    });

    // SaveSearch Check Click
    $("input[id$='chkSaveSearch']").click(function () {
        var checkedval = $("input[id$='chkSaveSearch']").prop("checked");
        $.cookie("savesearch", checkedval, { expires: 1, path: '/' });
        if (checkedval == false)
            $.cookie("tnCachedSearchescookie", null, { path: '/' });
    });

    if ($.cookie("searchquery") != null) {
        var searchquerry1 = $.cookie("searchquery");
        if (searchquerry1 != "") {
            $(".topsearchtext").val(searchquerry1);
        }
    }

    var belowfold = false;
    var belowfoldset = false;
    var abovefoldset = false;

    $(window).resize(function () { getGlobalVars(); resize(); });
    $(document).scroll(function () {
        getGlobalVars();

        if ($(window).scrollTop() > 600)
            belowfold = true;
        else
            belowfold = false;


        if (belowfold && !belowfoldset) {
            if (!mobile)
                $(".backtotop").fadeIn();
            belowfoldset = true;
            abovefoldset = false;
        }
        else if (!belowfold && !abovefoldset) {
            if (!mobile)
                $(".backtotop").fadeOut();
            belowfoldset = false;
            abovefoldset = true;
        }

    });
    $(".backtotop").click(function () {
        $('html,body').animate({ scrollTop: 0 }, 600);
    });


    $('.stopprop, .submenuwrapper, .topnavsubmenuwrapper').click(function (event) {
        event.stopPropagation();
    });


    $("body").on("click", ".togglepassword", function () {
        var thisinput = $(this).parent().find("input[type=password]");
        var thisparent = $(this).parent();
        if (thisinput.is(":visible")) {
            thisinput.addClass("hide");
            thisparent.find("input[type=text]").removeClass("hide");
            $(this).text("Hide");
        }
        else {
            thisinput.removeClass("hide");
            thisparent.find("input[type=text]").addClass("hide");
            $(this).text("Show");
        }
    });

    $("body").on("change", ".passwordinput", function () {
        $(".passwordinput").not($(this)).val($(this).val());
    });

    $("body").on("click", ".notification .close", function () {
        $(this).closest(".notification").slideUp(300, function () {
            $(this).remove();
        });
    });

    $(".toplink").click(function (e) {

        // Close

        if ($(this).hasClass("tempactive")) {
            $("#" + $(this).attr("data-id")).fadeOut(300);
            $(this).removeClass("tempactive");
            if (!mobile)
                $(".pagecontainer").removeClass("noscroll");
        }

        // Open

        else {
            $(".tempactive").removeClass("tempactive");
            $(this).addClass("tempactive");
            $(".submenu").fadeOut(300, function () {
                $("#" + $(this).attr("data-id")).fadeIn(300);
                if (!mobile)
                    $(".pagecontainer").addClass("noscroll");
            });
            $(".topnavsubmenu").fadeOut(300, function () {
                $("#" + $(this).attr("data-id")).fadeIn(300);
                if (!mobile)
                    $(".pagecontainer").addClass("noscroll");
            });
            $(".mobilemenu").addClass("close2");
            $("#" + $(this).attr("data-id")).fadeIn(300);
            $(".mobiletitle").html($(this).clone().children().remove().end().text());
        }


    });

    // Close Submenu When background Clicked




    // Mobile Menu Open / Close / Back

    $(".mobilemenu").click(function () {

        // Back

        if ($(this).hasClass("close2")) {
            $(this).removeClass("close2");
            $(".submenu").fadeOut(300);
            if (typeof (portalDetails) !== 'undefined' && portalDetails.HaId() !== '')
            {
                $(".mobiletitle").html("");
            }
            else
            {
                $(".mobiletitle").html("Menu");
            }
            $("body, html").addClass("noscroll");
            $(".mobileback, .mobilerefinesearch, .mobilerefine, .helplink").addClass("hide");
            $(".tempactive").removeClass("tempactive");
        }

        // Close

        else if ($(this).hasClass("close")) {
            $(this).removeClass("close");
            if (typeof (portalDetails) !== 'undefined' && portalDetails.HaId() !== '')
            {
                $(".mobiletitle").html("");
            }
            else
            {
                $(".mobiletitle").html(pagetitle);
            }
            $("a#menulogin").show();
            $("nav").fadeOut(300);
            $("body, html").removeClass("noscroll");
            $(".mobileback, .mobilerefinesearch, .mobilerefine, .helplink").removeClass("hide");
        }

        // Open    

        else {
            $(this).addClass("close");
            pagetitle = $(".mobiletitle").html();
            if (typeof (portalDetails) !== 'undefined' && portalDetails.HaId() !== '')
            {
                $(".mobiletitle").html("");
            }
            else
            {
                $(".mobiletitle").html("Menu");
            }
            $("a#menulogin").hide();
            $("nav").fadeIn(300);
            $("body, html").addClass("noscroll");
            $(".mobilerefinesearch, .mobileback, .mobilerefine, .helplink").addClass("hide");
        }
    });




    $('html').click(function () {
        $(".al-link-dd").hide();
    });

    $(".mainerror, .mainsuccess").click(function () {
        $(this).slideUp();
    });

    $("body").on("click", ".modal .close, .modalbg", function () { closeModal(); });
    $(".modal .close, .modalbg").click(function () { closeModal(); });



    $("body").on("mouseenter", "nav .menu li a", function () {
        $(this).parent().addClass("mouseover");
    }).on("mouseleave", "nav .menu li a", function () {
        $(this).parent().removeClass("mouseover");
    });

    $("body").on("mouseenter", ".tooltipit", function () {
        $(this).find(".tooltip, .tooltip2, .newtooltip").show();
    }).on("mouseleave", ".tooltipit", function () {
        $(this).find(".tooltip, .tooltip2, .newtooltip").hide();
    });


    $(".currentlocation").click(function () {
        $(this).addClass("loading");
        if (navigator.geolocation) {
            navigator.geolocation.getCurrentPosition(usecurrentlocation, currentlocationerror);
        }
        else {
            alert("Geolocation is not supported by this browser.");
        }
    });

    $("body").on("click", ".closemodal", function () {
        closeModals();
    });
    pagetitle = $(".mobiletitle").html();
    getGlobalVars();
    resize();

    bindTopNavEvents();

});


function loading(action) {
    if (action == "show" || !action) {
        $(".loading").show();
    }
    else {
        $(".loading").hide();
    }
}

var mainScrollPos = 0;
function checkResults() {
    if ($(".noresultscontent").length < 1)
        $("body").removeClass("noresults");
    else
        $("body").addClass("noresults");
}

function closeModals() {
    $("body, html").removeClass("noscroll");

    if (mobile)
        $(".newmodal, .newmodalsmall").fadeOut();
    else (mobile)
    $(".newmodal:not(#contactlandlordcontainer), .newmodalsmall:not(#contactlandlordcontainer)").fadeOut();

    setTimeout(function () {
        modalvisible = false;
    }, 300);
}

function showModal(id) {
    modalvisible = true;
    mainScrollPos = $(window).scrollTop();
    $("#" + id).fadeIn(300, function () {
        $("body").addClass("noscroll");
    });
}

function lockBodyScroll(isLocked) {
    if (isLocked) {
        $('html, body').css('overflow', 'hidden');
    } else {
        $('html, body').css('overflow', '');
    }
}

function closeModalById(id) {
    $("body, html").removeClass("noscroll");
    lockBodyScroll(false);
    modalvisible = false;
    $("#" + id).fadeOut();
}

function openModalWithLockedBodyScroll(id) {
    modalvisible = true;
    $("#" + id).fadeIn(300, function () {
        lockBodyScroll(true);
    });
}


function validatelogin(thiselement) {
    var errorcount = 0;
    tabcount = 0;
    $(".loginerror").hide();
    var loginType = $("[id$='LoginType']");

    $("#" + thiselement + " .validate").each(function () {
        if ($(this).is(":visible")) {
            if ($(this).val() == "") {
                errorcount++;
                $(this).addClass("error");
            }
            else {
                if ($(this).hasClass("email") && $(this).val().match(validemail) == null) {
                    errorcount++;
                    $(this).addClass("error");

                }
                else {
                    $(this).removeClass("error");
                }
            }
        }
    });

    if (errorcount == 0) {
        var retVal = true;
        if (loginType.val().toLowerCase() === "tenant") {
            retVal = checkIsSecureTenant();
        }
        return retVal;
    }
    else {
        alert("Oops, looks like you forgot to enter some required information. Please complete the fields in red.");
        return false;
    }
}


function checkIsSecureTenant() {
    var retVal = true;
    var email = $(".loginusername").val();
    var showPswd = $("#loginpass").is(":visible");
    if (email.match(validemail) != null) {
        var message = {
            email: email
        }
        $.ajax
            ({
                type: "post",
                async: false,
                url: "/v4/AjaxHandlerUnauthenticated?message=EmailExists",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                data: JSON.stringify(message),
                success: function (response) {
                    if (response && response.exists && response.userType === 'T') {
                        if (showPswd === false)
                        {
                            LoginTenantUser(email);
                            if (response.secureAccount)
                            {
                                showRegularTenantLoggedin();
                                retVal = false;
                            }
                        } else if (response.locked)
                        {
                            $("#lockedMsg").show();
                            retVal = false;
                        }
                        else if (showPswd === true)
                        {
                            // Check landing page URL to redirect if it is set
                            if (showPswd && sessionStorage["landingpage"])
                            {
                                var path = sessionStorage["landingpage"];
                                sessionStorage.removeItem("landingpage");
                                window.location = path;
                            }
                        }
                    }
                }
            });
    }
    else if (email.match(validphoneno) != null)
    {
        if (showPswd === false)
        {
            LoginTenantUser(email);
            if (headerModel.domain.user() && headerModel.domain.profile.email())
            {
                showRegularTenantLoggedin();
                retVal = false;
            }
        }

    }
    return retVal;
}



function LoginTenantUser(userName, callback) {
    var loginuser = $.ajax({
        async: false,
        url: "/AJAX/TenantService.asmx/LoginUser",
        data: JSON.stringify({ userName: userName }),
        dataType: "json",
        type: "POST",
        contentType: "application/json; charset=utf-8"
    });
    loginuser.done(function (msg) {
        // showLoggedinTenantTopNav();
        if (callback)
        {
            callback();
        }
    });
}

function getUserLocationForPanels() {
    var location = null;
    try {
        if (profile.UserType.toLowerCase() == userType.Tenant) {
            $.ajax
                ({
                    type: "post",
                    async: false,
                    url: "/v4/AjaxHandler?message=GetTenantQMPreferredLocation",
                    contentType: "application/json; charset=utf-8",
                    dataType: "json",
                    data: "",
                    success: function (data) {
                        location = getTenantQMPreferredLocationOnSuccess(data);
                    },
                    error: function (response) {
                        // alert('error');
                    }
                });
        }
    }
    catch (ex) {
    }

    if (location == null) {
        if ($.cookie('userlastvalidsearchlocation') != null) {
            location = JSON.parse($.cookie('userlastvalidsearchlocation'));
            //clear recommendedpanelmatchtype when its last search location instead of user location
            $.cookie("recommendedpanelmatchtype", null, { path: '/' });
        }
        else if ($.cookie('userlocation') != null) {
            location = JSON.parse($.cookie('userlocation'));
        }
    }
    return location;
}

function getTenantQMPreferredLocationOnSuccess(response) {
    var preferredLocation = null;
    if (response && response.Location && response.Location.city) {
        preferredLocation =
            {
                Latitude: '',
                Longitude: '',
                City: response.Location.city,
                County: response.Location.county,
                State: response.Location.state,
                Country: 'US',
                Zip: ''
            };
        var message = {
            city: response.Location.city,
            county: response.Location.county,
            zip: '',
            state: response.Location.state

        }

        $.ajax
            ({
                type: "post",
                async: false,
                url: "/v4/AjaxHandlerUnauthenticated?message=GetLatLongForLocation",
                contentType: "application/json; charset=utf-8",
                dataType: "json",
                location: preferredLocation,
                data: JSON.stringify(message),
                success: function (response) {
                    if (response && response.latLong) {
                        this.location.Latitude = response.latLong.latitude;
                        this.location.Longitude = response.latLong.longitude;
                    }
                    preferredLocation = this.location;
                }
            });
    }
    return preferredLocation;
}

function SearchResultsPage() {
    //var location = getUserLocationForPanels();
    //var locationParam = '';
    //if (location != null && location != '') {
    //    var matchType = 'City';
    //    if ($.cookie('recommendedpanelmatchtype') != null) {
    //        matchType = $.cookie('recommendedpanelmatchtype');
    //    }

    //    if (location.City && matchType === 'City') {
    //        locationParam = location.City + ", " + location.State;
    //    }
    //    else {
    //        locationParam = location.County.replace(" County", "") + " County, " + location.State;
    //    }
    //    window.location = "/Tenant/tn_Results.aspx?Address=" + locationParam;
    //}
    //else
    //{
    //    window.location = "/Tenant/tn_Results.aspx";        
    //}

    window.location = getSearchResultsPageLink();
}

function getSearchResultsPageLink()
{
    var location = $.cookie('userlocation');
    var lastSearch = $.cookie('searchquery');
    var zipLastSearch = /^\d{5},/.test(lastSearch);
    var redirectLink = "";
    if (!helper.isUndefinedOrNullOrEmpty(lastSearch)) {
        var cklastSearch = lastSearch.split(",");
        var state = (zipLastSearch) ? $.trim(cklastSearch[2]) : $.trim(cklastSearch[1]);
        var city = (zipLastSearch) ? cklastSearch[1] : cklastSearch[0];
        redirectLink = helper.getSEOFriendlyPropertySearchUrl(state, city, null, "city");
    }
    else if (!helper.isUndefinedOrNullOrEmpty(location)) {
        var state = '', city = '';
        var jsonLocation = JSON.parse($.cookie('userlocation'));
        if (!helper.isNullOrEmpty(jsonLocation["City"]))
            city = jsonLocation["City"];
        if (!helper.isNullOrEmpty(jsonLocation["State"]))
            state = $.trim(jsonLocation["State"]);
        redirectLink = helper.getSEOFriendlyPropertySearchUrl(state, city, null, "city");
    }
    window.location = redirectLink;
    
}

function HaResultsPage() {
    var location = getUserLocationForPanels();
    var queryString = "";
    var url = "/housing-authority";
    if (location != null) {
        if (!helper.isNullOrEmpty(location.State) && helper.isNullOrEmpty(location.City) && helper.isNullOrEmpty(location.County) && helper.isNullOrEmpty(location.Zip))
            url += "-" + (helper.urlFriendlyString(location.State).toLowerCase()).replaceAll(' ', '-') + '/';
        //include County only if City is empty
        if (!helper.isNullOrEmpty(location.County) && !helper.isNullOrEmpty(location.State) && helper.isNullOrEmpty(location.City) && helper.isNullOrEmpty(location.Zip))
            url += "-" + (helper.urlFriendlyString(location.County.replace(" County", "") + " County").toLowerCase()).replaceAll(' ', '-') + '-' + (helper.urlFriendlyString(location.State).toLowerCase()).replaceAll(' ', '-') + '/';
        if (!helper.isNullOrEmpty(location.City) && !helper.isNullOrEmpty(location.State) && helper.isNullOrEmpty(location.County) && helper.isNullOrEmpty(location.Zip))
            url += "-" + (helper.urlFriendlyString(location.City).toLowerCase()).replaceAll(' ', '-') + '-' + (helper.urlFriendlyString(location.State).toLowerCase()).replaceAll(' ', '-') + '/';
        if (!helper.isNullOrEmpty(location.Zip) && !helper.isNullOrEmpty(location.State) && helper.isNullOrEmpty(location.City) && helper.isNullOrEmpty(location.County))
            url += "-" + (helper.urlFriendlyString(location.State).toLowerCase()).replaceAll(' ', '-') + '-' + location.Zip + '/';
        if (!helper.isNullOrEmpty(location.Zip) && !helper.isNullOrEmpty(location.State) && !helper.isNullOrEmpty(location.City) && !helper.isNullOrEmpty(location.County))
            url += "-" + (helper.urlFriendlyString(location.City).toLowerCase()).replaceAll(' ', '-') + '-' + (helper.urlFriendlyString(location.State).toLowerCase()).replaceAll(' ', '-') + '/';
        //replace whitespace with hyphen
        url = url.replace(/\s+/g, "-");

        window.location = url;
    } else 
    {
        window.location = url;
    }
}

function onSearchForHomesClick() {
    try {
        sessionStorage.setItem("ShouldShowFocusOnSearchText", 'true');
        window.location.href = "/";
    }
    catch (ex) {
        console.log(ex);
    }
}

function onLogout()
{
    // remove find my app cookie
    document.cookie = "fmakey=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";
}

/**
 * Validate creditcard number, returns true on valid number.
 * @param {any} value
 */
function validateCreditcard(value)
{
    // accept only digits, dashes or spaces
    if (/[^0-9-\s]+/.test(value) || value.length < 13) return false;

    // The Luhn Algorithm. It's so pretty.
    var nCheck = 0, nDigit = 0, bEven = false;
    value = value.replace(/\D/g, "");

    for (var n = value.length - 1; n >= 0; n--)
    {
        var cDigit = value.charAt(n),
            nDigit = parseInt(cDigit, 10);

        if (bEven)
        {
            if ((nDigit *= 2) > 9) nDigit -= 9;
        }

        nCheck += nDigit;
        bEven = !bEven;
    }

    return (nCheck % 10) == 0;
}

function MyWaitlistPage()
{
    window.location = "/v4/pages/myWaitlistApplications/myWaitlistApplications.aspx";
}

function setFMAKey(key)
{
    var date = new Date();
    var minutes = 15;
    date.setTime(date.getTime() + (minutes * 60 * 1000));
    $.cookie("fmakey", JSON.stringify(key), { expires: date, path: "/" });
}

// Tabs Action
const tabLink = document.querySelectorAll(".tab-menu-link");
const tabContent = document.querySelectorAll(".tab-bar-content");
$.each(tabLink, function (itemNo, item)
{
    item.addEventListener("click", activeTab);
});
function activeTab(el)
{
    const btnTarget = el.currentTarget;
    const content = btnTarget.dataset.content;
    $.each(tabContent, function (itemNo, item)
    {
        item.classList.remove("active");
    });
    $.each(tabLink, function (itemNo, item)
    {
        item.classList.remove("active");
    });
    document.querySelector("#" + content).classList.add("active");
    btnTarget.classList.add("active");
}

function topNavSignInClick()
{
    headerModel.view.topNavSignInClicked(true);
    
}

function MenuPopupClick() {
   
}

$(function ()
{
    $("#slider-range").slider({
        range: true,
        min: 0,
        max: 500,
        values: [75, 300]
    }
    );
});



$(function ()
{
    $("#accordion2").accordion();
});

$(document).ready(function ()
{
   
    $.cookie("user-recent-match-data", '', { expires: -1, path: '/', secure: true });
    $.cookie("searchResultParameters", '', { expires: -1, path: '/', secure: true });
    $.cookie("ListingIds", '', { expires: -1, path: '/', secure: true });

    $(document).ajaxComplete(function (event, xhr, settings)
    {
        if ($('#dvLandlordLeftNav').is(':visible'))
        {
            headerModel.view.isOwnerDashboardPage(true); // To hide top nav My Dashboard link
        }
        else
        {
            headerModel.view.isOwnerDashboardPage(false);
        } 
    });
    if (typeof (tnResult) !== "undefined" || (typeof (propertyDetails) !== "undefined" && $.cookie('sourcesearch') != undefined && $.cookie('sourcesearch') != null))
    {
        $.cookie("sourcesearch", "true", { expires: 365, path: '/' });
    }
    else
    {
        $.cookie("sourcesearch", null, { path: '/' });
    }
    if (typeof (LandlordListing) !== "undefined" || typeof (ownerApplicants) !== "undefined")
    {
        window.addEventListener("pageshow", function (event)
        {
            var historyTraversal = event.persisted || (typeof window.performance != "undefined" && window.performance.navigation.type === 2);
            if (historyTraversal)
            {
                window.location.reload();
            }
        });
    }
 
})

/** popover JS **/
$("#popover").click(function ()
{
    $(".popover--overlay").toggleClass("popover--overlay--show");
});
/** popover JS **/




/**
 * Script: helper.js
 *
 * @requires
 *     jquery
2 */

var helper = (function () {
	try {
		var pub = {};

        /**
        * get query string
            var qs = getQueryStrings();
            var myParam = qs["myParam"];
        */
		pub.getQueryStrings = function () {

			var queryString = location.search.substring(1);
			return getQueryStrings(queryString);
		}

        /**
        * get query string
            var qs = getQueryStrings();
            var myParam = qs["myParam"];
        */
		pub.getQueryStrings = function (queryString) {
			var assoc = {};
			var decode = function (s) { return decodeURIComponent(s.replace(/\+/g, " ")); };
			if (queryString == undefined) {
				queryString = location.search.substring(1);
			}
			var keyValues = queryString.split('&');

			for (var i in keyValues) {
				var key = keyValues[i].split('=');
				if (key.length > 1) {
					assoc[decode(key[0])] = decode(key[1]);
				}
			}

			return assoc;
		}

        /**
         * function to remove special char from string
         * Parameters - String
         */
		function replaceSpecialChars(stringValue) {
			var returnValue = '';
			returnValue = stringValue.replace(/[-*'./\",_&#^@]/g, '');
			return returnValue;
		}

		/**
		* function to encode special char from string like backslash,&,<,>
		* Parameters - String
		*/
		pub.encodeSpecialChars= function (stringValue) {
			var entityMap = {
				"&": "&amp;",
				"<": "&lt;",
				">": "&gt;",
				'"': '&quot;',
				"'": '&#39;',
				"/": '&#x2F;'
			};
			return String(stringValue).replace(/[&<>"'\/]/g, function (s) {
				return entityMap[s];
			});
		}

        /**
         * Added by Ravi Gohil
         * Function to get the SEO details URL
         * Parameters - City,State,AddressLine1,CommunityId,IsSingleUnit,CommunityName
         * Returns the SEO friendly URL
         */
		pub.returnSEOfriendlyURL = function (City, State, AddressLine1, CommunityId, IsSingleUnit, CommunityName) {
			var stringSEOUrl = ''
			if (IsSingleUnit === true) {
				stringSEOUrl = '/' + (City.toLowerCase()).replaceAll(' ', '-') + '-' + (State.toLowerCase()).replaceAll(' ', '-') + '/' + (replaceSpecialChars(AddressLine1).toLowerCase()).replaceAll(' ', '-') + '-' + CommunityId + '/';
			}
			else {
				stringSEOUrl = '/' + (City.toLowerCase()).replaceAll(' ', '-') + '-' + (State.toLowerCase()).replaceAll(' ', '-') + '/' + (replaceSpecialChars(CommunityName).toLowerCase()).replaceAll(' ', '-') + '-' + CommunityId + '/';
			}
			return stringSEOUrl;
		}

        /**
        * get query string
            var qs = getQueryStrings();
            var myParam = qs["myParam"];
        */
		pub.getQueryStringsForSEO = function (URL, QuertyStringValue) {
			var assoc = {};
			var decode = function (URL) { return decodeURIComponent(URL.replace(/\+/g, " ")); };
			var keyValues = QuertyStringValue.split('&');

			for (var i in keyValues) {
				var key = keyValues[i].split('=');
				if (key.length > 1) {
					assoc[decode(key[0])] = decode(key[1]);
				}
			}

			return assoc;
		}

        /**
            * add / update query string parameter
        */
		pub.updateQueryStringParameter = function (uri, key, value) {
			var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i");
			var separator = uri.indexOf('?') !== -1 ? "&" : "?";
			if (uri.match(re)) {
				return uri.replace(re, '$1' + key + "=" + value + '$2');
			}
			else {
				return uri + separator + key + "=" + value;
			}
		}

        /**
            * remove query string parameter from uri
        */
		pub.removeParameterFromUrl = function (uri, parameter) {
			return uri.replace(new RegExp('[?&]' + parameter + '=[^&#]*(#.*)?$'), '$1').replace(new RegExp('([?&])' + parameter + '=[^&]*&'), '$1');
		}

        /**
            * finds item in the array (code, name array) by values and returns the text            
        */
		pub.findTextInArray = function (value, arrayToSearch) {
			var item = ko.utils.arrayFirst(arrayToSearch, function (item) {
				return (item.Code == value)
			});

			if (item != null)
				return item.Name;
			else
				value;
		}

		pub.getQueryParameterByName = function (name, url) {
			if (!url) url = window.location.href;
			name = name.replace(/[\[\]]/g, "\\$&");
			var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
				results = regex.exec(url);
			if (!results) return null;
			if (!results[2]) return '';
			return decodeURIComponent(results[2].replace(/\+/g, " "));
		}
        /**
        * compare as numbers to avoid string comparison
          return 1 if value1 > value2, return 0 when equal, return -1 when value1 < value2
        */
		pub.compareAsNumber = function (value1, value2) {
			var one = parseFloat(value1);
			var two = parseFloat(value2);

			if (one > two) {
				return 1;
			}
			else if (two > one) {
				return -1;
			}
			else {
				return 0;
			}
		}

        /* return true if IE, otherwise return false
        */
		pub.isIE = function () {
			// Internet Explorer 6-11
			return /*@cc_on!@*/false || !!document.documentMode;
		}

        /**
         * return true if iOS browsder otherwise return false.
         */
		pub.isiOS = function () {
			return (/iPad|iPhone|iPod/.test(navigator.platform) ||
				(navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) &&
				!window.MSStream;
		}

		pub.updateRentalPanelAfterLogout = function () {
			var recentPanelListModel = ko.mapping.fromJS(JSON.parse(localStorage.getItem(lastsearchRentalPanelList)));
			if (recentPanelListModel() != undefined && recentPanelListModel() != null && recentPanelListModel().length > 0) {
				for (var i = 0; i < recentPanelListModel().length; i++) {
					recentPanelListModel()[i].IsTenantFavourite(false);
				}
				localStorage.setItem(lastsearchRentalPanelList, ko.toJSON(recentPanelListModel()));
			}
		}

		pub.updateRentalPanelLocalStorageIfTrustedOwnerNotExists = function () {
			var recentPanelListModelTrustedOWner = ko.mapping.fromJS(JSON.parse(localStorage.getItem(lastsearchRentalPanelList)));
			if (recentPanelListModelTrustedOWner() != undefined && recentPanelListModelTrustedOWner() != null && recentPanelListModelTrustedOWner().length > 0) {
				if (helper.isUndefinedOrNullOrEmpty(recentPanelListModelTrustedOWner()[0].HasTrustedOwnerBadge)) {
					for (var i = 0; i < recentPanelListModelTrustedOWner().length; i++) {
						recentPanelListModelTrustedOWner()[i].HasTrustedOwnerBadge = ko.observable(false);
					}
					localStorage.setItem(lastsearchRentalPanelList, ko.toJSON(recentPanelListModelTrustedOWner()));
                }				
			}
		}

        /**
         * converts the property value to Yes/No/Unknown Text
         * returns yes/no/unknown status text
         */
		pub.convertYesNoUnknown = function (param) {
			return param() === null ? 'Unknown' : (param() ? 'Yes' : 'No');
		}
		pub.getAge = function (dob) {
			return moment().diff(moment(dob, "MM/DD/YYYY"), 'years');
		}

        /**
         * Check Is mobile
         * @returns
         */
		pub.isMobile = function () {
			var check = false;
			(function (a) { if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4))) check = true; })(navigator.userAgent || navigator.vendor || window.opera);
			return check;
		}

        /**
        * Check Is mobile and tables
        * @returns
        */
		pub.isMobileAndTablet = function () {
			// Added "(navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)" condition to detect tablet for ios version 13
			var check = false;
			(function (a) { if (/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4)) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) check = true; })(navigator.userAgent || navigator.vendor || window.opera);
			return check;
		}

        /**
        * Check Is tables
        * @returns
        */
		pub.isTablet = function () {
			// Added "(navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)" condition to detect tablet for ios version 13
			var check = false;
			((function (a) { if (/ipad|android.+\d safari|tablet/i.test(a) || (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)) return true })(navigator.userAgent || navigator.vendor || window.opera)) ? check = true : check = false;
			return check;
		}

        /**
        * Check Is tables in Landscap mode.
        * @returns
        */
		pub.isTabletLandscap = function () {
			return pub.isTablet() && $(window).width() >= 1024;
		}

        /**
        * Checks if given string is undefined, null or empty
        * @returns true/false
        */
		pub.isNullOrEmpty = function (str) {
			if (!str
				|| str == null
				|| str === 'null'
				|| str === ''
				|| str === '{}'
				|| str === 'undefined'
				|| str.length === 0) {
				return true;
			}
			return false;
		}

		/**
	   * Converts given string to propert Titlecase
	   * @returns proper case
	   */
		pub.toTitleCase = function (str) {
			var str = str.toLowerCase();
			return str.replace(/(?:^|\s)\w/g, function (match) {
				return match.toUpperCase();
			});
		}

        /**
	   * Converts given string to lower case and handle null or undefined values
	   * @returns lower case
	   */
		pub.toLowerCaseWithUndefined = function (str) {
			if (pub.isUndefinedOrNullOrEmpty(str)) {
				return '';
			}

			return str.toLowerCase();
		}

        /**
		* Returns path variable from the location path when using seo friendly URL
        * @returns variable value
        */
		pub.getPathVariable = function (variable) {
			var path = location.pathname;

			var parts = path.substr(1).split('/'), value;

			while (parts.length) {
				if (parts.shift() === variable) value = parts.shift();
				else parts.shift();
			}

			return value;
		}


		pub.isUndefinedOrNullOrEmpty = function (item) {
			try {
				return (item === undefined || item === null || item === "")
			}
			catch (ex) {
				go8Error.handleException(ex);
			}
		}

        /**
       * Converts given string to propert Titlecase
       * @returns proper case
       */
		pub.toTitleCase = function (str) {
			var str = str.toLowerCase();
			return str.replace(/(?:^|\s)\w/g, function (match) {
				return match.toUpperCase();
			});
		}

        /**
        * Returns path variable from the location path when using seo friendly URL
        * @returns variable value
        */
		pub.getPathVariable = function (variable) {
			var path = location.pathname;

			var parts = path.substr(1).split('/'), value;

			while (parts.length) {
				if (parts.shift() === variable) value = parts.shift();
				else parts.shift();
			}

			return value;
		}

        /**
         * For this function required moment timezone js with data
         * https://momentjs.com/timezone/
         * Return user time zone abbreviation like JST,IST,HST,MDT
         * return time zone abbreviation
         */
		pub.timeZoneAbbr = function () {
			return moment().tz(moment.tz.guess()).zoneAbbr();
		}

        /**
         * Convert local datetime to UTC
         * @param localDate
         * @param format
         * @returns UTC datetime
         */
		pub.dateTimeToUTC = function (localDate, timeZone, format) {
			return localDateTimeToUTC(localDate, timeZone, format);
		}

		/**
		* Convert local datetime to formate
		* @param localDate
		* @param format
		* @returns UTC datetime
		*/
		pub.dateformat = function (localDate, timeZone, format) {
			return moment(localDate).format(format || 'MM/DD/YYYY hh:mm A',timeZone);
		}

		/**
		* Convert local datetime to formate
		* @param localDate
		* @param format
		* @returns UTC datetime
		*/
		pub.dateformatWithShortMonthName = function (dateVal) {
			if (dateVal == undefined || dateVal == null || dateVal == '') {
				return '';
			}
			else {
				dateVal = new Date(dateVal);
				return dateVal.toLocaleString('en-US', {
					month: 'short',
					day: 'numeric',
					year: 'numeric'
				});
			}
		}

        /**
         * add window DOM document
         * toUTC('Mon Jul 23 2018 12:03 PM', 'US/Eastern')
         * toUTC('Mon Jul 23 2018 12:03 PM', 'US/Eastern', 'MM/DD/YYYY hh:mm A')
         * @param localDate
         * @param format
         * @returns UTC datetime
         */
		window.toUTC = function (localDate, timeZone, format) {
			return localDateTimeToUTC(localDate, timeZone, format);
		}

		function localDateTimeToUTC(localDate, timeZone, format) {
			if (localDate && timeZone) {
				//return moment(localDate).utc().format(format || 'MM/DD/YYYY hh:mm A');
				return moment(moment.tz(localDate, format || 'MM/DD/YYYY hh:mm A', timeZone)).utc().format(format || 'MM/DD/YYYY hh:mm A')
			}

			return '';
		}

        /**
         * Convert UTC datetime to local
         * helper.dateTimeToLocal('Mon Jul 23 2018 12:03 PM', 'US/Eastern')
         * helper.dateTimeToLocal('Mon Jul 23 2018 12:03 PM', 'US/Eastern', 'MM/DD/YYYY hh:mm A')
         * @param utcDate
         * @param format
         * @returns local datetime
         */
		pub.dateTimeToLocal = function (utcDate, timeZone, format) {
			return utcDateTimeToLocal(utcDate, timeZone, format);
		}

        /**
         * add window DOM document
         * Convert UTC datetime to local
         * toLocal('Mon Jul 23 2018 12:03 PM', 'US/Eastern')
         * toLocal('Mon Jul 23 2018 12:03 PM', 'US/Eastern', 'MM/DD/YYYY hh:mm A')
         * @param utcDate
         * @param format
         * @returns local datetime
         */
		window.toLocal = function (utcDate, timeZone, format) {
			return utcDateTimeToLocal(utcDate, timeZone, format);
		}

		function utcDateTimeToLocal(utcDate, timeZone, format) {
			if (utcDate && timeZone) {
				//return moment.utc(utcDate).local().format(format || 'MM/DD/YYYY hh:mm A');
				return moment.utc(utcDate).tz(timeZone).format(format || 'MM/DD/YYYY hh:mm A (z)')
			}

			return '';
		}

		// Returns URL frindly string. Depends on js "speakingurl.min.js"
		pub.urlFriendlyString = function (str, options) {
			return getSlug(str, options || { maintainCase: true });
		}

        /**
         * decimal number not working
         * helper.numberFormat(100) => 100
         * helper.numberFormat(1000) => 1,000
         * helper.numberFormat(10000) => 10,000
         * helper.numberFormat(100000) => 100,000
         * helper.numberFormat(1000000) => 1,000,000
         * @param integer n: number
         * @returns formated data
         */
		pub.numberFormat = function (n) {
			if (n) {
				return (n).toString().replace(/(\d)(?=(\d{3})+(,|$))/g, '$1,');
			}

			return n;
		}

		pub.isValidURL = function (url) {
			return /^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&'\(\)\*\+,;=.]+$/gm.test(url);
		}

		pub.formatPhone = function (phone) {
			if (phone && phone !== "") {
				var pattern = /(\d{3})(\s*)(\d{3})(\s*)(\d{4})/;
				var newPhone = phone.replace("/\-/g", "");
				return newPhone.replace(pattern, "$1-$3-$5");
			}
			else {
				return "";
			}
		}

        /**
        * return Full image path based in filename. 
        */
		pub.getFullImagePath = function (fileName) {
			// imagePrePath is declared in MainLayoutResponsive.master page.
			return imagePrePath + '/' + fileName;
		}

        /**
        * Check if string 1 exists within string 2.
        */
		pub.strContainsNoCase = function (string1, string2) {
			return string1.toLowerCase().indexOf(string2.toLowerCase()) >= 0;
		}

		pub.strStartWithNoCase = function (string1, string2) {
			return string1.toLowerCase().indexOf(string2.toLowerCase()) === 0;
		}

        /**
         * Generic error handler for AJAX requests
         */
		pub.remoteOperationFailure = function (xhr, status, error) {
			try {
				user.handleOperationException(xhr, status, error);
			}
			catch (ex) {
				go8Error.handleException(ex);
			}
		}

        /**
         * User input character screening
         */
		pub.limitCharacters = function (text) {
			return text.replace(/[^a-zA-Z0-9\s,#'‘‛′’‵`′().\-]/g, '');
		}

		// Get rent display text for Listing card
		pub.getAskingRentDisplayText = function (minAskingRent, maxAskingRent, IsRentIncomeAdjusted) {
			if (IsRentIncomeAdjusted == true) {
				return "Income-based";
			}
			else {
				if (minAskingRent == maxAskingRent) {
					return "$" + minAskingRent;
				}
				else {
					return "$" + minAskingRent + "-$" + maxAskingRent;
				}
			}
		}

		// Get bed display text for Listing card
		pub.getBedDisplayText = function (minBed, maxBed) {
			var bedDisplay = '';

			if (minBed == 0) {
				bedDisplay = 'Stud';
			}
			else if (minBed > 0) {
				bedDisplay = minBed;
			}

			if (minBed == maxBed) {
				if (maxBed > 1) {
					bedDisplay += ' <span class="card--value">Bds</span>';
				}
				else if (maxBed > 0) {
					bedDisplay += ' <span class="card--value">Bd</span>';
				}
			}
			else {
				if (maxBed > 1) {
					bedDisplay += '-' + maxBed + ' <span class="card--value">Bds</span>';
				}
				else if (self.MaxBed() > 0) {
					bedDisplay += '-' + maxBed + ' <span class="card--value">Bd</span>';
				}
			}

			return bedDisplay;
		}

		// Get bath display text for Listing card
		pub.getBathDisplayText = function (minBath, maxBath, minHalfBath, maxHalfBath) {
			var bathDisplay = '';
			var halfBathDisplay = '';

			if (minBath == maxBath && minHalfBath == maxHalfBath) {
				if (minHalfBath > 1) {
					halfBathDisplay = '.5+';
				}
				else if (minHalfBath > 0) {
					halfBathDisplay = '.5';
				}
				else {
					halfBathDisplay = '';
				}

				if (minBath > 1 || (minBath > 0 && minHalfBath > 0)) {
					bathDisplay = minBath + halfBathDisplay + ' <span class="card--value">Ba</span> ';
				}
				else if (minBath > 0) {
					bathDisplay = minBath + halfBathDisplay + ' <span class="card--value">Ba</span> ';
				}
			}
			else {
				if (minHalfBath > 1) {
					halfBathDisplay = '.5+';
				}
				else if (minHalfBath > 0) {
					halfBathDisplay = '.5';
				}
				else {
					halfBathDisplay = '';
				}

				if (minBath > 1 || (minBath > 0 && minHalfBath > 0)) {
					bathDisplay = minBath + halfBathDisplay + '-';
				}
				else if (minBath > 0) {
					bathDisplay = minBath + halfBathDisplay + '-';
				}

				if (maxHalfBath > 1) {
					halfBathDisplay = '.5+';
				}
				else if (maxHalfBath > 0) {
					halfBathDisplay = '.5';
				}
				else {
					halfBathDisplay = '';
				}

				if (maxBath > 1 || (maxBath > 0 && maxHalfBath > 0)) {
					bathDisplay += maxBath + halfBathDisplay + ' <span class="card--value">Ba</span> ';
				}
				else if (maxBath > 0) {
					bathDisplay += maxBath + halfBathDisplay + ' <span class="card--value">Ba</span> ';
				}
			}

			return bathDisplay;
		}

		// Get Sqft display text for Listing card
		pub.getSqftDisplayText = function (minSqFt, maxSqFt) {
			var sqftDisplay = '';

			if (minSqFt > 0) {
				if (minSqFt == maxSqFt)
					sqftDisplay = minSqFt.toLocaleString() + ' <span class="card--value">Sqft</span>';
				else
					sqftDisplay = minSqFt.toLocaleString() + '-' + maxSqFt.toLocaleString() + ' <span class="card--value">Sqft</span>';
			}
			return sqftDisplay;
		}

		// Get full address display text for Listing card
		pub.getFullAddressText = function (addressLine1, addressLine2, city, state, zip) {
			var fullAddress = '';

			if (!pub.isUndefinedOrNullOrEmpty(addressLine1)) {
				fullAddress = addressLine1;
			}

			if (!pub.isUndefinedOrNullOrEmpty(addressLine2)) {
				fullAddress = fullAddress + ", " + addressLine2;
			}

			if (!pub.isUndefinedOrNullOrEmpty(city)) {
				fullAddress = fullAddress + ", " + city;
			}

			if (!pub.isUndefinedOrNullOrEmpty(state)) {
				fullAddress = fullAddress + ", " + state;
			}

			if (!pub.isUndefinedOrNullOrEmpty(zip)) {
				fullAddress = fullAddress + " " + zip;
			}

			return fullAddress;
		}

		// Copy to clipboard function
		pub.Clipboard = (function (window, document, navigator) {
			var textArea,
				copy;

			function isOS() {
				return navigator.userAgent.match(/ipad|iphone/i);
			}

			function createTextArea(text) {
				textArea = document.createElement('textArea');
				textArea.value = text;
				textArea.readOnly = true;
				document.body.appendChild(textArea);
			}

			function selectText() {
				var range,
					selection;

				if (isOS()) {
					range = document.createRange();
					range.selectNodeContents(textArea);
					selection = window.getSelection();
					selection.removeAllRanges();
					selection.addRange(range);
					textArea.setSelectionRange(0, 999999);
				} else {
					textArea.select();
				}
			}

			function copyToClipboard() {
				document.execCommand('copy');
				document.body.removeChild(textArea);
			}

			copy = function (text) {
				createTextArea(text);
				selectText();
				copyToClipboard();
			};

			return {
				copy: copy
			};
		})(window, document, navigator);

        /**
         * Create unique Id
         * @returns unique Id like GUID in C#
         */
		pub.createUniqueId = function (userId) {
			try {
				userId = helper.isUndefinedOrNullOrEmpty(userId) ? 0 : userId;
				return userId + '-' + moment.utc().format('YYYY-MM-DD-HH-mm-ss-SSS');
			}
			catch (ex) {
				go8Error.handleException(ex);
			}
		}

		// prevet Parent click
		pub.preventParentClick = function (event) {
			event.stopPropagation();
		}

		// Check Web GL available
		pub.webGlAvailable = function () {
			try {
				var canvas = document.createElement('canvas');
				return !!window.WebGLRenderingContext &&
					(canvas.getContext('webgl') || canvas.getContext('experimental-webgl'));
			} catch (e) {
				return false;
			}
		};

		/* SEO property search parameter cookie related region starts*/
		/**
		 * Added by Ninshid to update SEO search parameter cookie
		 * @param {any} SEOsearchResultParameters
		 */
		pub.updateSEOCookie = function (SEOsearchResultParameters) {

			$.cookie('SEOsearchResultParameters', JSON.stringify(SEOsearchResultParameters), { path: '/', secure: true });
		}

		/**
		 * Added by Ninshid to get SEO search parameter cookie data
		 */
		pub.getSEOSearchParametersCookieData = function () {
			if ($.cookie('SEOsearchResultParameters') === null) {
				$.cookie('SEOsearchResultParameters', JSON.stringify(pub.setSEOsearchResultParameters()), { path: '/', secure: true });
            }
			return JSON.parse($.cookie('SEOsearchResultParameters'));
		}

		/**
		 * Added by Ninshid to instantiate SEO search parameter data object
		 */
		pub.setSEOsearchResultParameters = function () {

			return {
				landlordUserId: 0,
				text: '',
				state: '',
				city: '',
				zip: '',
				county: '',
				bedCounts: '',
				propertyTypeCategories: '',
				keywordSearch: '',
				communityIds: '',
				page: 0,
				itemsPerPage: 0,
				maxMarkerToShow: 0,
				requiredMoreBedCounts: 0,
				minPrice: 0,
				maxPrice: 0,
				bathCount: 0,
				sortExpression: '',
				maxLatitude: 0,
				maxLongitude: 0,
				minLatitude: 0,
				minLongitude: 0,
				yearlyIncome: 0,
				returnOnlyCount: 0,
				inUnitWasherAndDryer: false,
				balconyPatio: false,
				parking: false,
				dishwasher: false,
				onsiteLaundryFacilities: false,
				fitnessCenter: false,
				communitySwimmingPool: false,
				airConditioning: false,
				utilitiesIncluded: false,
				elevator: false,
				ageRestricted: false,
				noAgeRestrictions: false,
				incomeRestricted: false,
				petFriendly: false,
				leaseIncentives: false,
				picturesOnly: false,
				returnIdsOnly: false,
				physical: false,
				visualHearing: false,
				isIncludeMapListing: false,
				isReturnAllMapListingOnly: false,
				isIncomeBaseSearch: false,
				hasSection8Voucher: false,
				isEligibilitySort: false,
				isExcludeExceedsEligibility: false,
				IsNearOrMeetAffordabilityCountOnly: false,
				minLivingArea: 0,
				maxLivingArea: 0,
				tenantUserId: 0,
				isNewLocation: 0,
				familySize: 0,
				voucherSize: 0,
				showSection8Badge: false,
				zoom : null,
				pos : null,
				center: null,
				section8: false,
				drawings: null,
				cenValueLng: null,
				cenValueLat: null,
				NCESSchoolID: 0,
				schoolId: 0,
				education: null,
				isFavViewRental: false,
				searchLocationText: '',
				isNearOrMeetIncomeResultsOnly: false

			};
		}

		/**
		 * Added by Ninshid to get SEO Friendly Property Search Url
		 * @param {any} state
		 * @param {any} param
		 * @param {any} zip
		 * @param {any} areaType
		 */
		pub.getSEOFriendlyPropertySearchUrl = function (state, param, zip, areaType) {
			var url = '/';
			if (param) {
				if (areaType === "county") {
					if ((state.toLowerCase() == "la" || state.toLowerCase() == "louisiana")) {
						url = '/' + param.replace(" ", "-") + '-parish-' + state;
					}
					else {
						url = '/' + param.replace(" ", "-") + '-county-' + state;
					}
				}
				else {
					url = '/' + param.replace(" ", "-") + '-' + state;
				}


				if (zip)
					url = url +'-'+ zip;
			}
			else if (state) {
				url = '/' + state;
            }

			return (url + '/').toLowerCase();
		}

		pub.removeSEOCookie = function (SEOsearchResultParameters) {
			$.cookie('SEOsearchResultParameters', '', { expires: -1, path: '/', secure: true });
		}

		/**
		 * function to get acronym of given string value ex. Output is JD if John Doe is passed as parameter
		 * @param {string} value
		 */
		pub.getAcronym = function (value)
		{
			if (value)
				return value.match(/\b\w/g).join('').substr(0, 2).toUpperCase();
			else
				return "";
		}

		pub.resetSessionPageFilter = function () {
			var pageFilters = JSON.parse(sessionStorage.getItem("pagefilters"));
			if (pageFilters !== null) {
				pageFilters.filter.isExcludeExceedsEligibility = false;

				//Reset all filters
				pageFilters.filter.affordableValid = true;
				pageFilters.filter.rentRange.lowRent = "";
				pageFilters.filter.rentRange.highRent = "";

				pageFilters.filter.isAffordableLegendEnable = false;
				pageFilters.filter.isIncomeBasedMatch = false;
				pageFilters.filter.isValidIncomeBasedMatch = false;
				pageFilters.filter.isLegendEnable = false;

				pageFilters.filter.selectedBedRooms.length = 0;
				pageFilters.filter.requiredMoreBedCounts = 0;
				_.forEach(pageFilters.filter.bedrooms, function (item, index) {
					item.Selected = false;
				});
				pageFilters.filter.bedrooms[0].Selected = true;

				pageFilters.filter.selectedBaths = 0;
				_.forEach(pageFilters.filter.bathrooms, function (item, index) {
					item.Selected = false;
				});
				pageFilters.filter.bathrooms[0].Selected = true;

				pageFilters.filter.selectedPropertyTypes.length = 0;
				_.forEach(pageFilters.filter.propertyTypes, function (item, index) {
					item.Selected = false;
				});
				pageFilters.filter.propertyTypes[0].Selected = true;
				pageFilters.filter.propertyTypeCategories = "";

				pageFilters.filter.squareFeetRange.low = "";
				pageFilters.filter.squareFeetRange.high = "";

				_.forEach(pageFilters.filter.amenities, function (item, index) {
					item.Selected = false;
				});

				_.forEach(pageFilters.filter.additionalFilters, function (item, index) {

					item.Selected = false;
				});



				_.forEach(pageFilters.filter.accessibility, function (item, index) {
					item.Selected = false;
				});

				pageFilters.filter.searchedKeyword = '';
				pageFilters.filter.selectedKeywords.length = 0;

				pageFilters.filter.moreFilterCount = 0;

				pageFilters.filter.returnOnlyCount = false;

				pageFilters.filter.isAgeRestrictedStrikeOut = false;
				pageFilters.filter.isNoAgeRestrictionsStrikeOut = false;

				pageFilters.filter.activeFilters.length = 0;



				sessionStorage.setItem("pagefilters", ko.toJSON(pageFilters));
			}
        }

		// SEO property search parameter cookie related region ends


        // convert all img tag to svg tag (having 'svg' as a css class) 
        function convert_svgs() {
            jQuery('img.svg').each(function () {
                var $img = jQuery(this);
                var imgID = $img.attr('id');
                var imgClass = $img.attr('class');
                var imgURL = $img.attr('src');

                jQuery.get(imgURL, function (data) {
                    // Get the SVG tag, ignore the rest
                    var $svg = jQuery(data).find('svg');

                    // Add replaced image's ID to the new SVG
                    if (typeof imgID !== 'undefined') {
                        $svg = $svg.attr('id', imgID);
                    }
                    // Add replaced image's classes to the new SVG
                    if (typeof imgClass !== 'undefined') {
                        $svg = $svg.attr('class', imgClass + ' replaced-svg');
                    }

                    // Remove any invalid XML tags as per http://validator.w3.org
                    $svg = $svg.removeAttr('xmlns:a');

                    // Replace image with new SVG
                    $img.replaceWith($svg);
                }, 'xml');
            });
        }

        convert_svgs();

		return pub;
	}
	catch (ex) {
		go8Error.handleException(ex);
	}
}
	());




!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.moment=t()}(this,function(){"use strict";var e,i;function c(){return e.apply(null,arguments)}function o(e){return e instanceof Array||"[object Array]"===Object.prototype.toString.call(e)}function u(e){return null!=e&&"[object Object]"===Object.prototype.toString.call(e)}function l(e){return void 0===e}function d(e){return"number"==typeof e||"[object Number]"===Object.prototype.toString.call(e)}function h(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function f(e,t){var n,s=[];for(n=0;n<e.length;++n)s.push(t(e[n],n));return s}function m(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function _(e,t){for(var n in t)m(t,n)&&(e[n]=t[n]);return m(t,"toString")&&(e.toString=t.toString),m(t,"valueOf")&&(e.valueOf=t.valueOf),e}function y(e,t,n,s){return Ot(e,t,n,s,!0).utc()}function g(e){return null==e._pf&&(e._pf={empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],meridiem:null,rfc2822:!1,weekdayMismatch:!1}),e._pf}function p(e){if(null==e._isValid){var t=g(e),n=i.call(t.parsedDateParts,function(e){return null!=e}),s=!isNaN(e._d.getTime())&&t.overflow<0&&!t.empty&&!t.invalidMonth&&!t.invalidWeekday&&!t.weekdayMismatch&&!t.nullInput&&!t.invalidFormat&&!t.userInvalidated&&(!t.meridiem||t.meridiem&&n);if(e._strict&&(s=s&&0===t.charsLeftOver&&0===t.unusedTokens.length&&void 0===t.bigHour),null!=Object.isFrozen&&Object.isFrozen(e))return s;e._isValid=s}return e._isValid}function v(e){var t=y(NaN);return null!=e?_(g(t),e):g(t).userInvalidated=!0,t}i=Array.prototype.some?Array.prototype.some:function(e){for(var t=Object(this),n=t.length>>>0,s=0;s<n;s++)if(s in t&&e.call(this,t[s],s,t))return!0;return!1};var r=c.momentProperties=[];function w(e,t){var n,s,i;if(l(t._isAMomentObject)||(e._isAMomentObject=t._isAMomentObject),l(t._i)||(e._i=t._i),l(t._f)||(e._f=t._f),l(t._l)||(e._l=t._l),l(t._strict)||(e._strict=t._strict),l(t._tzm)||(e._tzm=t._tzm),l(t._isUTC)||(e._isUTC=t._isUTC),l(t._offset)||(e._offset=t._offset),l(t._pf)||(e._pf=g(t)),l(t._locale)||(e._locale=t._locale),0<r.length)for(n=0;n<r.length;n++)l(i=t[s=r[n]])||(e[s]=i);return e}var t=!1;function M(e){w(this,e),this._d=new Date(null!=e._d?e._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===t&&(t=!0,c.updateOffset(this),t=!1)}function S(e){return e instanceof M||null!=e&&null!=e._isAMomentObject}function D(e){return e<0?Math.ceil(e)||0:Math.floor(e)}function k(e){var t=+e,n=0;return 0!==t&&isFinite(t)&&(n=D(t)),n}function a(e,t,n){var s,i=Math.min(e.length,t.length),r=Math.abs(e.length-t.length),a=0;for(s=0;s<i;s++)(n&&e[s]!==t[s]||!n&&k(e[s])!==k(t[s]))&&a++;return a+r}function Y(e){!1===c.suppressDeprecationWarnings&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+e)}function n(i,r){var a=!0;return _(function(){if(null!=c.deprecationHandler&&c.deprecationHandler(null,i),a){for(var e,t=[],n=0;n<arguments.length;n++){if(e="","object"==typeof arguments[n]){for(var s in e+="\n["+n+"] ",arguments[0])e+=s+": "+arguments[0][s]+", ";e=e.slice(0,-2)}else e=arguments[n];t.push(e)}Y(i+"\nArguments: "+Array.prototype.slice.call(t).join("")+"\n"+(new Error).stack),a=!1}return r.apply(this,arguments)},r)}var s,O={};function T(e,t){null!=c.deprecationHandler&&c.deprecationHandler(e,t),O[e]||(Y(t),O[e]=!0)}function x(e){return e instanceof Function||"[object Function]"===Object.prototype.toString.call(e)}function b(e,t){var n,s=_({},e);for(n in t)m(t,n)&&(u(e[n])&&u(t[n])?(s[n]={},_(s[n],e[n]),_(s[n],t[n])):null!=t[n]?s[n]=t[n]:delete s[n]);for(n in e)m(e,n)&&!m(t,n)&&u(e[n])&&(s[n]=_({},s[n]));return s}function P(e){null!=e&&this.set(e)}c.suppressDeprecationWarnings=!1,c.deprecationHandler=null,s=Object.keys?Object.keys:function(e){var t,n=[];for(t in e)m(e,t)&&n.push(t);return n};var W={};function H(e,t){var n=e.toLowerCase();W[n]=W[n+"s"]=W[t]=e}function R(e){return"string"==typeof e?W[e]||W[e.toLowerCase()]:void 0}function C(e){var t,n,s={};for(n in e)m(e,n)&&(t=R(n))&&(s[t]=e[n]);return s}var F={};function L(e,t){F[e]=t}function U(e,t,n){var s=""+Math.abs(e),i=t-s.length;return(0<=e?n?"+":"":"-")+Math.pow(10,Math.max(0,i)).toString().substr(1)+s}var N=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,G=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,V={},E={};function I(e,t,n,s){var i=s;"string"==typeof s&&(i=function(){return this[s]()}),e&&(E[e]=i),t&&(E[t[0]]=function(){return U(i.apply(this,arguments),t[1],t[2])}),n&&(E[n]=function(){return this.localeData().ordinal(i.apply(this,arguments),e)})}function A(e,t){return e.isValid()?(t=j(t,e.localeData()),V[t]=V[t]||function(s){var e,i,t,r=s.match(N);for(e=0,i=r.length;e<i;e++)E[r[e]]?r[e]=E[r[e]]:r[e]=(t=r[e]).match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"");return function(e){var t,n="";for(t=0;t<i;t++)n+=x(r[t])?r[t].call(e,s):r[t];return n}}(t),V[t](e)):e.localeData().invalidDate()}function j(e,t){var n=5;function s(e){return t.longDateFormat(e)||e}for(G.lastIndex=0;0<=n&&G.test(e);)e=e.replace(G,s),G.lastIndex=0,n-=1;return e}var Z=/\d/,z=/\d\d/,$=/\d{3}/,q=/\d{4}/,J=/[+-]?\d{6}/,B=/\d\d?/,Q=/\d\d\d\d?/,X=/\d\d\d\d\d\d?/,K=/\d{1,3}/,ee=/\d{1,4}/,te=/[+-]?\d{1,6}/,ne=/\d+/,se=/[+-]?\d+/,ie=/Z|[+-]\d\d:?\d\d/gi,re=/Z|[+-]\d\d(?::?\d\d)?/gi,ae=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,oe={};function ue(e,n,s){oe[e]=x(n)?n:function(e,t){return e&&s?s:n}}function le(e,t){return m(oe,e)?oe[e](t._strict,t._locale):new RegExp(de(e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(e,t,n,s,i){return t||n||s||i})))}function de(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var he={};function ce(e,n){var t,s=n;for("string"==typeof e&&(e=[e]),d(n)&&(s=function(e,t){t[n]=k(e)}),t=0;t<e.length;t++)he[e[t]]=s}function fe(e,i){ce(e,function(e,t,n,s){n._w=n._w||{},i(e,n._w,n,s)})}var me=0,_e=1,ye=2,ge=3,pe=4,ve=5,we=6,Me=7,Se=8;function De(e){return ke(e)?366:365}function ke(e){return e%4==0&&e%100!=0||e%400==0}I("Y",0,0,function(){var e=this.year();return e<=9999?""+e:"+"+e}),I(0,["YY",2],0,function(){return this.year()%100}),I(0,["YYYY",4],0,"year"),I(0,["YYYYY",5],0,"year"),I(0,["YYYYYY",6,!0],0,"year"),H("year","y"),L("year",1),ue("Y",se),ue("YY",B,z),ue("YYYY",ee,q),ue("YYYYY",te,J),ue("YYYYYY",te,J),ce(["YYYYY","YYYYYY"],me),ce("YYYY",function(e,t){t[me]=2===e.length?c.parseTwoDigitYear(e):k(e)}),ce("YY",function(e,t){t[me]=c.parseTwoDigitYear(e)}),ce("Y",function(e,t){t[me]=parseInt(e,10)}),c.parseTwoDigitYear=function(e){return k(e)+(68<k(e)?1900:2e3)};var Ye,Oe=Te("FullYear",!0);function Te(t,n){return function(e){return null!=e?(be(this,t,e),c.updateOffset(this,n),this):xe(this,t)}}function xe(e,t){return e.isValid()?e._d["get"+(e._isUTC?"UTC":"")+t]():NaN}function be(e,t,n){e.isValid()&&!isNaN(n)&&("FullYear"===t&&ke(e.year())&&1===e.month()&&29===e.date()?e._d["set"+(e._isUTC?"UTC":"")+t](n,e.month(),Pe(n,e.month())):e._d["set"+(e._isUTC?"UTC":"")+t](n))}function Pe(e,t){if(isNaN(e)||isNaN(t))return NaN;var n,s=(t%(n=12)+n)%n;return e+=(t-s)/12,1===s?ke(e)?29:28:31-s%7%2}Ye=Array.prototype.indexOf?Array.prototype.indexOf:function(e){var t;for(t=0;t<this.length;++t)if(this[t]===e)return t;return-1},I("M",["MM",2],"Mo",function(){return this.month()+1}),I("MMM",0,0,function(e){return this.localeData().monthsShort(this,e)}),I("MMMM",0,0,function(e){return this.localeData().months(this,e)}),H("month","M"),L("month",8),ue("M",B),ue("MM",B,z),ue("MMM",function(e,t){return t.monthsShortRegex(e)}),ue("MMMM",function(e,t){return t.monthsRegex(e)}),ce(["M","MM"],function(e,t){t[_e]=k(e)-1}),ce(["MMM","MMMM"],function(e,t,n,s){var i=n._locale.monthsParse(e,s,n._strict);null!=i?t[_e]=i:g(n).invalidMonth=e});var We=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,He="January_February_March_April_May_June_July_August_September_October_November_December".split("_");var Re="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_");function Ce(e,t){var n;if(!e.isValid())return e;if("string"==typeof t)if(/^\d+$/.test(t))t=k(t);else if(!d(t=e.localeData().monthsParse(t)))return e;return n=Math.min(e.date(),Pe(e.year(),t)),e._d["set"+(e._isUTC?"UTC":"")+"Month"](t,n),e}function Fe(e){return null!=e?(Ce(this,e),c.updateOffset(this,!0),this):xe(this,"Month")}var Le=ae;var Ue=ae;function Ne(){function e(e,t){return t.length-e.length}var t,n,s=[],i=[],r=[];for(t=0;t<12;t++)n=y([2e3,t]),s.push(this.monthsShort(n,"")),i.push(this.months(n,"")),r.push(this.months(n,"")),r.push(this.monthsShort(n,""));for(s.sort(e),i.sort(e),r.sort(e),t=0;t<12;t++)s[t]=de(s[t]),i[t]=de(i[t]);for(t=0;t<24;t++)r[t]=de(r[t]);this._monthsRegex=new RegExp("^("+r.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+i.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+s.join("|")+")","i")}function Ge(e){var t=new Date(Date.UTC.apply(null,arguments));return e<100&&0<=e&&isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e),t}function Ve(e,t,n){var s=7+t-n;return-((7+Ge(e,0,s).getUTCDay()-t)%7)+s-1}function Ee(e,t,n,s,i){var r,a,o=1+7*(t-1)+(7+n-s)%7+Ve(e,s,i);return o<=0?a=De(r=e-1)+o:o>De(e)?(r=e+1,a=o-De(e)):(r=e,a=o),{year:r,dayOfYear:a}}function Ie(e,t,n){var s,i,r=Ve(e.year(),t,n),a=Math.floor((e.dayOfYear()-r-1)/7)+1;return a<1?s=a+Ae(i=e.year()-1,t,n):a>Ae(e.year(),t,n)?(s=a-Ae(e.year(),t,n),i=e.year()+1):(i=e.year(),s=a),{week:s,year:i}}function Ae(e,t,n){var s=Ve(e,t,n),i=Ve(e+1,t,n);return(De(e)-s+i)/7}I("w",["ww",2],"wo","week"),I("W",["WW",2],"Wo","isoWeek"),H("week","w"),H("isoWeek","W"),L("week",5),L("isoWeek",5),ue("w",B),ue("ww",B,z),ue("W",B),ue("WW",B,z),fe(["w","ww","W","WW"],function(e,t,n,s){t[s.substr(0,1)]=k(e)});I("d",0,"do","day"),I("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),I("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),I("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),I("e",0,0,"weekday"),I("E",0,0,"isoWeekday"),H("day","d"),H("weekday","e"),H("isoWeekday","E"),L("day",11),L("weekday",11),L("isoWeekday",11),ue("d",B),ue("e",B),ue("E",B),ue("dd",function(e,t){return t.weekdaysMinRegex(e)}),ue("ddd",function(e,t){return t.weekdaysShortRegex(e)}),ue("dddd",function(e,t){return t.weekdaysRegex(e)}),fe(["dd","ddd","dddd"],function(e,t,n,s){var i=n._locale.weekdaysParse(e,s,n._strict);null!=i?t.d=i:g(n).invalidWeekday=e}),fe(["d","e","E"],function(e,t,n,s){t[s]=k(e)});var je="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_");var Ze="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_");var ze="Su_Mo_Tu_We_Th_Fr_Sa".split("_");var $e=ae;var qe=ae;var Je=ae;function Be(){function e(e,t){return t.length-e.length}var t,n,s,i,r,a=[],o=[],u=[],l=[];for(t=0;t<7;t++)n=y([2e3,1]).day(t),s=this.weekdaysMin(n,""),i=this.weekdaysShort(n,""),r=this.weekdays(n,""),a.push(s),o.push(i),u.push(r),l.push(s),l.push(i),l.push(r);for(a.sort(e),o.sort(e),u.sort(e),l.sort(e),t=0;t<7;t++)o[t]=de(o[t]),u[t]=de(u[t]),l[t]=de(l[t]);this._weekdaysRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+o.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+a.join("|")+")","i")}function Qe(){return this.hours()%12||12}function Xe(e,t){I(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function Ke(e,t){return t._meridiemParse}I("H",["HH",2],0,"hour"),I("h",["hh",2],0,Qe),I("k",["kk",2],0,function(){return this.hours()||24}),I("hmm",0,0,function(){return""+Qe.apply(this)+U(this.minutes(),2)}),I("hmmss",0,0,function(){return""+Qe.apply(this)+U(this.minutes(),2)+U(this.seconds(),2)}),I("Hmm",0,0,function(){return""+this.hours()+U(this.minutes(),2)}),I("Hmmss",0,0,function(){return""+this.hours()+U(this.minutes(),2)+U(this.seconds(),2)}),Xe("a",!0),Xe("A",!1),H("hour","h"),L("hour",13),ue("a",Ke),ue("A",Ke),ue("H",B),ue("h",B),ue("k",B),ue("HH",B,z),ue("hh",B,z),ue("kk",B,z),ue("hmm",Q),ue("hmmss",X),ue("Hmm",Q),ue("Hmmss",X),ce(["H","HH"],ge),ce(["k","kk"],function(e,t,n){var s=k(e);t[ge]=24===s?0:s}),ce(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),ce(["h","hh"],function(e,t,n){t[ge]=k(e),g(n).bigHour=!0}),ce("hmm",function(e,t,n){var s=e.length-2;t[ge]=k(e.substr(0,s)),t[pe]=k(e.substr(s)),g(n).bigHour=!0}),ce("hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[ge]=k(e.substr(0,s)),t[pe]=k(e.substr(s,2)),t[ve]=k(e.substr(i)),g(n).bigHour=!0}),ce("Hmm",function(e,t,n){var s=e.length-2;t[ge]=k(e.substr(0,s)),t[pe]=k(e.substr(s))}),ce("Hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[ge]=k(e.substr(0,s)),t[pe]=k(e.substr(s,2)),t[ve]=k(e.substr(i))});var et,tt=Te("Hours",!0),nt={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:He,monthsShort:Re,week:{dow:0,doy:6},weekdays:je,weekdaysMin:ze,weekdaysShort:Ze,meridiemParse:/[ap]\.?m?\.?/i},st={},it={};function rt(e){return e?e.toLowerCase().replace("_","-"):e}function at(e){var t=null;if(!st[e]&&"undefined"!=typeof module&&module&&module.exports)try{t=et._abbr,require("./locale/"+e),ot(t)}catch(e){}return st[e]}function ot(e,t){var n;return e&&((n=l(t)?lt(e):ut(e,t))?et=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),et._abbr}function ut(e,t){if(null!==t){var n,s=nt;if(t.abbr=e,null!=st[e])T("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),s=st[e]._config;else if(null!=t.parentLocale)if(null!=st[t.parentLocale])s=st[t.parentLocale]._config;else{if(null==(n=at(t.parentLocale)))return it[t.parentLocale]||(it[t.parentLocale]=[]),it[t.parentLocale].push({name:e,config:t}),null;s=n._config}return st[e]=new P(b(s,t)),it[e]&&it[e].forEach(function(e){ut(e.name,e.config)}),ot(e),st[e]}return delete st[e],null}function lt(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return et;if(!o(e)){if(t=at(e))return t;e=[e]}return function(e){for(var t,n,s,i,r=0;r<e.length;){for(t=(i=rt(e[r]).split("-")).length,n=(n=rt(e[r+1]))?n.split("-"):null;0<t;){if(s=at(i.slice(0,t).join("-")))return s;if(n&&n.length>=t&&a(i,n,!0)>=t-1)break;t--}r++}return et}(e)}function dt(e){var t,n=e._a;return n&&-2===g(e).overflow&&(t=n[_e]<0||11<n[_e]?_e:n[ye]<1||n[ye]>Pe(n[me],n[_e])?ye:n[ge]<0||24<n[ge]||24===n[ge]&&(0!==n[pe]||0!==n[ve]||0!==n[we])?ge:n[pe]<0||59<n[pe]?pe:n[ve]<0||59<n[ve]?ve:n[we]<0||999<n[we]?we:-1,g(e)._overflowDayOfYear&&(t<me||ye<t)&&(t=ye),g(e)._overflowWeeks&&-1===t&&(t=Me),g(e)._overflowWeekday&&-1===t&&(t=Se),g(e).overflow=t),e}function ht(e,t,n){return null!=e?e:null!=t?t:n}function ct(e){var t,n,s,i,r,a=[];if(!e._d){var o,u;for(o=e,u=new Date(c.now()),s=o._useUTC?[u.getUTCFullYear(),u.getUTCMonth(),u.getUTCDate()]:[u.getFullYear(),u.getMonth(),u.getDate()],e._w&&null==e._a[ye]&&null==e._a[_e]&&function(e){var t,n,s,i,r,a,o,u;if(null!=(t=e._w).GG||null!=t.W||null!=t.E)r=1,a=4,n=ht(t.GG,e._a[me],Ie(Tt(),1,4).year),s=ht(t.W,1),((i=ht(t.E,1))<1||7<i)&&(u=!0);else{r=e._locale._week.dow,a=e._locale._week.doy;var l=Ie(Tt(),r,a);n=ht(t.gg,e._a[me],l.year),s=ht(t.w,l.week),null!=t.d?((i=t.d)<0||6<i)&&(u=!0):null!=t.e?(i=t.e+r,(t.e<0||6<t.e)&&(u=!0)):i=r}s<1||s>Ae(n,r,a)?g(e)._overflowWeeks=!0:null!=u?g(e)._overflowWeekday=!0:(o=Ee(n,s,i,r,a),e._a[me]=o.year,e._dayOfYear=o.dayOfYear)}(e),null!=e._dayOfYear&&(r=ht(e._a[me],s[me]),(e._dayOfYear>De(r)||0===e._dayOfYear)&&(g(e)._overflowDayOfYear=!0),n=Ge(r,0,e._dayOfYear),e._a[_e]=n.getUTCMonth(),e._a[ye]=n.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=a[t]=s[t];for(;t<7;t++)e._a[t]=a[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[ge]&&0===e._a[pe]&&0===e._a[ve]&&0===e._a[we]&&(e._nextDay=!0,e._a[ge]=0),e._d=(e._useUTC?Ge:function(e,t,n,s,i,r,a){var o=new Date(e,t,n,s,i,r,a);return e<100&&0<=e&&isFinite(o.getFullYear())&&o.setFullYear(e),o}).apply(null,a),i=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[ge]=24),e._w&&void 0!==e._w.d&&e._w.d!==i&&(g(e).weekdayMismatch=!0)}}var ft=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,mt=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,_t=/Z|[+-]\d\d(?::?\d\d)?/,yt=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],gt=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],pt=/^\/?Date\((\-?\d+)/i;function vt(e){var t,n,s,i,r,a,o=e._i,u=ft.exec(o)||mt.exec(o);if(u){for(g(e).iso=!0,t=0,n=yt.length;t<n;t++)if(yt[t][1].exec(u[1])){i=yt[t][0],s=!1!==yt[t][2];break}if(null==i)return void(e._isValid=!1);if(u[3]){for(t=0,n=gt.length;t<n;t++)if(gt[t][1].exec(u[3])){r=(u[2]||" ")+gt[t][0];break}if(null==r)return void(e._isValid=!1)}if(!s&&null!=r)return void(e._isValid=!1);if(u[4]){if(!_t.exec(u[4]))return void(e._isValid=!1);a="Z"}e._f=i+(r||"")+(a||""),kt(e)}else e._isValid=!1}var wt=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/;function Mt(e,t,n,s,i,r){var a=[function(e){var t=parseInt(e,10);{if(t<=49)return 2e3+t;if(t<=999)return 1900+t}return t}(e),Re.indexOf(t),parseInt(n,10),parseInt(s,10),parseInt(i,10)];return r&&a.push(parseInt(r,10)),a}var St={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function Dt(e){var t,n,s,i=wt.exec(e._i.replace(/\([^)]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").replace(/^\s\s*/,"").replace(/\s\s*$/,""));if(i){var r=Mt(i[4],i[3],i[2],i[5],i[6],i[7]);if(t=i[1],n=r,s=e,t&&Ze.indexOf(t)!==new Date(n[0],n[1],n[2]).getDay()&&(g(s).weekdayMismatch=!0,!(s._isValid=!1)))return;e._a=r,e._tzm=function(e,t,n){if(e)return St[e];if(t)return 0;var s=parseInt(n,10),i=s%100;return(s-i)/100*60+i}(i[8],i[9],i[10]),e._d=Ge.apply(null,e._a),e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),g(e).rfc2822=!0}else e._isValid=!1}function kt(e){if(e._f!==c.ISO_8601)if(e._f!==c.RFC_2822){e._a=[],g(e).empty=!0;var t,n,s,i,r,a,o,u,l=""+e._i,d=l.length,h=0;for(s=j(e._f,e._locale).match(N)||[],t=0;t<s.length;t++)i=s[t],(n=(l.match(le(i,e))||[])[0])&&(0<(r=l.substr(0,l.indexOf(n))).length&&g(e).unusedInput.push(r),l=l.slice(l.indexOf(n)+n.length),h+=n.length),E[i]?(n?g(e).empty=!1:g(e).unusedTokens.push(i),a=i,u=e,null!=(o=n)&&m(he,a)&&he[a](o,u._a,u,a)):e._strict&&!n&&g(e).unusedTokens.push(i);g(e).charsLeftOver=d-h,0<l.length&&g(e).unusedInput.push(l),e._a[ge]<=12&&!0===g(e).bigHour&&0<e._a[ge]&&(g(e).bigHour=void 0),g(e).parsedDateParts=e._a.slice(0),g(e).meridiem=e._meridiem,e._a[ge]=function(e,t,n){var s;if(null==n)return t;return null!=e.meridiemHour?e.meridiemHour(t,n):(null!=e.isPM&&((s=e.isPM(n))&&t<12&&(t+=12),s||12!==t||(t=0)),t)}(e._locale,e._a[ge],e._meridiem),ct(e),dt(e)}else Dt(e);else vt(e)}function Yt(e){var t,n,s,i,r=e._i,a=e._f;return e._locale=e._locale||lt(e._l),null===r||void 0===a&&""===r?v({nullInput:!0}):("string"==typeof r&&(e._i=r=e._locale.preparse(r)),S(r)?new M(dt(r)):(h(r)?e._d=r:o(a)?function(e){var t,n,s,i,r;if(0===e._f.length)return g(e).invalidFormat=!0,e._d=new Date(NaN);for(i=0;i<e._f.length;i++)r=0,t=w({},e),null!=e._useUTC&&(t._useUTC=e._useUTC),t._f=e._f[i],kt(t),p(t)&&(r+=g(t).charsLeftOver,r+=10*g(t).unusedTokens.length,g(t).score=r,(null==s||r<s)&&(s=r,n=t));_(e,n||t)}(e):a?kt(e):l(n=(t=e)._i)?t._d=new Date(c.now()):h(n)?t._d=new Date(n.valueOf()):"string"==typeof n?(s=t,null===(i=pt.exec(s._i))?(vt(s),!1===s._isValid&&(delete s._isValid,Dt(s),!1===s._isValid&&(delete s._isValid,c.createFromInputFallback(s)))):s._d=new Date(+i[1])):o(n)?(t._a=f(n.slice(0),function(e){return parseInt(e,10)}),ct(t)):u(n)?function(e){if(!e._d){var t=C(e._i);e._a=f([t.year,t.month,t.day||t.date,t.hour,t.minute,t.second,t.millisecond],function(e){return e&&parseInt(e,10)}),ct(e)}}(t):d(n)?t._d=new Date(n):c.createFromInputFallback(t),p(e)||(e._d=null),e))}function Ot(e,t,n,s,i){var r,a={};return!0!==n&&!1!==n||(s=n,n=void 0),(u(e)&&function(e){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(e).length;var t;for(t in e)if(e.hasOwnProperty(t))return!1;return!0}(e)||o(e)&&0===e.length)&&(e=void 0),a._isAMomentObject=!0,a._useUTC=a._isUTC=i,a._l=n,a._i=e,a._f=t,a._strict=s,(r=new M(dt(Yt(a))))._nextDay&&(r.add(1,"d"),r._nextDay=void 0),r}function Tt(e,t,n,s){return Ot(e,t,n,s,!1)}c.createFromInputFallback=n("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(e){e._d=new Date(e._i+(e._useUTC?" UTC":""))}),c.ISO_8601=function(){},c.RFC_2822=function(){};var xt=n("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var e=Tt.apply(null,arguments);return this.isValid()&&e.isValid()?e<this?this:e:v()}),bt=n("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var e=Tt.apply(null,arguments);return this.isValid()&&e.isValid()?this<e?this:e:v()});function Pt(e,t){var n,s;if(1===t.length&&o(t[0])&&(t=t[0]),!t.length)return Tt();for(n=t[0],s=1;s<t.length;++s)t[s].isValid()&&!t[s][e](n)||(n=t[s]);return n}var Wt=["year","quarter","month","week","day","hour","minute","second","millisecond"];function Ht(e){var t=C(e),n=t.year||0,s=t.quarter||0,i=t.month||0,r=t.week||0,a=t.day||0,o=t.hour||0,u=t.minute||0,l=t.second||0,d=t.millisecond||0;this._isValid=function(e){for(var t in e)if(-1===Ye.call(Wt,t)||null!=e[t]&&isNaN(e[t]))return!1;for(var n=!1,s=0;s<Wt.length;++s)if(e[Wt[s]]){if(n)return!1;parseFloat(e[Wt[s]])!==k(e[Wt[s]])&&(n=!0)}return!0}(t),this._milliseconds=+d+1e3*l+6e4*u+1e3*o*60*60,this._days=+a+7*r,this._months=+i+3*s+12*n,this._data={},this._locale=lt(),this._bubble()}function Rt(e){return e instanceof Ht}function Ct(e){return e<0?-1*Math.round(-1*e):Math.round(e)}function Ft(e,n){I(e,0,0,function(){var e=this.utcOffset(),t="+";return e<0&&(e=-e,t="-"),t+U(~~(e/60),2)+n+U(~~e%60,2)})}Ft("Z",":"),Ft("ZZ",""),ue("Z",re),ue("ZZ",re),ce(["Z","ZZ"],function(e,t,n){n._useUTC=!0,n._tzm=Ut(re,e)});var Lt=/([\+\-]|\d\d)/gi;function Ut(e,t){var n=(t||"").match(e);if(null===n)return null;var s=((n[n.length-1]||[])+"").match(Lt)||["-",0,0],i=60*s[1]+k(s[2]);return 0===i?0:"+"===s[0]?i:-i}function Nt(e,t){var n,s;return t._isUTC?(n=t.clone(),s=(S(e)||h(e)?e.valueOf():Tt(e).valueOf())-n.valueOf(),n._d.setTime(n._d.valueOf()+s),c.updateOffset(n,!1),n):Tt(e).local()}function Gt(e){return 15*-Math.round(e._d.getTimezoneOffset()/15)}function Vt(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}c.updateOffset=function(){};var Et=/^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,It=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function At(e,t){var n,s,i,r=e,a=null;return Rt(e)?r={ms:e._milliseconds,d:e._days,M:e._months}:d(e)?(r={},t?r[t]=e:r.milliseconds=e):(a=Et.exec(e))?(n="-"===a[1]?-1:1,r={y:0,d:k(a[ye])*n,h:k(a[ge])*n,m:k(a[pe])*n,s:k(a[ve])*n,ms:k(Ct(1e3*a[we]))*n}):(a=It.exec(e))?(n="-"===a[1]?-1:(a[1],1),r={y:jt(a[2],n),M:jt(a[3],n),w:jt(a[4],n),d:jt(a[5],n),h:jt(a[6],n),m:jt(a[7],n),s:jt(a[8],n)}):null==r?r={}:"object"==typeof r&&("from"in r||"to"in r)&&(i=function(e,t){var n;if(!e.isValid()||!t.isValid())return{milliseconds:0,months:0};t=Nt(t,e),e.isBefore(t)?n=Zt(e,t):((n=Zt(t,e)).milliseconds=-n.milliseconds,n.months=-n.months);return n}(Tt(r.from),Tt(r.to)),(r={}).ms=i.milliseconds,r.M=i.months),s=new Ht(r),Rt(e)&&m(e,"_locale")&&(s._locale=e._locale),s}function jt(e,t){var n=e&&parseFloat(e.replace(",","."));return(isNaN(n)?0:n)*t}function Zt(e,t){var n={milliseconds:0,months:0};return n.months=t.month()-e.month()+12*(t.year()-e.year()),e.clone().add(n.months,"M").isAfter(t)&&--n.months,n.milliseconds=+t-+e.clone().add(n.months,"M"),n}function zt(s,i){return function(e,t){var n;return null===t||isNaN(+t)||(T(i,"moment()."+i+"(period, number) is deprecated. Please use moment()."+i+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),n=e,e=t,t=n),$t(this,At(e="string"==typeof e?+e:e,t),s),this}}function $t(e,t,n,s){var i=t._milliseconds,r=Ct(t._days),a=Ct(t._months);e.isValid()&&(s=null==s||s,a&&Ce(e,xe(e,"Month")+a*n),r&&be(e,"Date",xe(e,"Date")+r*n),i&&e._d.setTime(e._d.valueOf()+i*n),s&&c.updateOffset(e,r||a))}At.fn=Ht.prototype,At.invalid=function(){return At(NaN)};var qt=zt(1,"add"),Jt=zt(-1,"subtract");function Bt(e,t){var n=12*(t.year()-e.year())+(t.month()-e.month()),s=e.clone().add(n,"months");return-(n+(t-s<0?(t-s)/(s-e.clone().add(n-1,"months")):(t-s)/(e.clone().add(n+1,"months")-s)))||0}function Qt(e){var t;return void 0===e?this._locale._abbr:(null!=(t=lt(e))&&(this._locale=t),this)}c.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",c.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var Xt=n("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(e){return void 0===e?this.localeData():this.locale(e)});function Kt(){return this._locale}function en(e,t){I(0,[e,e.length],0,t)}function tn(e,t,n,s,i){var r;return null==e?Ie(this,s,i).year:((r=Ae(e,s,i))<t&&(t=r),function(e,t,n,s,i){var r=Ee(e,t,n,s,i),a=Ge(r.year,0,r.dayOfYear);return this.year(a.getUTCFullYear()),this.month(a.getUTCMonth()),this.date(a.getUTCDate()),this}.call(this,e,t,n,s,i))}I(0,["gg",2],0,function(){return this.weekYear()%100}),I(0,["GG",2],0,function(){return this.isoWeekYear()%100}),en("gggg","weekYear"),en("ggggg","weekYear"),en("GGGG","isoWeekYear"),en("GGGGG","isoWeekYear"),H("weekYear","gg"),H("isoWeekYear","GG"),L("weekYear",1),L("isoWeekYear",1),ue("G",se),ue("g",se),ue("GG",B,z),ue("gg",B,z),ue("GGGG",ee,q),ue("gggg",ee,q),ue("GGGGG",te,J),ue("ggggg",te,J),fe(["gggg","ggggg","GGGG","GGGGG"],function(e,t,n,s){t[s.substr(0,2)]=k(e)}),fe(["gg","GG"],function(e,t,n,s){t[s]=c.parseTwoDigitYear(e)}),I("Q",0,"Qo","quarter"),H("quarter","Q"),L("quarter",7),ue("Q",Z),ce("Q",function(e,t){t[_e]=3*(k(e)-1)}),I("D",["DD",2],"Do","date"),H("date","D"),L("date",9),ue("D",B),ue("DD",B,z),ue("Do",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient}),ce(["D","DD"],ye),ce("Do",function(e,t){t[ye]=k(e.match(B)[0])});var nn=Te("Date",!0);I("DDD",["DDDD",3],"DDDo","dayOfYear"),H("dayOfYear","DDD"),L("dayOfYear",4),ue("DDD",K),ue("DDDD",$),ce(["DDD","DDDD"],function(e,t,n){n._dayOfYear=k(e)}),I("m",["mm",2],0,"minute"),H("minute","m"),L("minute",14),ue("m",B),ue("mm",B,z),ce(["m","mm"],pe);var sn=Te("Minutes",!1);I("s",["ss",2],0,"second"),H("second","s"),L("second",15),ue("s",B),ue("ss",B,z),ce(["s","ss"],ve);var rn,an=Te("Seconds",!1);for(I("S",0,0,function(){return~~(this.millisecond()/100)}),I(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),I(0,["SSS",3],0,"millisecond"),I(0,["SSSS",4],0,function(){return 10*this.millisecond()}),I(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),I(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),I(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),I(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),I(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),H("millisecond","ms"),L("millisecond",16),ue("S",K,Z),ue("SS",K,z),ue("SSS",K,$),rn="SSSS";rn.length<=9;rn+="S")ue(rn,ne);function on(e,t){t[we]=k(1e3*("0."+e))}for(rn="S";rn.length<=9;rn+="S")ce(rn,on);var un=Te("Milliseconds",!1);I("z",0,0,"zoneAbbr"),I("zz",0,0,"zoneName");var ln=M.prototype;function dn(e){return e}ln.add=qt,ln.calendar=function(e,t){var n=e||Tt(),s=Nt(n,this).startOf("day"),i=c.calendarFormat(this,s)||"sameElse",r=t&&(x(t[i])?t[i].call(this,n):t[i]);return this.format(r||this.localeData().calendar(i,this,Tt(n)))},ln.clone=function(){return new M(this)},ln.diff=function(e,t,n){var s,i,r;if(!this.isValid())return NaN;if(!(s=Nt(e,this)).isValid())return NaN;switch(i=6e4*(s.utcOffset()-this.utcOffset()),t=R(t)){case"year":r=Bt(this,s)/12;break;case"month":r=Bt(this,s);break;case"quarter":r=Bt(this,s)/3;break;case"second":r=(this-s)/1e3;break;case"minute":r=(this-s)/6e4;break;case"hour":r=(this-s)/36e5;break;case"day":r=(this-s-i)/864e5;break;case"week":r=(this-s-i)/6048e5;break;default:r=this-s}return n?r:D(r)},ln.endOf=function(e){return void 0===(e=R(e))||"millisecond"===e?this:("date"===e&&(e="day"),this.startOf(e).add(1,"isoWeek"===e?"week":e).subtract(1,"ms"))},ln.format=function(e){e||(e=this.isUtc()?c.defaultFormatUtc:c.defaultFormat);var t=A(this,e);return this.localeData().postformat(t)},ln.from=function(e,t){return this.isValid()&&(S(e)&&e.isValid()||Tt(e).isValid())?At({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},ln.fromNow=function(e){return this.from(Tt(),e)},ln.to=function(e,t){return this.isValid()&&(S(e)&&e.isValid()||Tt(e).isValid())?At({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},ln.toNow=function(e){return this.to(Tt(),e)},ln.get=function(e){return x(this[e=R(e)])?this[e]():this},ln.invalidAt=function(){return g(this).overflow},ln.isAfter=function(e,t){var n=S(e)?e:Tt(e);return!(!this.isValid()||!n.isValid())&&("millisecond"===(t=R(l(t)?"millisecond":t))?this.valueOf()>n.valueOf():n.valueOf()<this.clone().startOf(t).valueOf())},ln.isBefore=function(e,t){var n=S(e)?e:Tt(e);return!(!this.isValid()||!n.isValid())&&("millisecond"===(t=R(l(t)?"millisecond":t))?this.valueOf()<n.valueOf():this.clone().endOf(t).valueOf()<n.valueOf())},ln.isBetween=function(e,t,n,s){return("("===(s=s||"()")[0]?this.isAfter(e,n):!this.isBefore(e,n))&&(")"===s[1]?this.isBefore(t,n):!this.isAfter(t,n))},ln.isSame=function(e,t){var n,s=S(e)?e:Tt(e);return!(!this.isValid()||!s.isValid())&&("millisecond"===(t=R(t||"millisecond"))?this.valueOf()===s.valueOf():(n=s.valueOf(),this.clone().startOf(t).valueOf()<=n&&n<=this.clone().endOf(t).valueOf()))},ln.isSameOrAfter=function(e,t){return this.isSame(e,t)||this.isAfter(e,t)},ln.isSameOrBefore=function(e,t){return this.isSame(e,t)||this.isBefore(e,t)},ln.isValid=function(){return p(this)},ln.lang=Xt,ln.locale=Qt,ln.localeData=Kt,ln.max=bt,ln.min=xt,ln.parsingFlags=function(){return _({},g(this))},ln.set=function(e,t){if("object"==typeof e)for(var n=function(e){var t=[];for(var n in e)t.push({unit:n,priority:F[n]});return t.sort(function(e,t){return e.priority-t.priority}),t}(e=C(e)),s=0;s<n.length;s++)this[n[s].unit](e[n[s].unit]);else if(x(this[e=R(e)]))return this[e](t);return this},ln.startOf=function(e){switch(e=R(e)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":case"date":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===e&&this.weekday(0),"isoWeek"===e&&this.isoWeekday(1),"quarter"===e&&this.month(3*Math.floor(this.month()/3)),this},ln.subtract=Jt,ln.toArray=function(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.minute(),e.second(),e.millisecond()]},ln.toObject=function(){var e=this;return{years:e.year(),months:e.month(),date:e.date(),hours:e.hours(),minutes:e.minutes(),seconds:e.seconds(),milliseconds:e.milliseconds()}},ln.toDate=function(){return new Date(this.valueOf())},ln.toISOString=function(e){if(!this.isValid())return null;var t=!0!==e,n=t?this.clone().utc():this;return n.year()<0||9999<n.year()?A(n,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):x(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",A(n,"Z")):A(n,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},ln.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e="moment",t="";this.isLocal()||(e=0===this.utcOffset()?"moment.utc":"moment.parseZone",t="Z");var n="["+e+'("]',s=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",i=t+'[")]';return this.format(n+s+"-MM-DD[T]HH:mm:ss.SSS"+i)},ln.toJSON=function(){return this.isValid()?this.toISOString():null},ln.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},ln.unix=function(){return Math.floor(this.valueOf()/1e3)},ln.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},ln.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},ln.year=Oe,ln.isLeapYear=function(){return ke(this.year())},ln.weekYear=function(e){return tn.call(this,e,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},ln.isoWeekYear=function(e){return tn.call(this,e,this.isoWeek(),this.isoWeekday(),1,4)},ln.quarter=ln.quarters=function(e){return null==e?Math.ceil((this.month()+1)/3):this.month(3*(e-1)+this.month()%3)},ln.month=Fe,ln.daysInMonth=function(){return Pe(this.year(),this.month())},ln.week=ln.weeks=function(e){var t=this.localeData().week(this);return null==e?t:this.add(7*(e-t),"d")},ln.isoWeek=ln.isoWeeks=function(e){var t=Ie(this,1,4).week;return null==e?t:this.add(7*(e-t),"d")},ln.weeksInYear=function(){var e=this.localeData()._week;return Ae(this.year(),e.dow,e.doy)},ln.isoWeeksInYear=function(){return Ae(this.year(),1,4)},ln.date=nn,ln.day=ln.days=function(e){if(!this.isValid())return null!=e?this:NaN;var t,n,s=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=e?(t=e,n=this.localeData(),e="string"!=typeof t?t:isNaN(t)?"number"==typeof(t=n.weekdaysParse(t))?t:null:parseInt(t,10),this.add(e-s,"d")):s},ln.weekday=function(e){if(!this.isValid())return null!=e?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return null==e?t:this.add(e-t,"d")},ln.isoWeekday=function(e){if(!this.isValid())return null!=e?this:NaN;if(null!=e){var t=(n=e,s=this.localeData(),"string"==typeof n?s.weekdaysParse(n)%7||7:isNaN(n)?null:n);return this.day(this.day()%7?t:t-7)}return this.day()||7;var n,s},ln.dayOfYear=function(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==e?t:this.add(e-t,"d")},ln.hour=ln.hours=tt,ln.minute=ln.minutes=sn,ln.second=ln.seconds=an,ln.millisecond=ln.milliseconds=un,ln.utcOffset=function(e,t,n){var s,i=this._offset||0;if(!this.isValid())return null!=e?this:NaN;if(null!=e){if("string"==typeof e){if(null===(e=Ut(re,e)))return this}else Math.abs(e)<16&&!n&&(e*=60);return!this._isUTC&&t&&(s=Gt(this)),this._offset=e,this._isUTC=!0,null!=s&&this.add(s,"m"),i!==e&&(!t||this._changeInProgress?$t(this,At(e-i,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,c.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?i:Gt(this)},ln.utc=function(e){return this.utcOffset(0,e)},ln.local=function(e){return this._isUTC&&(this.utcOffset(0,e),this._isUTC=!1,e&&this.subtract(Gt(this),"m")),this},ln.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var e=Ut(ie,this._i);null!=e?this.utcOffset(e):this.utcOffset(0,!0)}return this},ln.hasAlignedHourOffset=function(e){return!!this.isValid()&&(e=e?Tt(e).utcOffset():0,(this.utcOffset()-e)%60==0)},ln.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},ln.isLocal=function(){return!!this.isValid()&&!this._isUTC},ln.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},ln.isUtc=Vt,ln.isUTC=Vt,ln.zoneAbbr=function(){return this._isUTC?"UTC":""},ln.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},ln.dates=n("dates accessor is deprecated. Use date instead.",nn),ln.months=n("months accessor is deprecated. Use month instead",Fe),ln.years=n("years accessor is deprecated. Use year instead",Oe),ln.zone=n("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,t){return null!=e?("string"!=typeof e&&(e=-e),this.utcOffset(e,t),this):-this.utcOffset()}),ln.isDSTShifted=n("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!l(this._isDSTShifted))return this._isDSTShifted;var e={};if(w(e,this),(e=Yt(e))._a){var t=e._isUTC?y(e._a):Tt(e._a);this._isDSTShifted=this.isValid()&&0<a(e._a,t.toArray())}else this._isDSTShifted=!1;return this._isDSTShifted});var hn=P.prototype;function cn(e,t,n,s){var i=lt(),r=y().set(s,t);return i[n](r,e)}function fn(e,t,n){if(d(e)&&(t=e,e=void 0),e=e||"",null!=t)return cn(e,t,n,"month");var s,i=[];for(s=0;s<12;s++)i[s]=cn(e,s,n,"month");return i}function mn(e,t,n,s){"boolean"==typeof e?d(t)&&(n=t,t=void 0):(t=e,e=!1,d(n=t)&&(n=t,t=void 0)),t=t||"";var i,r=lt(),a=e?r._week.dow:0;if(null!=n)return cn(t,(n+a)%7,s,"day");var o=[];for(i=0;i<7;i++)o[i]=cn(t,(i+a)%7,s,"day");return o}hn.calendar=function(e,t,n){var s=this._calendar[e]||this._calendar.sameElse;return x(s)?s.call(t,n):s},hn.longDateFormat=function(e){var t=this._longDateFormat[e],n=this._longDateFormat[e.toUpperCase()];return t||!n?t:(this._longDateFormat[e]=n.replace(/MMMM|MM|DD|dddd/g,function(e){return e.slice(1)}),this._longDateFormat[e])},hn.invalidDate=function(){return this._invalidDate},hn.ordinal=function(e){return this._ordinal.replace("%d",e)},hn.preparse=dn,hn.postformat=dn,hn.relativeTime=function(e,t,n,s){var i=this._relativeTime[n];return x(i)?i(e,t,n,s):i.replace(/%d/i,e)},hn.pastFuture=function(e,t){var n=this._relativeTime[0<e?"future":"past"];return x(n)?n(t):n.replace(/%s/i,t)},hn.set=function(e){var t,n;for(n in e)x(t=e[n])?this[n]=t:this["_"+n]=t;this._config=e,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},hn.months=function(e,t){return e?o(this._months)?this._months[e.month()]:this._months[(this._months.isFormat||We).test(t)?"format":"standalone"][e.month()]:o(this._months)?this._months:this._months.standalone},hn.monthsShort=function(e,t){return e?o(this._monthsShort)?this._monthsShort[e.month()]:this._monthsShort[We.test(t)?"format":"standalone"][e.month()]:o(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},hn.monthsParse=function(e,t,n){var s,i,r;if(this._monthsParseExact)return function(e,t,n){var s,i,r,a=e.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],s=0;s<12;++s)r=y([2e3,s]),this._shortMonthsParse[s]=this.monthsShort(r,"").toLocaleLowerCase(),this._longMonthsParse[s]=this.months(r,"").toLocaleLowerCase();return n?"MMM"===t?-1!==(i=Ye.call(this._shortMonthsParse,a))?i:null:-1!==(i=Ye.call(this._longMonthsParse,a))?i:null:"MMM"===t?-1!==(i=Ye.call(this._shortMonthsParse,a))?i:-1!==(i=Ye.call(this._longMonthsParse,a))?i:null:-1!==(i=Ye.call(this._longMonthsParse,a))?i:-1!==(i=Ye.call(this._shortMonthsParse,a))?i:null}.call(this,e,t,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),s=0;s<12;s++){if(i=y([2e3,s]),n&&!this._longMonthsParse[s]&&(this._longMonthsParse[s]=new RegExp("^"+this.months(i,"").replace(".","")+"$","i"),this._shortMonthsParse[s]=new RegExp("^"+this.monthsShort(i,"").replace(".","")+"$","i")),n||this._monthsParse[s]||(r="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[s]=new RegExp(r.replace(".",""),"i")),n&&"MMMM"===t&&this._longMonthsParse[s].test(e))return s;if(n&&"MMM"===t&&this._shortMonthsParse[s].test(e))return s;if(!n&&this._monthsParse[s].test(e))return s}},hn.monthsRegex=function(e){return this._monthsParseExact?(m(this,"_monthsRegex")||Ne.call(this),e?this._monthsStrictRegex:this._monthsRegex):(m(this,"_monthsRegex")||(this._monthsRegex=Ue),this._monthsStrictRegex&&e?this._monthsStrictRegex:this._monthsRegex)},hn.monthsShortRegex=function(e){return this._monthsParseExact?(m(this,"_monthsRegex")||Ne.call(this),e?this._monthsShortStrictRegex:this._monthsShortRegex):(m(this,"_monthsShortRegex")||(this._monthsShortRegex=Le),this._monthsShortStrictRegex&&e?this._monthsShortStrictRegex:this._monthsShortRegex)},hn.week=function(e){return Ie(e,this._week.dow,this._week.doy).week},hn.firstDayOfYear=function(){return this._week.doy},hn.firstDayOfWeek=function(){return this._week.dow},hn.weekdays=function(e,t){return e?o(this._weekdays)?this._weekdays[e.day()]:this._weekdays[this._weekdays.isFormat.test(t)?"format":"standalone"][e.day()]:o(this._weekdays)?this._weekdays:this._weekdays.standalone},hn.weekdaysMin=function(e){return e?this._weekdaysMin[e.day()]:this._weekdaysMin},hn.weekdaysShort=function(e){return e?this._weekdaysShort[e.day()]:this._weekdaysShort},hn.weekdaysParse=function(e,t,n){var s,i,r;if(this._weekdaysParseExact)return function(e,t,n){var s,i,r,a=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],s=0;s<7;++s)r=y([2e3,1]).day(s),this._minWeekdaysParse[s]=this.weekdaysMin(r,"").toLocaleLowerCase(),this._shortWeekdaysParse[s]=this.weekdaysShort(r,"").toLocaleLowerCase(),this._weekdaysParse[s]=this.weekdays(r,"").toLocaleLowerCase();return n?"dddd"===t?-1!==(i=Ye.call(this._weekdaysParse,a))?i:null:"ddd"===t?-1!==(i=Ye.call(this._shortWeekdaysParse,a))?i:null:-1!==(i=Ye.call(this._minWeekdaysParse,a))?i:null:"dddd"===t?-1!==(i=Ye.call(this._weekdaysParse,a))?i:-1!==(i=Ye.call(this._shortWeekdaysParse,a))?i:-1!==(i=Ye.call(this._minWeekdaysParse,a))?i:null:"ddd"===t?-1!==(i=Ye.call(this._shortWeekdaysParse,a))?i:-1!==(i=Ye.call(this._weekdaysParse,a))?i:-1!==(i=Ye.call(this._minWeekdaysParse,a))?i:null:-1!==(i=Ye.call(this._minWeekdaysParse,a))?i:-1!==(i=Ye.call(this._weekdaysParse,a))?i:-1!==(i=Ye.call(this._shortWeekdaysParse,a))?i:null}.call(this,e,t,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),s=0;s<7;s++){if(i=y([2e3,1]).day(s),n&&!this._fullWeekdaysParse[s]&&(this._fullWeekdaysParse[s]=new RegExp("^"+this.weekdays(i,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[s]=new RegExp("^"+this.weekdaysShort(i,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[s]=new RegExp("^"+this.weekdaysMin(i,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[s]||(r="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[s]=new RegExp(r.replace(".",""),"i")),n&&"dddd"===t&&this._fullWeekdaysParse[s].test(e))return s;if(n&&"ddd"===t&&this._shortWeekdaysParse[s].test(e))return s;if(n&&"dd"===t&&this._minWeekdaysParse[s].test(e))return s;if(!n&&this._weekdaysParse[s].test(e))return s}},hn.weekdaysRegex=function(e){return this._weekdaysParseExact?(m(this,"_weekdaysRegex")||Be.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(m(this,"_weekdaysRegex")||(this._weekdaysRegex=$e),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)},hn.weekdaysShortRegex=function(e){return this._weekdaysParseExact?(m(this,"_weekdaysRegex")||Be.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(m(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=qe),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},hn.weekdaysMinRegex=function(e){return this._weekdaysParseExact?(m(this,"_weekdaysRegex")||Be.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(m(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Je),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},hn.isPM=function(e){return"p"===(e+"").toLowerCase().charAt(0)},hn.meridiem=function(e,t,n){return 11<e?n?"pm":"PM":n?"am":"AM"},ot("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10;return e+(1===k(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")}}),c.lang=n("moment.lang is deprecated. Use moment.locale instead.",ot),c.langData=n("moment.langData is deprecated. Use moment.localeData instead.",lt);var _n=Math.abs;function yn(e,t,n,s){var i=At(t,n);return e._milliseconds+=s*i._milliseconds,e._days+=s*i._days,e._months+=s*i._months,e._bubble()}function gn(e){return e<0?Math.floor(e):Math.ceil(e)}function pn(e){return 4800*e/146097}function vn(e){return 146097*e/4800}function wn(e){return function(){return this.as(e)}}var Mn=wn("ms"),Sn=wn("s"),Dn=wn("m"),kn=wn("h"),Yn=wn("d"),On=wn("w"),Tn=wn("M"),xn=wn("y");function bn(e){return function(){return this.isValid()?this._data[e]:NaN}}var Pn=bn("milliseconds"),Wn=bn("seconds"),Hn=bn("minutes"),Rn=bn("hours"),Cn=bn("days"),Fn=bn("months"),Ln=bn("years");var Un=Math.round,Nn={ss:44,s:45,m:45,h:22,d:26,M:11};var Gn=Math.abs;function Vn(e){return(0<e)-(e<0)||+e}function En(){if(!this.isValid())return this.localeData().invalidDate();var e,t,n=Gn(this._milliseconds)/1e3,s=Gn(this._days),i=Gn(this._months);t=D((e=D(n/60))/60),n%=60,e%=60;var r=D(i/12),a=i%=12,o=s,u=t,l=e,d=n?n.toFixed(3).replace(/\.?0+$/,""):"",h=this.asSeconds();if(!h)return"P0D";var c=h<0?"-":"",f=Vn(this._months)!==Vn(h)?"-":"",m=Vn(this._days)!==Vn(h)?"-":"",_=Vn(this._milliseconds)!==Vn(h)?"-":"";return c+"P"+(r?f+r+"Y":"")+(a?f+a+"M":"")+(o?m+o+"D":"")+(u||l||d?"T":"")+(u?_+u+"H":"")+(l?_+l+"M":"")+(d?_+d+"S":"")}var In=Ht.prototype;return In.isValid=function(){return this._isValid},In.abs=function(){var e=this._data;return this._milliseconds=_n(this._milliseconds),this._days=_n(this._days),this._months=_n(this._months),e.milliseconds=_n(e.milliseconds),e.seconds=_n(e.seconds),e.minutes=_n(e.minutes),e.hours=_n(e.hours),e.months=_n(e.months),e.years=_n(e.years),this},In.add=function(e,t){return yn(this,e,t,1)},In.subtract=function(e,t){return yn(this,e,t,-1)},In.as=function(e){if(!this.isValid())return NaN;var t,n,s=this._milliseconds;if("month"===(e=R(e))||"year"===e)return t=this._days+s/864e5,n=this._months+pn(t),"month"===e?n:n/12;switch(t=this._days+Math.round(vn(this._months)),e){case"week":return t/7+s/6048e5;case"day":return t+s/864e5;case"hour":return 24*t+s/36e5;case"minute":return 1440*t+s/6e4;case"second":return 86400*t+s/1e3;case"millisecond":return Math.floor(864e5*t)+s;default:throw new Error("Unknown unit "+e)}},In.asMilliseconds=Mn,In.asSeconds=Sn,In.asMinutes=Dn,In.asHours=kn,In.asDays=Yn,In.asWeeks=On,In.asMonths=Tn,In.asYears=xn,In.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*k(this._months/12):NaN},In._bubble=function(){var e,t,n,s,i,r=this._milliseconds,a=this._days,o=this._months,u=this._data;return 0<=r&&0<=a&&0<=o||r<=0&&a<=0&&o<=0||(r+=864e5*gn(vn(o)+a),o=a=0),u.milliseconds=r%1e3,e=D(r/1e3),u.seconds=e%60,t=D(e/60),u.minutes=t%60,n=D(t/60),u.hours=n%24,o+=i=D(pn(a+=D(n/24))),a-=gn(vn(i)),s=D(o/12),o%=12,u.days=a,u.months=o,u.years=s,this},In.clone=function(){return At(this)},In.get=function(e){return e=R(e),this.isValid()?this[e+"s"]():NaN},In.milliseconds=Pn,In.seconds=Wn,In.minutes=Hn,In.hours=Rn,In.days=Cn,In.weeks=function(){return D(this.days()/7)},In.months=Fn,In.years=Ln,In.humanize=function(e){if(!this.isValid())return this.localeData().invalidDate();var t,n,s,i,r,a,o,u,l,d,h,c=this.localeData(),f=(n=!e,s=c,i=At(t=this).abs(),r=Un(i.as("s")),a=Un(i.as("m")),o=Un(i.as("h")),u=Un(i.as("d")),l=Un(i.as("M")),d=Un(i.as("y")),(h=r<=Nn.ss&&["s",r]||r<Nn.s&&["ss",r]||a<=1&&["m"]||a<Nn.m&&["mm",a]||o<=1&&["h"]||o<Nn.h&&["hh",o]||u<=1&&["d"]||u<Nn.d&&["dd",u]||l<=1&&["M"]||l<Nn.M&&["MM",l]||d<=1&&["y"]||["yy",d])[2]=n,h[3]=0<+t,h[4]=s,function(e,t,n,s,i){return i.relativeTime(t||1,!!n,e,s)}.apply(null,h));return e&&(f=c.pastFuture(+this,f)),c.postformat(f)},In.toISOString=En,In.toString=En,In.toJSON=En,In.locale=Qt,In.localeData=Kt,In.toIsoString=n("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",En),In.lang=Xt,I("X",0,0,"unix"),I("x",0,0,"valueOf"),ue("x",se),ue("X",/[+-]?\d+(\.\d{1,3})?/),ce("X",function(e,t,n){n._d=new Date(1e3*parseFloat(e,10))}),ce("x",function(e,t,n){n._d=new Date(k(e))}),c.version="2.22.2",e=Tt,c.fn=ln,c.min=function(){return Pt("isBefore",[].slice.call(arguments,0))},c.max=function(){return Pt("isAfter",[].slice.call(arguments,0))},c.now=function(){return Date.now?Date.now():+new Date},c.utc=y,c.unix=function(e){return Tt(1e3*e)},c.months=function(e,t){return fn(e,t,"months")},c.isDate=h,c.locale=ot,c.invalid=v,c.duration=At,c.isMoment=S,c.weekdays=function(e,t,n){return mn(e,t,n,"weekdays")},c.parseZone=function(){return Tt.apply(null,arguments).parseZone()},c.localeData=lt,c.isDuration=Rt,c.monthsShort=function(e,t){return fn(e,t,"monthsShort")},c.weekdaysMin=function(e,t,n){return mn(e,t,n,"weekdaysMin")},c.defineLocale=ut,c.updateLocale=function(e,t){if(null!=t){var n,s,i=nt;null!=(s=at(e))&&(i=s._config),(n=new P(t=b(i,t))).parentLocale=st[e],st[e]=n,ot(e)}else null!=st[e]&&(null!=st[e].parentLocale?st[e]=st[e].parentLocale:null!=st[e]&&delete st[e]);return st[e]},c.locales=function(){return s(st)},c.weekdaysShort=function(e,t,n){return mn(e,t,n,"weekdaysShort")},c.normalizeUnits=R,c.relativeTimeRounding=function(e){return void 0===e?Un:"function"==typeof e&&(Un=e,!0)},c.relativeTimeThreshold=function(e,t){return void 0!==Nn[e]&&(void 0===t?Nn[e]:(Nn[e]=t,"s"===e&&(Nn.ss=t-1),!0))},c.calendarFormat=function(e,t){var n=e.diff(t,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"},c.prototype=ln,c.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"YYYY-[W]WW",MONTH:"YYYY-MM"},c});

var loader = (function () {
    try {
        var pub = {
            useGlobalAjax: ko.observable(true),
            showLoading: ko.observable(false),
            timerId : []
        };

        pub.initilaize = function () {
            bodymovin.loadAnimation({
                container: document.getElementById('loadinganim'),
                renderer: 'svg',
                loop: true,
                autoplay: true,
                path: '/v4/js/loading-anim.json'
            });
        }

        $(document).ajaxError(function ()
        {
            if (pub.useGlobalAjax())
                pub.showLoading(false);
        });

        $(document).ajaxStop(function ()
        {
            if (pub.useGlobalAjax())
                pub.showLoading(false);
        });

        return pub;
    } catch (ex) {
        go8Error.handleException(ex);
    }
}
    ());

var displayValue = function (element, valueAccessor) {
    var value = ko.utils.unwrapObservable(valueAccessor());
    let content = document.getElementById('loadinganim');

    var svgelement = content.getElementsByTagName('svg');

    if (svgelement.length > 1)
        svgelement[1].remove();

    var isCurrentlyVisible = !(element.style.display === "none");
    if (value && !isCurrentlyVisible) {
        loader.timerId.push(setTimeout(function () {
            element.style.display = "";
        }, 1000));
    } else if (!value) {
        element.style.display = "none";
        for (var i = 0; i < loader.timerId.length; i++) {
            clearTimeout(loader.timerId[i]);
        }
    }
};

ko.bindingHandlers['loading-animation'] = {

    'init': function (element, valueAccessor) {

        displayValue(element, valueAccessor);
    },
    'update': function (element, valueAccessor) {
        displayValue(element, valueAccessor);
    }
};


////$.ajax
////    ({
////        url: '/Header/errorModal/errorModal.aspx',
////        async: false,
////        success: function (templateString) {
////            ko.components.register('Error-Modal',
////                {
////                    template: templateString
////                });
////        }
////    });

ko.components.register('Error-Modal',
    {
        template: { element: 'errorModelHtml' }
    });

var errorHandler = (function () {
    try {

        var pub = {};
        var errorHandlerViewlModel;

        pub.init = function (vm) {
           errorHandlerViewlModel = vm;
        };

        pub.onOpenErrorHandler = function () {
            try {
                errorHandlerViewlModel.view.activeModal(true);
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        };

        pub.onCloseErrorHandler = function () {
            try {
                errorHandlerViewlModel.view.activeModal(false);
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        };

        return pub;
    }
    catch (ex) {
        go8Error.handleException(ex);
    }
}());



var errorHandlerModel = function (params) {
    try {
        // Public functions and state.
        var pub = {};

        pub =
            {
                // The domain model contains all information relevant to server calls.
                domain:
                {

                },
                // Any necessary public operations should be exposed here.  Functions here should just call private
                // functions.  This may be ommitted if you have no such requirements.
                operations:
                {
                },

                // The pojo model contains state information that cannot be observable because of constaints imposed by
                // third party software like Google maps.  This may be ommitted if you have no such requirements.
                pojo:
                {
                },

                // The view model contains state only of interest to the view.
                view:
                {
                    activeModal: ko.observable(false)
                }
            };

        errorHandler.init(pub);

        return pub;
    }
    catch (ex) {
        go8Error.handleException(ex);
    }
};

ko.components.register('Error-Handler', {
    template: { element: 'errorHandlerHtml' },
    viewModel: errorHandlerModel
});


/**
 * Script: user.js
 *
 * @requires
 *     jquery
2 */

var user = (function ()
{
    try
    {
        var pub = {};
        
        pub.handleOperationException = function (xhr, status, error)
        {
            var msg = xhr.responseText;
            if (msg != null)
            {
                if (msg.indexOf("NotLoggedInException:") >= 0 || xhr.status === 401)
                {
                    window.location.href = '/';
                }
                else if (msg.indexOf("The timeout period elapsed") >= 0)
                {
                    // TO-DO: show time out message nicely
                    alert("Your operation has timed out");
                }
            }
            else
            {
                //var local = (document.location.hostname == "localhost");
                // TO-DO: change it back to above
                var local = false;
                go8Error.handleAjaxError(xhr, status, error, "We're Sorry! The feature you are looking for appears to be experiencing difficulties.", local);
            }
        }

        return pub;
    }
    catch (ex)
    {
        go8Error.handleException(ex);
    }
}
());




var headerModel = (function ()
{
    try
    {

        // Public functions and state.
        var pub = {};

        pub =
        {
            // The domain model contains all information relevant to server calls.
            domain:
            {
                options:
                {
                    renterRedirectUrl: ko.observable(null),
                    ownerRedirectUrl: ko.observable(null),
                    transparentHeader: ko.observable(false),
                    signinControlType: ko.observable('modal'),
                    redirectToHomeOnLogout: ko.observable(true),
                    redirectToHomeOnScammerLogout: ko.observable(false),
                    sessionTimeOutCallBackFuncBeforeSignOut: null,
                    onSuccessCallBack: null,
                    onSignInClose: null
                },
                EventAdvertiseMenuOptionClickedHomepage: ko.observable(),
                EventOwnersManagerstabClickedHomepage: ko.observable(),
                EventPostlistingsMenuOptionClickedhomePage: ko.observable(),
                // can we rename this to something else, just so we are not confused between legacy and this
                profile: {
                    userId: ko.observable(),
                    firstName: ko.observable(),
                    lastName: ko.observable(),
                    fullName: ko.observable(),
                    email: ko.observable(),
                    userName: ko.observable(),
                    userFirstChar: ko.observable(),
                    userType: ko.observable(''),
                    userDeactive: ko.observable(),
                    isScammer: ko.observable(false),
                    membershipType: ko.observable(''),
                    phoneNumber: ko.observable(),
                    IsFree: ko.observable(false),
                    verified: ko.observable(),
                    confirmedEmail: ko.observable(),
                    title: ko.observable(0),
                    CanHaManageListings: ko.observable(false),
                    trustedOwnerBadgeStatusId: ko.observable(0),
                    userFeatureUsages: ko.observable([]),
                    trustedOwnerToolTip: ko.observable("You're a Trusted Owner! </br>Renters will see this badge on your listings. <a href='/v4/pages/owner/owner.aspx/owner-Status'>Read more</a>")                },
                isHomePage: ko.observable(false),
                faviconCommunityId: ko.observable(0),
                favLandLordUserId: ko.observable(0),
                saveSearchAfterLogin: ko.observable(false),
                showModalForOwnerFavorites: ko.observable(false),
                google: {
                    signUpShowMore: ko.observable(false),
                    signUpUserType: ko.observable().extend({
                        required: {
                            message: 'This field is required. Let us know what type of user you are before continuing.'
                        }
                    }),
                    missingLastName: ko.observable(false),
                    lastName: ko.observable(),
                    phoneSelected: ko.observable(false),
                    phone: ko.observable().extend(
                        {
                            required: true,
                            phoneUS: true
                        }),
                    ownerTitles: ko.observableArray([
                        { name: 'Select Title', id: 0, code: '' },
                        { name: 'Real Estate Agent/Broker', id: 1, code: 'agent' },
                        { name: 'Property Owner/Landlord', id: 2, code: 'owner' },
                        { name: 'Property Manager', id: 3, code: 'manager' },
                        { name: 'Other Real Estate Industry Professional', id: 4, code: 'other' }
                    ]),
                    selectedTitle: ko.observable(),
                    company: ko.observable().extend(
                        {
                            maxLength: 150
                        })
                },
                tenant: {
                    rentals: ko.observableArray([]),
                    searches: ko.observableArray([]),
                    landlords: ko.observableArray([]),
                    selectedTab: ko.observable('rentals'),
                    favoriteCount: ko.observable(0),
                    leasesCount: ko.observable(0)
                },
                landlord: {
                    selectedLeftMenu: ko.observable('dashboard'),
                    refreshNavigationCount: ko.observable(false)
                },

                user: ko.observable(),
                showMore: ko.observable(),
                isLoginPage: ko.observable(),
                searchLabel: ko.observable(),
                bellNotifications: ko.observable([]),
                bellNotificationsWlAlerts: ko.observable([]),
                wlAertsData: ko.observable(),
                brand: {
                    id: ko.observable('0'),
                    name: ko.observable(),
                    type: ko.observable(''),
                    coBrandDesktopLogo: ko.observable(''),
                    coBrandMobileLogo: ko.observable(''),
                    coBrandBannerColor: ko.observable(''),
                    desktopLogo: ko.observable(''),
                    mobileLogo: ko.observable(''),
                    showAds: ko.observable(true),
                    microSiteUrl: ko.observable()
                },
                currentMembershipPlan: {
                    billCycle: ko.observable(''),
                    expires: ko.observable(''),
                    planName: ko.observable(''),
                    planFullName: ko.observable(''),
                    planId: ko.observable(''),
                    planType: ko.observable(''),
                    annualPlanMonthlyPrice: ko.observable(''),
                    enterDate: ko.observable(''),
                    nextBillingDate: ko.observable(''),
                    productID: ko.observable(''),
                    Subscriptions: ko.observableArray([])
                },
                enterpriseRequest: {
                    isProcessed: ko.observable(false)
                },
                enterprise: {
                    id: ko.observable(),
                    logo: ko.observable('')
                },
                isSeoLandingPage: ko.observable(false),
                seoPropertyType:ko.observable('properties'),
            },

            // Any necessary public operations should be exposed here.  Functions here should just call private
            // functions.  This may be ommitted if you have no such requirements.
            operations:
            {
            },

            // The pojo model contains state information that cannot be observable because of constaints imposed by
            // third party software like Google maps.  This may be ommitted if you have no such requirements.
            pojo:
            {
            },

            // The view model contains state only of interest to the view.
            view:
            {
                async: {
                    loading: ko.observable(),
                    navigationLoading: ko.observable(false)
                },                         
                landlord: {
                    isComponentLoaded: ko.observable(false),
                    isAjaxSuccess: ko.observable(false)

                },
                tab: {
                    activeTabClass: ko.observable('')
                },
                isWaitListLandingPage: ko.observable(false),
                isHaResultsPage: ko.observable(false),
                iswlResultsPage: ko.observable(false),
                isSearchResultsPage: ko.observable(false),
                isUpdateApplicationPage: ko.observable(false),
                isMyApplicationPage: ko.observable(false),
                isOwnerDashboardPage: ko.observable(false),
                isOwnerStatusPage: ko.observable(false),
                isCheckoutPage: ko.observable(false),
                isSimpleCheckoutPage: ko.observable(false),
                isListingWizardPage: ko.observable(false),
                isLeasePackagePage: ko.observable(false),
                isSignRequestPage: ko.observable(false),
                isApplicationSettingsPage: ko.observable(false),
                isViewFullAppPage: ko.observable(false),
                isMyLeasesPage: ko.observable(false),
                GPTAdTestMode: ko.observable('OFF'),

                userType:
                {
                    Landlord: "Landlord",
                    Tenant: "Tenant",
                    Ha: "Ha"
                },
                brandType:
                {
                    branded: 1,
                    coBranded: 2
                },
                ahSignInRedirects:
                {
                    homePage: '/',
                    loginPage: '/v4/pages/login/login.aspx',
                    addNewListing: '/v4/pages/listingWizard/addNewListing.aspx',
                    listingWizard: '/v4/pages/listingWizard/listingWizard.aspx',
                    manageListings: '/v4/pages/Listing/Listing.aspx',
                    rentEstimator: '/ll/ll_CompareRent.aspx',
                    ownerDashboard: '/ll/dashboard.aspx',
                    myApplications: '/v4/pages/myWaitlistApplications/myWaitlistApplications.aspx',
                    section8WaitList: '/v4/pages/wlresults/section-8-waiting-list.aspx',
                    homePageScammer: '/?action=isscammer',
                    checkoutPage:'/v4/pages/ownercheckout/checkout.aspx',
                    planDetailsPage:'/v4/pages/ownerPricing/Plans.aspx',
                },
                showSMSNotification: ko.observable(false),
                showInboxNotification: ko.observable(false),
                showNewInboundTenantEmails: ko.observable(false),
                showHaToRenterNotification: ko.observable(false),
                isRentalPanelExist: ko.observable(false),
                isHASectionExist: ko.observable(false),
                isPropertyDetailsPage: ko.observable(false),
                isKOSearchResultsPage: ko.observable(false),
                isServerSearchResultsPage: ko.observable(false),
                isNonPartnerHaLandingPage: ko.observable(false),
                portalHeaderData: ko.observable(),
                portalHeaderLogo: ko.observable(),
                portalHeaderResources: ko.observableArray([]),
                portalHeaderNote: ko.observable(),
                portalHeaderNoteLink: ko.observable(),
                portalResourceExternalURL: ko.observable(),
                portalHaId: ko.observable(),
                portalHomePageId: ko.observable(1),
                portalHomePagestatus: ko.observable(2),
                portalFooterData: ko.observable(),

                // Body
                programHeading: ko.observable(),
                programandServicelst: ko.observableArray([]),

                // Resource page redirection
                serviceIds: ko.observable(),
                respageIds: ko.observable(),
                resourcePageNamelst: ko.observableArray([]),
                servicePageNamelst: ko.observableArray([]),

                topNavSignInClicked: ko.observable(false),
                HasReceivedProspectCreditsEver: ko.observable(false),
                isWebFlowPricingPageEnabled: ko.observable(false),
                lastUpdatedApplicantPage: ko.observable(),
                showIntercomChatWidget: ko.observable(false),
                isOwnerPricingPageFeatureON: ko.observable(true),
                isDisplayOwnerPricingSwitch: ko.observable(false),
                isTrustedOwnerToastMessageON: ko.observable(false),
                isDisplayOwnerPricingSwitch: ko.observable(false),
                isTrustedOwnerToastMessageClosed: ko.observable(sessionStorage.getItem("isTrustedOwnerToastMessageClosed") || 'false'),
                isQuickMatch2On: ko.observable(false),
                IsNewGoogleLoginOn: ko.observable(false)
            }
        }
        pub.domain.google.lastName.extend(
            {
                required: true,
                maxLength: 50,
                onlyIf: function ()
                {
                    return pub.domain.google.missingLastName() === true;
                }
            });
        pub.domain.PremiumBenefitsButtonText = ko.computed(function ()
        {
            if (pub.domain.user() && pub.domain.user().UserType() === pub.view.userType.Landlord)
            {
                if (pub.domain.user().IsFree())
                {
                    return "Get Premium";
                } else
                {
                    return "My Plan & Payment";
                }

            } else
            {
                return "Get Premium";
            }
        });
        pub.domain.showConfirmEmailNotification = ko.computed(function ()
        {
            return pub.domain.user() &&
                pub.domain.user().UserType() !== pub.view.userType.Ha &&
                pub.domain.user().Email() &&
                !pub.domain.user().EmailConfirmed();
        });     
        pub.domain.showEmailRequiredNotification = ko.computed(function ()
        {
            return pub.domain.user() &&
                pub.domain.user().UserType() !== pub.view.userType.Ha &&
                !pub.domain.user().Email();
        });
        pub.domain.NotificationCount = ko.computed(function ()
        {
            var count = 0;
            if (pub.domain.user() && pub.domain.user().Email() && !pub.domain.user().EmailConfirmed())
            {
                count++;
            }
            if (pub.domain.user() && !pub.domain.user().Email())
            {
                count++;
            }
            if (pub.domain.user() && pub.view.showSMSNotification()) {
                count++;
            }
            if (pub.domain.user() && pub.view.showInboxNotification()) {
                count++;
            }
            if (pub.domain.user() && pub.view.showNewInboundTenantEmails()) {
                count++;
            }
            if (pub.domain.user() && pub.domain.bellNotifications()) {
                count = count + pub.domain.bellNotifications().length
            }
            if (pub.domain.user() && pub.view.showHaToRenterNotification()) {
                count++;
            }
            if (pub.domain.user() && pub.domain.bellNotificationsWlAlerts()) {
                count = count + pub.domain.bellNotificationsWlAlerts().length
            }
            return count;
        });

        /**
         * Moved from headerControlModel.js
        * Set model parameters from the result.
        */
        pub.menuCount = {
            inboxCount: ko.observable(0),
            InboxCountNew: ko.observable(0),
            prospectsCount: ko.observable(0),
            activeListingCount: ko.observable(0),
            listingCount: ko.observable(0),
            alllistingCount: ko.observable(0),
            leasesCount: ko.observable(0),
            totalSpotlightCount: ko.observable(0),
            applicationsCountNew: ko.observable(0),
            applicantsCount: ko.observable(0),
            newApplicantsCount: ko.observable(0)

        }
        pub.search = {
            mobilerefinesearch: ko.observable(false)
        }

        pub.view.signUpParams = {
            renterRedirectUrl: pub.domain.options.renterRedirectUrl,
            ownerRedirectUrl: pub.domain.options.ownerRedirectUrl,
            onSuccess: pub.domain.options.onSuccessCallBack
        }

        pub.view.signInParams = {
            renterRedirectUrl: pub.domain.options.renterRedirectUrl,
            ownerRedirectUrl: pub.domain.options.ownerRedirectUrl,
            callBack: pub.domain.options.onSuccessCallBack
        }

        pub.domain.fullName = ko.computed(function () {
            if (pub.domain.user()) {
                return  pub.domain.user().FirstName() + " " + pub.domain.user().LastName();
            }
            return "";
        });
        pub.googleSignupMoreDetailsValidation = ko.validatedObservable([
            pub.domain.google.signUpUserType,
            pub.domain.google.phone,
            pub.domain.google.lastName
        ]);
        return pub;
    } catch (ex)
    {
        go8Error.handleException(ex);
    }
}
    ());


$(function ()
{
    headerTopNav.onPageLoad();
});

var headerTopNav = (function () {
    try {

        var pub = {};
        var ShouldShowHousingAssistance = sessionStorage.getItem("ShouldShowHousingAssistance");
        sessionStorage.removeItem("ShouldShowHousingAssistance");
        pub.onPageLoad = function () {
            try {
                registerComponents();
                initValidation(); // to init custom validation for knockout js
                pub.loadDelayedCss(); // to load some delayed scripts related to css design
                pub.loadUserState();
                pub.getTenantFavoritesCount();
                pub.getTenantLeasesCount();
                setTimeout(function () {
                    if (headerModel.view.isQuickMatch2On() && ShouldShowHousingAssistance === "Yes") {
                        housingAssistant.initiateHousingAssistant(housingAssistantModal.view.sourceFunctionality.signIn);
                    }
                }, 2000);

                if (window.location.pathname.indexOf("/appform/AppForm.aspx") == -1)
                    listing.getWebFlowPricingPageSetting(getWebFlowPricingPageSettingOnSuccess, getWebFlowPricingPageSettingOnFailure);
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        function getWebFlowPricingPageSettingOnSuccess(result) {
            headerModel.view.isWebFlowPricingPageEnabled(result.IsWebFlowPricingPageEnabled);
            if (result.IsWebFlowPricingPageEnabled == true) {
                $(".webflow-premium").attr("href", '/marketing/premium/upgrade?upgradepath=topnav');
            }
            else {
                $(".webflow-premium").attr("href", '/v4/pages/ownerPricing/pricing.aspx?upgradepath=topnav');
            }
        }

        function getWebFlowPricingPageSettingOnFailure(xhr, status, error) {
            try {
                user.handleOperationException(xhr, status, error);
            } catch (ex) {
                go8Error.handleException(ex);
            }
        }

        pub.showMore = function (val) {
            if (val)
                headerModel.domain.showMore(val);
            else
                headerModel.domain.showMore('');
        }
        pub.showLess = function () {
            headerModel.domain.showMore('');
        }
        pub.onClickReadMore = function (renterTipId) {
            showModal(renterTipId);
        }
        pub.loadUserState = function () {
            if (window.location.pathname.indexOf("/appform/AppForm.aspx") > -1) {
                if (headerModel.domain.user() == null || headerModel.domain.user() == undefined)
                    getUserDetails(false);
            }
            else            
                getUserDetails(false);
        }
        
        pub.getTenantFavoritesCount = function () {
            try {
                if (headerModel.domain.user() && headerModel.domain.user().UserType() === headerModel.view.userType.Tenant) {
                    listing.getTenantFavoritesCount(getTenantFavoritesCountSuccess, getTenantFavoritesCountFailure);
                }
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        function getTenantFavoritesCountSuccess(result) {
            try {
                headerModel.domain.tenant.favoriteCount(result.TotalFavoritesCount);
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        function getTenantFavoritesCountFailure(result) {
            try {
                headerModel.domain.tenant.favoriteCount(0);
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        pub.getTenantLeasesCount = function () {
            try {
                if (headerModel.domain.user() && headerModel.domain.user().UserType() === headerModel.view.userType.Tenant) {
                    listing.getLeasesCount(getTenantLeasesCountSuccess, getTenantLeasesCountFailure);
                }
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        function getTenantLeasesCountSuccess(result) {
            try {
                headerModel.domain.tenant.leasesCount(result);
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        function getTenantLeasesCountFailure(result) {
            try {
                headerModel.domain.tenant.leasesCount(0);
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        function logout () {
            listing.logout(true, logOutOnSuccess, logOutOnFailure);
        }

        pub.onClickLogout = function ()
        {
            if (helper.isMobileAndTablet) {
                $("body").removeClass("menu--open");
            }
             logout();
        }

        pub.redirectToSettingsPage = function () {
            if (headerModel.domain.user() && headerModel.domain.user().UserType() === headerModel.view.userType.Landlord)
                window.location.href = "/ll/ll_myaccount.aspx"; // need to keep it directly on click event and check
            else if (headerModel.domain.user() && headerModel.domain.user().UserType() === headerModel.view.userType.Tenant)
                window.location.href = "/v4/pages/tenantAccount/tenantAccount.aspx";

        }

        pub.redirectToHaPage = function (data) {
            headerModel.domain.wlAertsData(data);
            listing.updateWaitlistAlertsForUser(data.waitlistAlertLogId, updateWlAlertsOnSuccess, updateWlAlertsOnFailure);            
        }

        function updateWlAlertsOnSuccess(result) {
            var arr = headerModel.domain.bellNotificationsWlAlerts().filter(function (item) {
                return item.waitlistId !== headerModel.domain.wlAertsData().waitlistId;
            })

            headerModel.domain.bellNotificationsWlAlerts([]);
            headerModel.domain.bellNotificationsWlAlerts(arr);

            localStorage.removeItem("bellNotificationWaitlistAlerts");
            localStorage.setItem("bellNotificationWaitlistAlerts", JSON.stringify(headerModel.domain.bellNotificationsWlAlerts()));

            window.location.href = headerModel.domain.wlAertsData().haLinkUrl;
        }

        function updateWlAlertsOnFailure(xhr, status, error) {
            try {
                user.handleOperationException(xhr, status, error);
            } catch (ex) {
                go8Error.handleException(ex);
            }
        }        

        pub.logoutOnScammer = function () {
            headerModel.domain.options.redirectToHomeOnScammerLogout(true);
            logOut();
        }

        pub.openSmsOptIn = function () {
            loader.showLoading(true);
            //Create the contactpoint with allowmarketing false and not verified

            if (headerModel.domain.user()) {
                listing.createContactPoint(1, 0, '', function (result) // Success
                {
                    listing.hasRespondedToNotification(function (result) // Success
                    {
                        loader.showLoading(false);
                        if (result.hasResponded) {
                            headerModel.view.showSMSNotification(false);
                        }
                        $('.noti--dropdown').hide();
                        smsOptInControl.onPhoneInput();
                    }, function (xhr, status, error) // Failure
                    {
                        loader.showLoading(false);
                    });
                }, function (xhr, status, error) // Failure
                {
                    loader.showLoading(false);
                });
            }
        };

        pub.onClickBacktoHADashboard = function () {
            redirectToLDashboard();
        }

        pub.redirectToDashboard = function (askConfirmation) {
            appForm.redirectToDashboard(askConfirmation);
        }

        pub.toggleHaMobileNav = function () {
            event.stopPropagation();
            $('#ha-mbl-links').toggle();
            $('.ha-mbl-arrow').toggleClass("rotate");
        };

        pub.displaySearches = function (data) {
            try {
                var searchesString = '';
                if (data.bedCounts() != undefined && data.bedCounts() != null && data.bedCounts() != '') {
                    searchesString = RenturnBedCountForTenantFavorites(data.bedCounts()) + ' | ';
                }
                if (data.bathCount() != undefined && data.bathCount() != null && data.bathCount() != '' && data.bathCount() != '0') {
                    searchesString = searchesString + data.bathCount() + ' Baths | ';
                }
                if ((data.maxLivingArea() != undefined && data.maxLivingArea() != null && data.maxLivingArea() != '' && data.maxLivingArea() != 0) || (data.minLivingArea() != undefined && data.minLivingArea() != null && data.minLivingArea() != '' && data.minLivingArea() != 0)) {
                    if (data.maxLivingArea() != undefined && data.maxLivingArea() != null && data.maxLivingArea() != '' && data.maxLivingArea() != 0) {
                        searchesString = searchesString + data.minLivingArea() + ' Sqft - ' + data.maxLivingArea() + ' Sqft | ';
                    }
                    if (data.maxLivingArea() == 0) {
                        searchesString = searchesString + data.minLivingArea() + ' Sqft+  '
                    }
                }
                if (data.ageRestricted() != undefined && data.ageRestricted() != null && data.ageRestricted() == true) {
                    searchesString = searchesString + 'Age Restricted | ';
                }
                if (data.incomeRestricted() != undefined && data.incomeRestricted() != null && data.incomeRestricted() == true) {
                    searchesString = searchesString + 'Income Restricted | ';
                }
                if (data.airConditioning() != undefined && data.airConditioning() != null && data.airConditioning() == true) {
                    searchesString = searchesString + 'Air Conditioning | ';
                }
                if (data.balconyPatio() != undefined && data.balconyPatio() != null && data.balconyPatio() == true) {
                    searchesString = searchesString + 'Balcony/Patio | ';
                }
                if (data.communitySwimmingPool() != undefined && data.communitySwimmingPool() != null && data.communitySwimmingPool() == true) {
                    searchesString = searchesString + 'Community Swimming Pool | ';
                }
                if (data.dishwasher() != undefined && data.dishwasher() != null && data.dishwasher() == true) {
                    searchesString = searchesString + 'Dishwasher | ';
                }
                if (data.elevator() != undefined && data.elevator() != null && data.elevator() == true) {
                    searchesString = searchesString + 'Elevator | ';
                }
                if (data.fitnessCenter() != undefined && data.fitnessCenter() != null && data.fitnessCenter() == true) {
                    searchesString = searchesString + 'Fitness Center | ';
                }
                if (data.inUnitWasherAndDryer() != undefined && data.inUnitWasherAndDryer() != null && data.inUnitWasherAndDryer() == true) {
                    searchesString = searchesString + 'In Unit Washer and Dryer | ';
                }
                if (data.leaseIncentives() != undefined && data.leaseIncentives() != null && data.leaseIncentives() == true) {
                    searchesString = searchesString + 'Lease Incentives | ';
                }
                if (data.noAgeRestrictions() != undefined && data.noAgeRestrictions() != null && data.noAgeRestrictions() == true) {
                    searchesString = searchesString + 'No Age Restrictions | ';
                }
                if (data.onsiteLaundryFacilities() != undefined && data.onsiteLaundryFacilities() != null && data.onsiteLaundryFacilities() == true) {
                    searchesString = searchesString + 'Onsite Laundry Facilities | ';
                }
                if (data.parking() != undefined && data.parking() != null && data.parking() == true) {
                    searchesString = searchesString + 'Parking | ';
                }
                if (data.petFriendly() != undefined && data.petFriendly() != null && data.petFriendly() == true) {
                    searchesString = searchesString + 'Pet Friendly | ';
                }
                if (data.picturesOnly() != undefined && data.picturesOnly() != null && data.picturesOnly() == true) {
                    searchesString = searchesString + 'Pictures Only | ';
                }
                if (data.showSection8Badge() != undefined && data.showSection8Badge() != null && data.showSection8Badge() == true) {
                    searchesString = searchesString + 'Experience with Section 8 / HCV | ';
                }
                if (data.showTrustedOwnerBadge() != undefined && data.showTrustedOwnerBadge() != null && data.showTrustedOwnerBadge() == true) {
                    searchesString = searchesString + 'Trusted Owner | ';
                }
                if (data.utilitiesIncluded() != undefined && data.utilitiesIncluded() != null && data.utilitiesIncluded() == true) {
                    searchesString = searchesString + 'Utilities Included | ';
                }
                if (data.physical() != undefined && data.physical() != null && data.physical() == true) {
                    searchesString = searchesString + 'Physical | ';
                }
                if (data.visualHearing() != undefined && data.visualHearing() != null && data.visualHearing() == true) {
                    searchesString = searchesString + 'Visual/Hearing | ';
                }
                if (data.keywordSearch() != undefined && data.keywordSearch() != null && data.keywordSearch() != '') {
                    searchesString = searchesString + returnKeyWordSearches(data.keywordSearch()) + ' | ';
                }

                return searchesString.slice(0, -2);
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        function returnKeyWordSearches(keyword) {
            try {
                var stringKeywords = keyword.split(";");
                var finalStringToReturnForKeywords = '';
                for (var i = 0; i < stringKeywords.length; i++) {
                    finalStringToReturnForKeywords = finalStringToReturnForKeywords + stringKeywords[i] + ' | '
                }
                return finalStringToReturnForKeywords.slice(0, -2);
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        function RenturnBedCountForTenantFavorites(stringBedsValues) {
            try {
                var stringBeds = stringBedsValues.split(",");
                var finalStringToReturn = '';
                for (var i = 0; i < stringBeds.length; i++) {
                    if (stringBeds[i] != 'Studio' && stringBeds[i] != '0') {
                        finalStringToReturn = finalStringToReturn + stringBeds[i] + (stringBeds[i] == '1' ? ' Bed | ' : ' Beds | ');
                    }
                    else {
                        finalStringToReturn = 'Studio | '
                    }
                }
                return finalStringToReturn.slice(0, -2);
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        function redirectToLDashboard() {
            listing.redirectToLDashboard(function (result) {
                redirectToLDashboardOnSuccess(result)
            }, redirectToLDashboardOnFailure);
        }

        function redirectToLDashboardOnSuccess(result) {
            try {
                if (!result.redirect) {
                    window.location.href = result.url;
                }
                else {
                    window.history.back();
                }
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        function redirectToLDashboardOnFailure(xhr, status, error) {
            try {
                user.handleOperationException(xhr, status, error);
            } catch (ex) {
                go8Error.handleException(ex);
            }
        }

        function registerComponents() {
            $.ajax({
                url: '/Header/topNavigation.aspx',
                async: true,
                success: function (templateString) {
                    if (ko.components.isRegistered('Header')) {
                        ko.components.unregister('Header');
                    }
                    ko.components.register('Header', {
                        template: templateString,
                        viewModel: function (params) {
                            headerModel.domain.options.renterRedirectUrl(params && params.renterRedirectUrl
                                ? params.renterRedirectUrl
                                : null);
                            headerModel.domain.options.ownerRedirectUrl(params && params.ownerRedirectUrl
                                ? params.ownerRedirectUrl
                                : null);
                            headerModel.domain.options.transparentHeader(params && params.transparentHeader
                                ? params.transparentHeader
                                : false);
                            headerModel.domain.options.signinControlType(params && params.signinControlType
                                ? params.signinControlType
                                : 'modal');
                            headerModel.domain.options.redirectToHomeOnLogout(params && params.redirectToHomeOnLogout
                                ? params.redirectToHomeOnLogout
                                : true);

                            if (params && params.signinSuccessCallBack) {
                                headerModel.view.signInParams.callBack = params.signinSuccessCallBack;
                                //headerModel.view.signUpParams.callBack = params.signinSuccessCallBack;
                            }
                            if (params && params.signupSuccessCallBack) {
                                headerModel.view.signUpParams.callBack = params.signupSuccessCallBack;
                            }
                            if (params && params.redirectToSettingsCallBack) {
                                headerModel.domain.options.onSignInClose = params.redirectToSettingsCallBack;
                            }
                            if (params && params.sessionTimeOutCallBackFuncBeforeSignOut) {
                                headerModel.domain.options.sessionTimeOutCallBackFuncBeforeSignOut = params.sessionTimeOutCallBackFuncBeforeSignOut;
                            }
                            if (params && params.portalHeaderData) {
                                headerModel.view.portalHeaderData(params.portalHeaderData);

                                if (!helper.isUndefinedOrNullOrEmpty(headerModel.view.portalHeaderData())) {
                                    headerModel.view.portalHeaderLogo(headerModel.view.portalHeaderData().Logo);
                                    if (!helper.isUndefinedOrNullOrEmpty(headerModel.view.portalHeaderData().Resources)) {
                                        headerModel.view.portalHeaderResources(JSON.parse(headerModel.view.portalHeaderData().Resources));
                                    }
                                    if (!helper.isUndefinedOrNullOrEmpty(headerModel.view.portalHeaderData().Note)) {
                                        headerModel.view.portalHeaderNote(headerModel.view.portalHeaderData().Note[0].Note);
                                        headerModel.view.portalHeaderNoteLink(headerModel.view.portalHeaderData().Note[0].LinkUrl);
                                    }
                                }
                            }
                            if (params && params.portalHAId) {
                                headerModel.view.portalHaId(params.portalHAId);
                                if (headerModel.view.portalHaId() > 0) {
                                    pub.getPortalHomePageData();
                                }
                            }
                        }
                    });

                    viewModelBind();
                    $("#topNavDiv").show();
                    dropDownToggle();
                }
            });

        }

        function registerLandlordComponent() {
            headerModel.view.landlord.isAjaxSuccess(false);
            if (!headerModel.view.landlord.isComponentLoaded()) {
                $.ajax({
                    url: '/Header/landlord.aspx',
                    async: false,
                    success: function (templateString) {
                        ko.components.register('LL_Auth-Header', {
                            template: templateString
                        });

                        headerModel.view.landlord.isComponentLoaded(true);
                        if ($('#dvLandlordLeftNav').length) {
                            ko.cleanNode(document.getElementById("dvLandlordLeftNav"));
                            ko.applyBindings('', document.getElementById("dvLandlordLeftNav"));
                        }
                        loadLandlordDashboard();
                    }
                });
            }
            headerModel.view.landlord.isAjaxSuccess(true);
        }

        function dropDownToggle() {
            $(".web--usr--dropdown").unbind('click');
            $(".web--usr--dropdown").on('click', function (e)
            {
                headerModel.view.async.loading(false);
                $('.favourite--dropdownmenu').hide();
                $('.noti--dropdown').hide();
                $(".usr--drop--list").toggle();
                e.stopPropagation();
            });

            $(".noti--dropdown").on('click', function () {
                event.stopPropagation();
            });
            $(document).click(function () {
                if ($(".usr--drop--list").is(':visible'))
                    $('.usr--drop--list').hide();
                if ($(".favourite--dropdownmenu").is(':visible'))
                    $('.favourite--dropdownmenu').hide();
                if ($(".noti--dropdown").is(':visible'))
                    $('.noti--dropdown').hide();
            });
        }

        function viewModelBind() {
            if (typeof (portalDetails) === 'undefined') {
                ko.cleanNode(document.getElementById('headerControl'));
                ko.applyBindings(headerModel, document.getElementById('headerControl'));
                setCurrentNavigationTab();
            }
        }

        function initValidation() {
            ko.validation.init({
                registerExtenders: true,
                errorMessageClass: 'invalidmessage',
                messagesOnModified: true,
                insertMessages: true,
                parseInputAttributes: true,
                messageTemplate: null
            }, true);
        }

        function getUserDetails(isAsync) {
            listing.getUser(isAsync,
                function (result) // Success
                {
                    if (result.user) {
                        

                        headerModel.domain.user(ko.mapping.fromJS(ko.mapping.toJS(result.user))); // mapping user details
                        // headerModel.domain.profile.userFirstChar(result.user.FirstName.charAt(0).toUpperCase()); // taken from old JS code

                        // Need to change once we have all the properties related to profile
                        headerModel.domain.profile.fullName(headerModel.domain.user().FirstName() + " " + headerModel.domain.user().LastName());
                        headerModel.domain.profile.userId(result.user.UserId);
                        headerModel.domain.profile.firstName(result.user.FirstName);
                        headerModel.domain.profile.lastName(result.user.LastName);
                        headerModel.domain.profile.email(result.user.Email);
                        headerModel.domain.profile.userName(result.user.UserName);
                        headerModel.domain.profile.userType(result.user.UserType);
                        headerModel.domain.profile.phoneNumber(result.user.Phone);
                        headerModel.domain.profile.IsFree(result.user.IsFree);
                        headerModel.domain.profile.userDeactive(result.user.Deactive);
                        headerModel.domain.profile.isScammer(result.user.Scammer);
                        headerModel.domain.profile.verified(result.user.Trusted);
                        headerModel.domain.profile.confirmedEmail(result.user.EmailConfirmed);
                        headerModel.domain.profile.membershipType(result.user.MembershipType);
                        headerModel.domain.profile.title(result.user.Title != null ? result.user.Title : 0);
                        if (!helper.isUndefinedOrNullOrEmpty(result.user.TrustedOwnerBadgeStatusId))
                            headerModel.domain.profile.trustedOwnerBadgeStatusId(result.user.TrustedOwnerBadgeStatusId);
                        if (!helper.isUndefinedOrNullOrEmpty(result.user.UserFeatureUsages))
                            headerModel.domain.profile.userFeatureUsages(result.user.UserFeatureUsages);

                        if (!helper.isUndefinedOrNullOrEmpty(result.user.IsAbleToFreeApplicantCredit))
                            localStorage.setItem("IsFreeCreditAvailable", result.user.IsAbleToFreeApplicantCredit);
                        
                        if (result.user.UserType == headerModel.view.userType.Landlord)
                            getMarketingFeatureBanner();

                        if (result.user.UserType == headerModel.view.userType.Ha) {
                            profile.CanHaManageListings = result.user.CanManageListings;
                            headerModel.domain.profile.CanHaManageListings(result.user.CanManageListings);
                        }

                        if (!helper.isUndefinedOrNullOrEmpty(result.user.EnterDate))
                            headerModel.domain.currentMembershipPlan.enterDate(moment(result.user.EnterDate).format("MM/DD/YYYY") || '');

                        if ((result.user.UserType == headerModel.view.userType.Landlord || result.user.UserType == headerModel.view.userType.Ha) && result.landlordLegacyInfo) {
                            profile.FullName = result.user.FirstName + " " + result.user.LastName;
                            profile.FirstName = result.user.FirstName;
                            profile.LastName = result.user.LastName;
                            profile.EmailAddress = result.user.Email;
                            profile.PhoneNumber = result.user.Phone;
                            profile.UserId = result.user.UserId;
                            profile.UserType = result.user.UserType;
                            profile.CategoryType = "L";
                            profile.UserDeactive = result.user.Deactive;
                            profile.MembershipType = headerModel.domain.profile.IsFree() ? "Standard" : result.landlordLegacyInfo.CurrentMembershipPlan.Product.PlanName;
                            profile.PropertyManager = "False";
                            profile.ActiveListingsCount = "";
                            profile.InactiveListingsCount = "";
                            profile.IncompleteListingsCount = "";

                            profile.InboxCount = "";
                            profile.InboxCountNew = "";
                            profile.ProspectsCount = "";
                            profile.ProspectsCountNew = "";
                            profile.HasActiveListings = false;
                            profile.HasInactiveListings = false;
                            profile.ConfirmedEmail = 'True';
                            profile.Verified = 'True';
                            profile.HasReceivedProspectCredits = 'True';
                            profile.FullyRegistered = 'True';
                            profile.HasFreeListingBump = false;
                            profile.HasFreeProspectCredit = false;
                            profile.ListingAdded = false;
                            profile.ListingEdited = false;
                            profile.ListingIncomplete = false;
                            profile.AllowFreeListingBump = false;
                            profile.LastListingBumpExpired = false;
                            profile.ShowListingBumpExpiredBanner = false;
                            profile.ListingRemoved = false;
                            profile.QuickMatchEnabled = 'True';
                            profile.IsTrustedLandLord = 'False';
                            profile.IsFreeListingBump = 'False';
                            profile.IsFreeProspectCredit = 'False';
                            headerModel.view.HasReceivedProspectCreditsEver(result.landlordLegacyInfo.HasReceivedProspectCredits);
                            if (!helper.isUndefinedOrNullOrEmpty(result.landlordLegacyInfo.CurrentMembershipPlan.Subscriptions))
                                headerModel.domain.currentMembershipPlan.Subscriptions(result.landlordLegacyInfo.CurrentMembershipPlan.Subscriptions);

                            if (!helper.isUndefinedOrNullOrEmpty(result.landlordLegacyInfo.CurrentMembershipPlan.Product.BillCycle))
                                headerModel.domain.currentMembershipPlan.billCycle(result.landlordLegacyInfo.CurrentMembershipPlan.Product.BillCycle.replace('annual','yearly'));
                        if (!helper.isUndefinedOrNullOrEmpty(result.landlordLegacyInfo.Expires))
                                headerModel.domain.currentMembershipPlan.expires(moment(result.landlordLegacyInfo.Expires).format("MM/DD/YYYY") || '');
                            if (!helper.isUndefinedOrNullOrEmpty(result.landlordLegacyInfo.CurrentMembershipPlan.NextBillingDate))
                                headerModel.domain.currentMembershipPlan.nextBillingDate(moment(result.landlordLegacyInfo.CurrentMembershipPlan.NextBillingDate).format("MM/DD/YYYY") || '');
                        if (!helper.isUndefinedOrNullOrEmpty(result.landlordLegacyInfo.CurrentMembershipPlan.Product.PlanName))
                            headerModel.domain.currentMembershipPlan.planName(result.landlordLegacyInfo.CurrentMembershipPlan.Product.PlanName);
                            if (!helper.isUndefinedOrNullOrEmpty(result.landlordLegacyInfo.CurrentMembershipPlan.Product.PlanFullName))
                                headerModel.domain.currentMembershipPlan.planFullName(result.landlordLegacyInfo.CurrentMembershipPlan.Product.PlanFullName.replace('-',' '));
                        if (!helper.isUndefinedOrNullOrEmpty(result.landlordLegacyInfo.CurrentMembershipPlan.Product.PlanId))
                            headerModel.domain.currentMembershipPlan.planId(result.landlordLegacyInfo.CurrentMembershipPlan.Product.PlanId);
                        if (!helper.isUndefinedOrNullOrEmpty(result.landlordLegacyInfo.CurrentMembershipPlan.Product.PlanType))
                            headerModel.domain.currentMembershipPlan.planType(result.landlordLegacyInfo.CurrentMembershipPlan.Product.PlanType);
                        if (!helper.isUndefinedOrNullOrEmpty(result.landlordLegacyInfo.CurrentMembershipPlan.Product.AnnualPlanMonthlyPrice))
                                headerModel.domain.currentMembershipPlan.annualPlanMonthlyPrice(result.landlordLegacyInfo.CurrentMembershipPlan.Product.AnnualPlanMonthlyPrice);
                            if (!helper.isUndefinedOrNullOrEmpty(result.landlordLegacyInfo.CurrentMembershipPlan.Product.ProductID))
                                headerModel.domain.currentMembershipPlan.productID(result.landlordLegacyInfo.CurrentMembershipPlan.Product.ProductID);

                            registerLandlordComponent();
                        }

                        if (headerModel.domain.user().Scammer() || headerModel.domain.user().Deactive()) {
                            headerModel.domain.user(null);
                        }

                        var noAdditonalCalls = window.location.pathname.indexOf("/appform/AppForm.aspx") > -1 &&
                            headerModel.domain.user().UserType() === headerModel.view.userType.Ha;

                        if (!noAdditonalCalls) {
                            checkSMSNotification();
                            checkHaToRenterNotifications();
                        }
                        if (result.user.UserType == headerModel.view.userType.Tenant && !noAdditonalCalls) {
                            headerModel.view.landlord.isAjaxSuccess(true);
                            $("#dashboardpage, .afterajaxsuccess").css('display', 'block');
                            hasNewInboundTenantEmails();
                        }
                        // set the tenant recent searched locations details if tenant sign in/sign up
                        if (!noAdditonalCalls)
                            setUserSpecificDetails();

                        setUserBellNotifications();

                        let userTypeForHotjar = profile.MembershipType + ' ' + headerModel.domain.user().UserType();
                        if (userTypeForHotjar.includes("Premium")) userTypeForHotjar = 'Premium Landlord';
                        // HotJar attributes
                        window.hj('identify', headerModel.domain.profile.userId(), {
                            'UserType': userTypeForHotjar.trim()
                        });
                    }
                    else {
                        headerModel.domain.user(null);
                        headerModel.view.landlord.isAjaxSuccess(true);
                        $("#dashboardpage, .afterajaxsuccess").css('display', 'block');
                        // HotJar attributes
                        window.hj('identify', null, {
                            'UserType': "Not logged in"
                        });
                    }

                    sessionTimer.initilaizeSession();
                },
                function (xhr, status, error) //Failure
                {
                    try {
                        headerModel.domain.user(null);
                        user.handleOperationException(xhr, status, error);
                    }
                    catch (ex) {
                        go8Error.handleException(ex);
                    }
                });
            dropDownToggle();
        }

       

        function checkSMSNotification() {
            if (headerModel.domain.user() && headerModel.domain.user().UserType() !== headerModel.view.userType.Ha) {
                listing.hasRespondedToNotification(function (result) // Success
                {
                    if (!result.hasResponded) {
                        headerModel.view.showSMSNotification(true);
                        firstActionAfterLogin();
                    }
                }, function (xhr, status, error) // Failure
                {
                });
            }
        };

        function checkInboxNotification() {
            if (headerModel.domain.user() && headerModel.domain.user().UserType() === headerModel.view.userType.Landlord) {
                try {
                    hasNewInboundOwnerEmails();
                }
                catch (ex) {
                    go8Error.handleException(ex);
                }
            }
        };
        function checkHaToRenterNotifications() {
            if (headerModel.domain.user() && headerModel.domain.user().UserType() !== headerModel.view.userType.Ha) {
                listing.hasRespondedToHaToRenterNotification(function (result) // Success
                {
                    if (!result.responded) {
                        headerModel.view.showHaToRenterNotification(true);
                    } else { headerModel.view.showHaToRenterNotification(false); }
                }, function (xhr, status, error) // Failure
                {
                });
            }
        };
        function setUserBellNotifications() {
            var getNotification = headerModel.domain.user() && headerModel.domain.user().UserType() != headerModel.view.userType.Ha;
            if (getNotification) {
                listing.getUserBellNotifications(setUserBellNotificationsSuccess, setUserBellNotificationsFailure);                
            }
        }

        function setUserBellNotificationsSuccess(bellNotifications) {
            const sortedAlerts = _.orderBy(bellNotifications, ['id'], ['desc']);
            headerModel.domain.bellNotifications(sortedAlerts);
            var bellNotificationWaitlistAlerts = localStorage.getItem('bellNotificationWaitlistAlerts');
            if (bellNotificationWaitlistAlerts) {
                headerModel.domain.bellNotificationsWlAlerts(JSON.parse(bellNotificationWaitlistAlerts));
            }
        }        

        function setUserBellNotificationsFailure(xhr, status, error) {
        }        

        pub.gotoInbox = function () {
            headerModel.view.showInboxNotification(false);
            window.location.href = "/ll/Inbox.aspx";
        };

        $(window).scroll(function () {
            var scroll = $(window).scrollTop();

            if (scroll >= 5 && (headerModel.domain.user() && headerModel.domain.user().UserType() !== headerModel.view.userType.Landlord || !headerModel.domain.user())) {
                $("body").addClass("top--sticky--ad");
            } else {
                $("body").removeClass("top--sticky--ad");
            }
        });

        pub.loadDelayedCss = function () {
            setTimeout(function () {
                $(function () {
                    var header = $("#headerControl");
                    $(document).on('click', '.mbl--menu--icon', function () {
                        $("body").addClass("menu--open");
                        $("html").addClass("noscroll");
                        if (helper.isMobile()) {
                            $("#menu_popup .mbl--mid--cont").height(($(window).height() - $(".ah--modal--main .modal--hdr--bar").outerHeight()) - 10);
                        }
                    });
                    $(document).on('click', '.modal--cls--btn', function () {
                        $("body").removeClass("menu--open");
                        $("html").removeClass("noscroll");
                    });
                    $(".modal--cls--btn").click(function () {
                        $("#signin_popup").removeClass("menu--open");
                    });
                    $(window).scroll(function () {
                        var scroll = $(window).scrollTop();
                        if (scroll >= 100) {
                            header.addClass("");
                        }
                        else {
                            header.removeClass("");
                        }
                    });
                    dropDownToggle();
                    loader.initilaize();
                    $(".noti--bell").unbind('click');
                    $(document).on('click', '.noti--bell', function (event) {
                        event.stopPropagation();
                        headerModel.view.async.loading(false);
                        $('.favourite--dropdownmenu').hide();
                        $('.usr--drop--list').hide();
                        $(".noti--dropdown").toggle();
                    });

                    // hamburger menu height set for mobile //
                    //if (helper.isMobile()) {
                    //    $("#menu_popup .mbl--mid--cont").height(($(window).height() - $(".ah--modal--main .modal--hdr--bar").outerHeight()) - 10);
                    //}
                });
            }, 2000);

            //$(".mbl--mid--cont").css('height', $(".modal--hdr--bar").height());
        }

        /**
        * Invoked on success when calling logout
        */
        function logOutOnSuccess(result) {
            try
            {
                $.cookie('firstAction', null, { path: '/' });
                clearTenantLastSearch();
                sessionStorage.removeItem("favouritesearches");
                sessionStorage.removeItem("landlordlistingpagefilters");
                localStorage.removeItem("FreeApplicantCredit");
                localStorage.removeItem("BannersList");
                sessionStorage.removeItem("isTrustedOwnerToastMessageClosed");
                localStorage.removeItem("bellNotificationWaitlistAlerts");
                sessionStorage.removeItem("lastAppliedLayer");             
                headerModel.domain.bellNotificationsWlAlerts([]);
                if (headerModel.domain.options.redirectToHomeOnScammerLogout()) {
                    window.location.href = headerModel.view.ahSignInRedirects.homePageScammer;
                }
                else if (headerModel.domain.options.redirectToHomeOnLogout()) {
                    window.location.href = headerModel.view.ahSignInRedirects.homePage;
                }
                else {
                    loadUserState();
                }
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        /**
        * Invoked on failure when calling signup
        */
        function logOutOnFailure(result) {
            try {
                localStorage.removeItem("favouritesearches");
                sessionStorage.removeItem("landlordlistingpagefilters");
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        /**
         * Set User Information in View Model. 
         */
        function setUserInfo() {
            var urlPath = (window.location.pathname === '/' ||
                window.location.href.indexOf('Section-8-housing-in') > 0 ||
                window.location.pathname.indexOf('tn_Results') > 0 ||
                window.location.pathname.indexOf('benefits.aspx') > 0 ||
                window.location.pathname.indexOf('index.aspx') > 0) ? true : false;
            var url = window.location.pathname.toLowerCase();
            if (!urlPath) {
                if (url.indexOf('dashboard') > 0) {
                    headerModel.domain.landlord.selectedLeftMenu('dashboard');
                }
                else if (url.indexOf('inbox') > 0) {
                    headerModel.domain.landlord.selectedLeftMenu('inbox');
                }
                else if (url.indexOf('search-tenants') > 0) {
                    headerModel.domain.landlord.selectedLeftMenu('prospects');
                }
                else if (url.indexOf('listing') > 0) {
                    headerModel.domain.landlord.selectedLeftMenu('listings');
                }
                else if (url.indexOf('leases') > 0) {
                    headerModel.domain.landlord.selectedLeftMenu('leases');
                }
                else if (url.indexOf('documents') > 0) {
                    headerModel.domain.landlord.selectedLeftMenu('documents');
                }
                else if (url.indexOf('comparerent') > 0) {
                    headerModel.domain.landlord.selectedLeftMenu('rent-estimate');
                }
                else if (url.indexOf('comparables') > 0) {
                    headerModel.domain.landlord.selectedLeftMenu('comparable');
                }
                else if (url.indexOf('tenant-screening') > 0) {
                    headerModel.domain.landlord.selectedLeftMenu('tenant-screening');
                }


            }
            headerModel.domain.isHomePage(urlPath);
        }

        /**
        * Set active navigation menu in View Model. 
        */
        function setCurrentNavigationTab() {
            var currentUrl = location.href.toLowerCase();
            //Rental Menu section
            if (currentUrl.indexOf('tn_results.aspx') > 0) {
                headerModel.view.tab.activeTabClass('rental');
            }
            //Housing Agensies section
            else if (currentUrl.indexOf('housingauthority') > 0) {
                headerModel.view.tab.activeTabClass('housingagencies');
            }
            //My Waitlist Application section
            else if (currentUrl.indexOf('mywaitlistapplications') > 0) {
                headerModel.view.tab.activeTabClass('waitlistapplication');
            }
            //Landlords Menu section
            else if (currentUrl.indexOf('benefittype=landlord') > 0) {
                headerModel.view.tab.activeTabClass('landlord-listofproperty');
            }

            else if (currentUrl.indexOf('benefittype=estimator') > 0) {
                headerModel.view.tab.activeTabClass('landlord-marketrentestimator');
            }
            else if (currentUrl.indexOf('ownerpricing/pricing') > 0) {
                headerModel.view.tab.activeTabClass('landlord-ownerpricing');
            }
            //More Menu section
            else if (currentUrl.indexOf('/about/') > 0) {
                headerModel.view.tab.activeTabClass('more-about');
            }
            else if (currentUrl.indexOf('contact') > 0) {
                headerModel.view.tab.activeTabClass('more-contact');
            }
            else if (currentUrl.indexOf('what-is-section8.aspx') > 0) {
                headerModel.view.tab.activeTabClass('more-whatissection8');
            }
            else if (currentUrl.indexOf('/faq/') > 0) {
                headerModel.view.tab.activeTabClass('more-faq');
            }
            else if (currentUrl.indexOf('/scam-alert') > 0) {
                headerModel.view.tab.activeTabClass('more-scams');
            }
            else if (currentUrl.indexOf('equal-housing-opportunity') > 0) {
                headerModel.view.tab.activeTabClass('more-equalhousingopportunity');
            }
        }


        /**
        * Moved here from headerControlModel.js
        */
        if (window.location.pathname.indexOf('tn_Results') > 0 || window.location.pathname.indexOf('SearchResult.aspx') > 0 || window.location.pathname.indexOf('HousingAuthority') > 0) {
            headerModel.search.mobilerefinesearch(true);
        }

        function loadLandlordDashboard() {
            if (headerModel.domain.user() && (headerModel.domain.user().UserType() === headerModel.view.userType.Landlord || headerModel.domain.user().UserType() === headerModel.view.userType.Ha)) {
                loadLeftNavToolTip();
                getLandlordNavigation();
            }
        }
        function loadLeftNavToolTip() {
            $("body").on("mouseenter", "div .landlord-left-linkarea", function () {
                $(this).addClass("mouseover");
            }).on("mouseleave", "div .landlord-left-linkarea", function () {
                $(this).removeClass("mouseover");
            });
        }
        function getLandlordNavigation() {
            if (headerModel.domain.profile.userType() == headerModel.view.userType.Ha &&
                !helper.isUndefinedOrNullOrEmpty(headerModel.domain.profile.CanHaManageListings())
                && headerModel.domain.profile.CanHaManageListings() === true) {
                //use a different api call and sproc to get listings by HA.
                listing.getHANavigationToManageListing(getHANavigationToManageListingOnSuccess, getHANavigationToManageListingOnFailure);
            }
            else {
                listing.getLandlordNavigation(getLandlordNavigationOnSuccess, getLandlordNavigationOnFailure);
            }
        }
        function getHANavigationToManageListingOnSuccess(result) {
            headerModel.menuCount.inboxCount(result.InboxCount || 0);
            headerModel.menuCount.InboxCountNew(result.InboxCountNew || 0);
            
            headerModel.menuCount.activeListingCount(result.ActiveListingsCount || 0);
            headerModel.menuCount.listingCount(((result.ActiveListingsCount || 0) + (result.InActiveListingsCount || 0)) || 0);
            headerModel.menuCount.alllistingCount(result.AllListingsCount || 0);           
            profile.ActiveListingsCount = result.ActiveListingsCount;
            profile.InactiveListingsCount = result.InActiveListingsCount;
            profile.IncompleteListingsCount = result.InCompleteListingsCount;
            if (profile.ActiveListingsCount > 0)
                profile.HasActiveListings = true;
            if (profile.HasInactiveListings > 0)
                profile.HasInactiveListings = true;

            profile.AllListingsCount = result.AllListingsCount;//since ActiveListingsCount is used in  $('#prospectsBanner').show();
            profile.IsTrustedLandLord = result.IsTrustedLandLord;
            profile.IsFreeListingBump = result.IsFreeListingBump;
            profile.IsFreeProspectCredit = result.IsFreeProspectCredit;
            if ($('#dvProfileData').length) {
                if (typeof (iniTabsDisplay) === 'function') {
                    iniTabsDisplay();
                }

                ko.cleanNode(document.getElementById("dvProfileData"));
                ko.applyBindings(profile, document.getElementById("dvProfileData"));
            }

            headerModel.domain.landlord.refreshNavigationCount(false);
            headerModel.view.landlord.isAjaxSuccess(true);
            $("#dashboardpage, .afterajaxsuccess").css('display', 'block');
        }
        function getHANavigationToManageListingOnFailure(xhr, status, error) {
            try {
                user.handleOperationException(xhr, status, error);
            }
            catch (ex) {
                go8Error.handleException(ex);
                if (!window.location.href.includes("/Error.aspx")) {
                    window.location.href = "/Error.aspx";
                }
            }
        }
        function getLandlordNavigationOnSuccess(result) {
            if (result.IsFreeProspectCredit && result.IsTrustedLandLord && profile.ConfirmedEmail === "True" && result.ActiveListingsCount > 0) {
                $('#prospectsBanner').show();
            }
            headerModel.menuCount.inboxCount(result.InboxCount || 0);
            headerModel.menuCount.InboxCountNew(result.InboxCountNew || 0);
            headerModel.menuCount.prospectsCount(result.ProspectsCount || 0);
            headerModel.menuCount.activeListingCount(result.ActiveListingsCount || 0);
            headerModel.menuCount.listingCount(((result.ActiveListingsCount || 0) + (result.InActiveListingsCount || 0)) || 0);
            headerModel.menuCount.alllistingCount(result.AllListingsCount || 0);
            headerModel.menuCount.applicationsCountNew(result.ApplicationsCountNew || 0);
            headerModel.menuCount.applicantsCount(result.ApplicantsCount || 0);
            headerModel.menuCount.newApplicantsCount(result.NewApplicantsCount || 0);
            var redirectURL;
            if (!helper.isUndefinedOrNullOrEmpty(result.LastUpdatedCommunityId) && result.LastUpdatedCommunityId !== 0) {
                redirectURL = "/v4/pages/ownerApplicants/ownerApplicants.aspx?communityId=" + result.LastUpdatedCommunityId;
            }
            if (!helper.isUndefinedOrNullOrEmpty(result.LastUpdatedUnitGuid)) {
                redirectURL = "/v4/pages/ownerApplicants/ownerApplicants.aspx?propertyUnitGuid=" + result.LastUpdatedUnitGuid.toLowerCase();
            }
            if (!helper.isUndefinedOrNullOrEmpty(redirectURL))
                headerModel.view.lastUpdatedApplicantPage(redirectURL);
            else
                headerModel.view.lastUpdatedApplicantPage("/v4/pages/ownerApplicants/ownerApplicants.aspx");
            

            /* Fill Profile data from the result */
            profile.InboxCount = result.InboxCount;
            profile.InboxCountNew = result.InboxCountNew;
            profile.ProspectsCount = result.ProspectsCount;
            profile.ProspectsCountNew = result.ProspectsCountNew;
            profile.ActiveListingsCount = result.ActiveListingsCount;
            profile.InactiveListingsCount = result.InActiveListingsCount;
            profile.IncompleteListingsCount = result.InCompleteListingsCount;
            if (profile.ActiveListingsCount > 0)
                profile.HasActiveListings = true;
            if (profile.HasInactiveListings > 0)
                profile.HasInactiveListings = true;

            profile.AllListingsCount = result.AllListingsCount;//since ActiveListingsCount is used in  $('#prospectsBanner').show();

            profile.IsTrustedLandLord = result.IsTrustedLandLord;
            profile.IsFreeListingBump = result.IsFreeListingBump;
            profile.IsFreeProspectCredit = result.IsFreeProspectCredit;
            if ($('#dvProfileData').length) {
                if (typeof (iniTabsDisplay) === 'function') {
                    iniTabsDisplay();
                }

                ko.cleanNode(document.getElementById("dvProfileData"));
                ko.applyBindings(profile, document.getElementById("dvProfileData"));
            }

            headerModel.domain.landlord.refreshNavigationCount(false);
            headerModel.view.landlord.isAjaxSuccess(true);
            $("#dashboardpage, .afterajaxsuccess").css('display', 'block');

            checkInboxNotification();
        }
        function getLandlordNavigationOnFailure(xhr, status, error) {
            try {
                user.handleOperationException(xhr, status, error);
            }
            catch (ex) {
                go8Error.handleException(ex);
                if (!window.location.href.includes("/Error.aspx")) {
                    window.location.href = "/Error.aspx";
                }
            }
        }

        /**
         * show/hide submenu
         * @param {any} viewModel
         * @param {any} event
         */
        pub.showHideMenu = function (event) {
            if ($(event.currentTarget) && $(event.currentTarget).text().toLocaleLowerCase() === 'landlords') {
                headerModel.view.async.navigationLoading(true);
                
            }

            /*  Toggle submenu */
            event.stopPropagation();

            if ($(event.currentTarget).next('div').is(':visible')) {
                $('.topnavigation-dropdownmenu, .myaccount-dropdownmenu').hide();
                $(event.currentTarget).removeClass('currentlink');
                return;
            }
            else {
                $('.topnavigation-dropdownmenu, .myaccount-dropdownmenu').hide();
                $(event.currentTarget).next('div').slideToggle();
                $(event.currentTarget).addClass('currentlink');
            }
            $('.favourite--dropdownmenu').hide();
            hideMobileMenu();
        };

        /**
         * Populate favourite data.
         */
        pub.favPopulate = function (event) {
            $('.topnavigation-dropdownmenu, .myaccount-dropdownmenu').hide();
            $('.usr--drop--list').hide();
            $('.noti--dropdown').hide();
            if ($(".favourite--dropdownmenu").is(':visible')) {
                $(event.currentTarget).addClass('currentlink');
                $(".favourite--dropdownmenu").slideToggle();
                $(event.currentTarget).removeClass('currentlink');
                return;
            }
            hideMobileMenu();
            headerModel.view.async.loading(true);
            $(".favourite--dropdownmenu").slideToggle();
            listing.getTenantFavorites(getTenantFavoritesOnSuccess, getTenantFavoritesOnFailure);
            if (event) {
                $(event.currentTarget).addClass('currentlink');
                event.stopPropagation();
            }
        }

        pub.getTenantFavoritesAsync = function () {
            listing.getTenantFavorites(getTenantFavoritesAsyncOnSuccess, getTenantFavoritesOnFailure);
        }

        /**
         * Retain favourate popup on text click.
         */
        pub.retainFavDropdownMenu = function (event) {
            if ($(".favourite--dropdownmenu").is(':visible')) {
                event.stopPropagation();
            }
        }

        function getTenantFavoritesOnSuccess(result) {
            resetResult();
            ko.utils.arrayMap(result.tenantRentals, function (item) {
                headerModel.domain.tenant.rentals.push(new pub.favouriteRentals(item));
            });

            ko.utils.arrayMap(result.TenantsFavLandlords, function (item) {
                headerModel.domain.tenant.landlords.push(new pub.favoriteLandlords(item));
            });

            for (var i = 0; i < result.TenantsSearches.length; i++) {
                headerModel.domain.tenant.searches.push(new pub.fillTenantSearchProperty(result.TenantsSearches[i].TenantsSavedSearchesId, result.TenantsSearches[i].SearchFilters, result.TenantsSearches[i].CreatedDate, result.TenantsSearches[i].SearchLabel));
            }
            headerModel.view.async.loading(false);
        }

        function getTenantFavoritesAsyncOnSuccess(result) {
            resetResult();
            ko.utils.arrayMap(result.tenantRentals, function (item) {
                headerModel.domain.tenant.rentals.push(new pub.favouriteRentals(item));
            });

            ko.utils.arrayMap(result.TenantsFavLandlords, function (item) {
                headerModel.domain.tenant.landlords.push(new pub.favoriteLandlords(item));
            });

            for (var i = 0; i < result.TenantsSearches.length; i++) {
                headerModel.domain.tenant.searches.push(new pub.fillTenantSearchProperty(result.TenantsSearches[i].TenantsSavedSearchesId, result.TenantsSearches[i].SearchFilters, result.TenantsSearches[i].CreatedDate, result.TenantsSearches[i].SearchLabel));
            }
            ////headerModel.view.async.loading(false);
        }

        function getTenantFavoritesOnFailure() {
            headerModel.view.async.loading(false);
        }

        pub.showLandlordListings = function (landlordId) {
            var SEOsearchResultParameters = helper.setSEOsearchResultParameters();
            SEOsearchResultParameters.landlordUserId = landlordId;
            helper.updateSEOCookie(SEOsearchResultParameters);
            window.location.href = '/v4/pages/tnresult/tnresult.aspx';
        }

        pub.favouriteRentals = function (property) {
            var self = this;
            self.address1 = ko.observable(property.AddressLine1 || '');
            self.address2 = ko.observable(property.AddressLine2 || '');
            self.city = ko.observable(property.City || '');

            self.halfBathCount = ko.observable(property.HalfBathCount || 0);
            self.defaultPhoto = ko.observable(property.DefaultPhoto || '');
            self.numberOfBaths = ko.observable(property.FullBathCount || 0);
            self.numberOfRooms = ko.observable(property.BedroomCount || 0);
            self.premListing = ko.observable(property.IsPremListing || false);
            self.communityId = ko.observable(property.CommunityId || 0);
            self.propertyType = ko.observable(property.PropertyTypeCategory || '');
            self.rentAmount = ko.observable(property.AskingRent || 0);
            self.state = ko.observable(property.State || '');
            self.zip = ko.observable(property.Zip || '');
            self.livingArea = ko.observable(property.LivingArea || '');
            self.isSingleUnit = ko.observable(property.IsSingleUnit || false);
            self.createDate = ko.observable(moment(property.CreatedByDate).format("MM/DD/YYYY") || '');
            self.showBadge = ko.observable(property.ShowBadge || false);
            self.HasTrustedOwnerBadge = ko.observable(property.HasTrustedOwnerBadge || false);
            self.IsPremiumListing = ko.observable(property.IsPremiumListing || false);
            self.CommunityName = ko.observable(property.CommunityName || '');
            self.MinAskingRent = ko.observable(property.MinAskingRent || '');
            self.MaxAskingRent = ko.observable(property.MaxAskingRent || '');
            self.MinBedroomCount = ko.observable(property.MinBedroomCount || '');
            self.MaxBedroomCount = ko.observable(property.MaxBedroomCount || '');
            self.MaxFullBathCount = ko.observable(property.MaxFullBathCount || '');
            self.MaxHalfBathCount = ko.observable(property.MaxHalfBathCount || '');
            self.MinFullBathCount = ko.observable(property.MinFullBathCount || '');
            self.MinHalfBathCount = ko.observable(property.MinHalfBathCount || '');
            self.MaxLivingArea = ko.observable(property.MaxLivingArea || '');
            self.MinLivingArea = ko.observable(property.MinLivingArea || '');
            self.photoCount = ko.observable(property.PhotoCount || '');
        }

        pub.favoriteLandlords = function (landlords) {
            var self = this;
            self.communityCount = ko.observable(landlords.CommunityCount || 0);
            self.firstName = ko.observable(landlords.FirstName || '');
            self.landlordUserId = ko.observable(landlords.LandlordUserId || 0);
            self.lastName = ko.observable(landlords.LastName || 0);
            self.createdDate = ko.observable(moment(landlords.CreatedDate).format("MM/DD/YYYY") || '');
            self.company = ko.observable(landlords.Company || '');
            self.HasTrustedOwnerBadge = ko.observable(landlords.HasTrustedOwnerBadge || false);
            self.IsPremiumListing = ko.observable(landlords.IsPremiumOwner || false);
            self.IsEnterpriseOwner = ko.observable(landlords.IsEnterpriseOwner || false);
            self.AccountDescription = ko.observable(landlords.AccountDescription || '');
            self.LogoFileName = ko.observable(landlords.LogoFileName || '');
        }

        pub.showPropertyDetailForFavourites = function (item) {
            var fullAddress = '';
            if (item.address1()) {
                fullAddress = item.address1();
            }

            if (item.address2()) {
                fullAddress = fullAddress + ", " + item.address2();
            }

            if (item.city()) {
                fullAddress = fullAddress + ", " + item.city();
            }

            if (item.state()) {
                fullAddress = fullAddress + ", " + item.state();
            }

            if (item.zip()) {
                fullAddress = fullAddress + " " + item.zip();
            }

            window.location.href = helper.returnSEOfriendlyURL(item.city(), item.state(), item.address1(), item.communityId(), item.isSingleUnit(), item.CommunityName());
        }

        pub.fillTenantSearchProperty = function (SearchId, searches, date, searchLabel) {
            var self = this;
            var searchesJson = JSON.parse(searches || false);
            self.ageRestricted = ko.observable(searchesJson.ageRestricted || false);
            self.incomeRestricted = ko.observable(searchesJson.incomeRestricted || false);
            self.airConditioning = ko.observable(searchesJson.airConditioning || false);
            self.balconyPatio = ko.observable(searchesJson.balconyPatio || false);
            self.bedCounts = ko.observable(searchesJson.bedCounts || '');
            self.bathCount = ko.observable(searchesJson.bathCount || 0);
            self.communitySwimmingPool = ko.observable(searchesJson.communitySwimmingPool || false);
            self.dishwasher = ko.observable(searchesJson.dishwasher || false);
            self.elevator = ko.observable(searchesJson.elevator || false);
            self.fitnessCenter = ko.observable(searchesJson.fitnessCenter || false);
            self.inUnitWasherAndDryer = ko.observable(searchesJson.inUnitWasherAndDryer || false);
            self.keywordSearch = ko.observable(searchesJson.keywordSearch || '');
            self.leaseIncentives = ko.observable(searchesJson.leaseIncentives || false);
            self.maxLivingArea = ko.observable(searchesJson.maxLivingArea || 0);
            self.maxPrice = ko.observable(searchesJson.maxPrice || 0);
            self.minLivingArea = ko.observable(searchesJson.minLivingArea || 0);
            self.minPrice = ko.observable(searchesJson.minPrice || 0);
            self.noAgeRestrictions = ko.observable(searchesJson.noAgeRestrictions || false);
            self.onsiteLaundryFacilities = ko.observable(searchesJson.onsiteLaundryFacilities || false);
            self.parking = ko.observable(searchesJson.parking || false);
            self.petFriendly = ko.observable(searchesJson.petFriendly || false);
            self.physical = ko.observable(searchesJson.physical || false);
            self.picturesOnly = ko.observable(searchesJson.picturesOnly || false);
            self.showSection8Badge = ko.observable(searchesJson.showSection8Badge || false);
            self.showTrustedOwnerBadge = ko.observable(searchesJson.showTrustedOwnerBadge || false);
            self.propertyTypeCategories = ko.observable(searchesJson.propertyTypeCategories.replace(/,(?=[^\s])/g, ", ") || '');
            self.requiredMoreBedCounts = ko.observable(searchesJson.requiredMoreBedCounts || 0);
            self.searchLocationText = ko.observable(searchesJson.searchLocationText || '');
            self.utilitiesIncluded = ko.observable(searchesJson.utilitiesIncluded || false);
            self.visualHearing = ko.observable(searchesJson.visualHearing || false);
            self.createDate = ko.observable(moment(date).format("MM/DD/YYYY") || '');
            self.viewMore = ko.observable(false);
            self.searchStringsToDisplay = ko.observable(pub.displaySearches(self) || '');
            self.hasSection8Voucher = ko.observable(searchesJson.hasSection8Voucher || false);
            self.isIncomeBaseSearch = ko.observable(searchesJson.isIncomeBaseSearch || false);
            self.yearlyIncome = ko.observable(searchesJson.yearlyIncome || 0);
            self.familySize = ko.observable(searchesJson.familySize || 0);
            self.voucherSize = ko.observable(searchesJson.voucherSize || -1);
            self.houseHoldIncome = ko.observable(searchesJson.houseHoldIncome || null);
            self.incomeFrequencyType = ko.observable(searchesJson.incomeFrequencyType || '');
            self.isExcludeExceedsEligibility = ko.observable(searchesJson.isExcludeExceedsEligibility || false);
            self.tenantsSavedSearchesId = ko.observable(SearchId || 0);
            self.pos = ko.observable(searchesJson.pos || '');
            self.zoom = ko.observable(searchesJson.zoom || '');
            self.center = ko.observable(searchesJson.center || '');
            self.drawings = ko.observable(searchesJson.drawings || '');
            self.cenValueLng = ko.observable(searchesJson.cenValueLng || '');
            self.cenValueLat = ko.observable(searchesJson.cenValueLat || '');
            self.searchLabel = ko.observable(searchLabel || '');
            self.editsearchLabel = ko.observable(searchesJson.editsearchLabel || false);
            self.NCESSchoolID = ko.observable(searchesJson.NCESSchoolID || 0);
            self.schoolId = ko.observable(searchesJson.schoolId || 0);
            self.education = ko.observable(searchesJson.education || '');
            self.brand = ko.observable(searchesJson.brand || 0);
            self.state = ko.observable(searchesJson.state || '');
            self.county = ko.observable(searchesJson.county || '');
            self.city = ko.observable(searchesJson.city || '');
            self.zip = ko.observable(searchesJson.zip || '');

            if ((self.yearlyIncome() > 0 && searchesJson.incomeFrequencyType == 'monthly')) {
                self.displayIncome = ko.observable((self.yearlyIncome() / 12).toLocaleString());
            }
            else {
                self.displayIncome = ko.observable(self.yearlyIncome().toLocaleString());
            }
        }

        pub.removeSearches = function (data) {
            try {
                event.stopPropagation();
                if (event.screenX == 0 && event.screenY == 0) {
                    event.preventDefault();
                }
                else {
                    if (headerModel.domain.user() && headerModel.domain.user().UserType().toLowerCase() === "tenant") {
                        var createSearches = createAndReturnJson(data);
                        var tenantsSavedSearchesId = data.tenantsSavedSearchesId();
                        listing.saveSearchFilters(tenantsSavedSearchesId, createSearches, true, removeSearchFilerOnSuccess, removeSearchFilerOnFailure);
                    }
                }
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        function removeSearchFilerOnSuccess(result) {
            try {
                headerModel.domain.tenant.searches(_.filter(headerModel.domain.tenant.searches(), function (rental) {
                    return createAndReturnJson(rental) !== result.SearchFilers;
                }));
                if (typeof (tnResult) !== "undefined") {
                    if (tnResult.createSearchJsonPublic() == result.SearchFilers) {
                        tnResultModel.savedSearch(false);
                    }
                }
                headerModel.domain.tenant.favoriteCount(result.TotalFavoritesCount);
                listing.getTenatnsAllSearches(getTenatnsAllSearchesOnSuccess, getTenatnsAllSearchesOnFailure);
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        function removeSearchFilerOnFailure(xhr, status, error) {
            try {
                user.handleOperationException(xhr, status, error);
                loading('hide');
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        function getTenatnsAllSearchesOnSuccess(result) {
            try {
                sessionStorage.setItem("favouritesearches", ko.toJSON(result));
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        function getTenatnsAllSearchesOnFailure(result) {
            try {
                sessionStorage.setItem("favouritesearches", "");
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }


        pub.removeLandLords = function (data) {
            try {
                event.stopPropagation();
                if (headerModel.domain.user() && headerModel.domain.user().UserType().toLowerCase() === "tenant") {
                    listing.saveLandlordFavourite(true, data.landlordUserId(), removeLandlordFavoriteOnSuccess, removeLandlordFavoriteOnFailure, "header.removeLandlords");
                }
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        function removeLandlordFavoriteOnSuccess(result) {
            try {
                headerModel.domain.tenant.landlords(_.filter(headerModel.domain.tenant.landlords(), function (landlords) {
                    return landlords.landlordUserId() != result.LandlordUserId;
                }));
                if (typeof (propertyDetailsModel) != "undefined") {
                    if (propertyDetailsModel.domain.landlordUserId() == result.LandlordUserId) {
                        propertyDetailsModel.domain.IsFavoriteLandlord(false);
                    }
                }
                headerModel.domain.tenant.favoriteCount(result.TotalFavoritesCount);
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        function removeLandlordFavoriteOnFailure(result) {
            try {

            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        function resetBeforeFavViewRental() {
            helper.removeSEOCookie();
            sessionStorage.removeItem("userdrawings");
            sessionStorage.removeItem("schoolfilters");
            sessionStorage.removeItem("school-shapefile");
        }

        pub.viewRentalClick = function (data) {
            try {

                var jsonStringsForSessionStorage = createAndReturnJson(data);
                sessionStorage.setItem("favouritesearchesViewRentals", jsonStringsForSessionStorage);
                var stringSplitPlace = data.searchLocationText().split(',');

                resetBeforeFavViewRental()
                var SEOsearchResultParameters = !helper.isUndefinedOrNullOrEmpty(jsonStringsForSessionStorage) ? JSON.parse(jsonStringsForSessionStorage) : helper.setSEOsearchResultParameters();

                SEOsearchResultParameters.isFavViewRental = true;
                if (data.drawings().length > 0) {
                    sessionStorage.setItem("userdrawings", data.drawings());

                    //SEOsearchResultParameters.drawings = data.drawings();


                    //SEOsearchResultParameters.pos = data.pos();
                    //SEOsearchResultParameters.zoom = data.zoom();
                    //SEOsearchResultParameters.center = center;
                    helper.updateSEOCookie(SEOsearchResultParameters);
                    window.location.href = '/v4/pages/tnresult/tnresult.aspx';
                }
                else if (data.NCESSchoolID() != "0" && data.schoolId() != "0" && !helper.isUndefinedOrNullOrEmpty(data.education())) {
                    //SEOsearchResultParameters.NCESSchoolID = data.NCESSchoolID();
                    //SEOsearchResultParameters.schoolId = data.schoolId();
                    //SEOsearchResultParameters.education = data.education();
                    helper.updateSEOCookie(SEOsearchResultParameters);

                    window.location.href = '/v4/pages/tnresult/tnresult.aspx';
                }
                else if (data.searchLocationText().length > 0 && data.pos().length > 0) {
                    //SEOsearchResultParameters.pos = data.pos();
                    //SEOsearchResultParameters.zoom = data.zoom();
                    //SEOsearchResultParameters.center = center;
                    helper.updateSEOCookie(SEOsearchResultParameters);
                    window.location.href = '/v4/pages/tnresult/tnresult.aspx';
                }
                else if (stringSplitPlace.length == 1) {
                    helper.updateSEOCookie(SEOsearchResultParameters);
                    if (!helper.isUndefinedOrNullOrEmpty(stringSplitPlace[0])) {

                        window.location.href = '/v4/pages/tnresult/tnresult.aspx?state=' + stringSplitPlace[0].trim();
                    }
                    else {
                        window.location.href = '/v4/pages/tnresult/tnresult.aspx';
                    }
                }
                else if (stringSplitPlace.length <= 2) {
                    if (stringSplitPlace[0].indexOf('County') > -1) {
                        stringSplitPlace[0] = stringSplitPlace[0].replace('County', '');
                        window.location.href = helper.getSEOFriendlyPropertySearchUrl(stringSplitPlace[1].trim(), stringSplitPlace[0].trim(), null, "county");
                    }
                    else {

                        window.location.href = helper.getSEOFriendlyPropertySearchUrl(stringSplitPlace[1].trim(), stringSplitPlace[0].trim(), null, "city");
                    }
                }
                else if (stringSplitPlace.length == 3) {
                    window.location.href = helper.getSEOFriendlyPropertySearchUrl(stringSplitPlace[2].trim(), stringSplitPlace[1].trim(), stringSplitPlace[0].trim(), "zip");
                }
                else {
                    window.location.href = helper.getSEOFriendlyPropertySearchUrl(stringSplitPlace[1].trim(), stringSplitPlace[0].trim(), null, "city");
                }

            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        function createAndReturnJson(data) {
            try {
                var saveSearchParams =
                {
                    searchLocationText: data.searchLocationText(),
                    state: data.state(),
                    county: data.county(),
                    city: data.city(),
                    zip: data.zip(),
                    brand: data.brand(),
                    minPrice: data.minPrice(),
                    maxPrice: data.maxPrice(),
                    isIncomeBaseSearch: data.isIncomeBaseSearch(),
                    hasSection8Voucher: data.hasSection8Voucher(),
                    yearlyIncome: data.yearlyIncome(),
                    familySize: data.familySize(),
                    voucherSize: data.voucherSize(),
                    incomeFrequencyType: data.incomeFrequencyType(),
                    houseHoldIncome: data.houseHoldIncome(),
                    isExcludeExceedsEligibility: data.isExcludeExceedsEligibility(),
                    bedCounts: data.bedCounts(), /* bedroomValues string*/
                    requiredMoreBedCounts: data.requiredMoreBedCounts(),
                    bathCount: data.bathCount(),
                    propertyTypeCategories: data.propertyTypeCategories(),
                    minLivingArea: data.minLivingArea(),
                    maxLivingArea: data.maxLivingArea(),
                    inUnitWasherAndDryer: data.inUnitWasherAndDryer(),
                    onsiteLaundryFacilities: data.onsiteLaundryFacilities(),
                    balconyPatio: data.balconyPatio(),
                    parking: data.parking(),
                    fitnessCenter: data.fitnessCenter(),
                    communitySwimmingPool: data.communitySwimmingPool(),
                    airConditioning: data.airConditioning(),
                    dishwasher: data.dishwasher(),
                    utilitiesIncluded: data.utilitiesIncluded(),
                    elevator: data.elevator(),
                    ageRestricted: data.ageRestricted(),
                    incomeRestricted: data.incomeRestricted(),
                    noAgeRestrictions: data.noAgeRestrictions(),
                    petFriendly: data.petFriendly(),
                    leaseIncentives: data.leaseIncentives(),
                    picturesOnly: data.picturesOnly(),
                    showSection8Badge: data.showSection8Badge(),
                    showTrustedOwnerBadge: data.showTrustedOwnerBadge(),
                    physical: data.physical(),
                    visualHearing: data.visualHearing(),
                    keywordSearch: data.keywordSearch(),
                    pos: (!helper.isUndefinedOrNullOrEmpty(data.pos()) ? data.pos : ''),
                    zoom: (!helper.isUndefinedOrNullOrEmpty(data.zoom()) ? data.zoom : ''),
                    // drawings: data.drawings(),
                    center: data.center(),
                    cenValueLng: data.cenValueLng(),
                    cenValueLat: data.cenValueLat(),
                    NCESSchoolID: (!helper.isUndefinedOrNullOrEmpty(data.NCESSchoolID()) ? data.NCESSchoolID() : 0),
                    schoolId: (!helper.isUndefinedOrNullOrEmpty(data.schoolId()) ? data.schoolId() : 0),
                    education: (!helper.isUndefinedOrNullOrEmpty(data.education()) ? data.education() : '')
                };
                return ko.toJSON(saveSearchParams);
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        pub.propagation = function () {
            event.stopPropagation();
        }


        pub.EnableSearchName = function (data, isEnable, searchIndex) {
            try {
                event.stopPropagation();

                if (!isEnable) {
                    listing.getTenantFavorites(getTenantFavoritesOnSuccess, getTenantFavoritesOnFailure);
                }
                else {
                    setTimeout(function () {
                        $("#searchLabel" + searchIndex).select();
                        $("#searchLabel" + searchIndex).focus();
                    }, 500)
                }
                data.editsearchLabel(isEnable);
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        pub.updateSearchName = function (data) {
            try {
                event.stopPropagation();
                if (!helper.isNullOrEmpty(data.searchLabel())) {
                    listing.updateSearchName(data.tenantsSavedSearchesId(), data.searchLabel(),
                        function () {
                            listing.getTenantFavorites(getTenantFavoritesOnSuccess, getTenantFavoritesOnFailure);
                            data.editsearchLabel(true);
                        }, function () {
                            listing.getTenantFavorites(getTenantFavoritesOnSuccess, getTenantFavoritesOnFailure);

                            data.editsearchLabel(false);
                        });
                }
                else {
                    listing.getTenantFavorites(getTenantFavoritesOnSuccess, getTenantFavoritesOnFailure);
                }
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        pub.keyEventTriggered = function (data, event) {
            if (event.keyCode == 13)
                pub.updateSearchName(data)
        }

        pub.viewMoreClicked = function (data) {
            try {
                event.stopPropagation();
                if (data.viewMore() == false) {
                    data.viewMore(true);
                }
                else {
                    data.viewMore(false);
                }
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        function hideMobileMenu() {
            if (helper.isMobileAndTablet()) {
                if ($('.mobilemenu').hasClass('close')) {
                    $('.mobilemenu').removeClass('close')
                }
            }
        }

        pub.redirectToDetail = function (prop, event) {
            window.location = '/LL/ll_RentalProperty.aspx?prop=' + prop.propertyId();
            event.stopPropagation();
        }

        pub.redirectToTenantDetail = function (prop, event) {
            window.location = '/Tenant/tn_Results.aspx?landlordid=' + prop.landlordId();
            event.stopPropagation();
        }

        /**
         * Set selected active tab.
         * @param {any} tab
         */
        pub.activeFavTab = function (tab, event) {
            headerModel.domain.tenant.selectedTab(tab);
            event.stopPropagation();
        }

        pub.setModelHeight = function () {
            if (helper.isMobileAndTablet()) {
                return (window.windowheight - 176) + 'px';
            } else {
                return '280px';
            }
        }

        /**
         * Remove Favourite Rental.
         * @param {any} prop
         */
        pub.removeFavRental = function (prop, event) {
            $.when(
                performTenantAction('RemoveFavoriteHome', JSON.stringify({ PropertyID: prop.propertyId() }))
            ).then(function () {
                headerModel.domain.tenant.rentals(_.filter(headerModel.domain.tenant.rentals(), function (rental) {
                    return rental.propertyId() !== prop.propertyId()
                }));

                if (parseInt(propertyid) === prop.propertyId()) {
                    $("#SaveHomeDiv").show();
                    $("#SaveHomeDivDeactivate").hide();
                }

                // Change the propertyFavoriteClass value in propertyList
                ko.utils.arrayForEach(indexModel.domain.propertyList(), function (item, index) {
                    if (item.propertyId() === prop.propertyId()) {
                        item.propertyFavoriteClass('prop-like-icon');
                    }
                });
            });

            event.stopPropagation();
        }

        // Remove Tenents favoriteRentals
        pub.removeFavouritesForUser = function (data) {
            try {
                event.stopPropagation();
                if (headerModel.domain.user().UserType() == "Tenant") {
                    loading('show');
                    listing.saveFavourites(parseInt(data.communityId()), headerModel.domain.user().UserId(), true, favouriteRemoveOnSuccess, favouriteRemoveOnFailure, 'header.removeFavouritesForUser');
                }
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        function favouriteRemoveOnSuccess(result) {
            try {
                headerModel.domain.tenant.rentals(_.filter(headerModel.domain.tenant.rentals(), function (rental) {
                    return rental.communityId() !== result.CommunityId;
                }));
                if (typeof (index) !== "undefined") {
                    for (var i = 0; i < indexModel.domain.rentalPanelList().length; i++) {
                        var communityId = indexModel.domain.rentalPanelList()[i].CommunityId();
                        if (communityId == result.CommunityId) {
                            indexModel.domain.rentalPanelList()[i].IsTenantFavourite(result.IsTenantFavorite);
                        }
                    }
                }
                if (typeof (tnResult) !== "undefined") {
                    for (var i = 0; i < tnResultModel.domain.propertyList().length; i++) {
                        var communityId = tnResultModel.domain.propertyList()[i].CommunityId();
                        if (communityId == result.CommunityId) {
                            tnResultModel.domain.propertyList()[i].IsTenantFavourite(result.IsTenantFavorite);
                        }
                    }
                    tnResultModel.domain.isFavoriteClicked(true);
                }
                if (typeof (propertyDetails) !== "undefined" && typeof (propertyDetailsModel) !== "undefined" && headerModel.domain.user().UserType() == "Tenant") {
                    var communityId = propertyDetailsModel.domain.communityId();
                    if (communityId == result.CommunityId) {
                        propertyDetailsModel.domain.IsTenantsFavorite(result.IsTenantFavorite);
                    }
                }
                headerModel.domain.faviconCommunityId(0);
                headerModel.domain.tenant.favoriteCount(result.TotalFavoritesCount);
                loading('hide');
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }
        function favouriteRemoveOnFailure(xhr, status, error) {
            try {
                headerModel.domain.faviconCommunityId(0);
                user.handleOperationException(xhr, status, error);
                loading('hide');
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        /**
         * Remove Favourite Landlord.
         * @param {any} prop
         */
        pub.removeFavLandlords = function (prop, event) {
            $.when(
                performTenantAction('RemoveFavoriteLandlord', JSON.stringify({ LandlordID: prop.landlordId() }))
            ).then(function () {
                headerModel.domain.tenant.landlords(_.filter(headerModel.domain.tenant.landlords(), function (landlord) {
                    return landlord.landlordId() !== prop.landlordId()
                }));

                if (parseInt(landlordid) === prop.landlordId()) {
                    $("#SaveLandlordDiv").show();
                    $("#SaveLandlordDivDeactivate").hide();
                }
            });
            event.stopPropagation();
        }

        /**
         * Remove Favourite Search.
         * @param {any} prop
         */
        pub.removeFavSearch = function (prop, event) {
            $.when(
                performTenantAction('RemoveSavedSearch', JSON.stringify({ SearchID: prop.searchID() }))
            ).then(function () {
                headerModel.domain.tenant.searches(_.filter(headerModel.domain.tenant.searches(), function (result) {
                    return result.searchID() !== prop.searchID()
                }));
            });
            event.stopPropagation();
        }

        /**
         * Redirect to Favourite Search.
         * @param {any} url
         */
        pub.redirectToFavSearch = function (url, event) {
            event.stopPropagation();
            window.location.href = url;
        }

        /**
         * Reset favourite collection
         */
        function resetResult() {
            headerModel.domain.tenant.rentals([]);
            headerModel.domain.tenant.landlords([]);
            headerModel.domain.tenant.searches([]);
        }

        /**
         * Use for event register.
         * @param {any} param
         */
        pub.goToRedirect = function (param, url) {
            window.location.href = url;
        }

        pub.showHideMobileMenu = function (event) {
            /*  Toggle submenu */
            event.stopPropagation();
            if ($(event.currentTarget).next('div').is(':visible')) {
                $('.topnavigation-dropdownmenu, .myaccount-dropdownmenu, .topnavigation-subdropdownmenu').hide();
                $(event.currentTarget).removeClass('close');
                $('#sign-in, .search-ico-mn').show();
                $('.dvMoreMenu .mobile-innersubmenu > a').removeClass('moremenu-downarr');
                $('.dvMoreMenu').removeClass('landlord-leftnav-scroll');
                return;
            }
            else {
                $('.topnavigation-dropdownmenu, .myaccount-dropdownmenu').hide();
                $(event.currentTarget).next('div').slideToggle();
                $('#sign-in, .search-ico-mn').hide();
                $(event.currentTarget).addClass('close');
            }
            $('.favourite--dropdownmenu').hide();
        }

        pub.showHideMobileSubMenu = function (event) {
            event.stopPropagation();
            if ($(event.currentTarget).next('div').is(':visible')) {
                $('.topnavigation-subdropdownmenu').hide();
                $(event.currentTarget).removeClass('moremenu-downarr');
                $('.dvMoreMenu').removeClass('landlord-leftnav-scroll');
                return;
            }
            else {
                $('.topnavigation-subdropdownmenu').hide();
                $('.mobile-innersubmenu a').removeClass('moremenu-downarr');
                $(event.currentTarget).addClass('moremenu-downarr');
                $('.dvMoreMenu').addClass('landlord-leftnav-scroll');
                $(event.currentTarget).next('div').slideToggle();
            }
        }

        /**
         * Show hide More sub menu for landlord/advertiser.
         */
        pub.showHideMoreSubMenu = function (event) {
            event.stopPropagation();
            if ($(event.currentTarget).next('div').is(':visible')) {
                $('.topnavigation-dropdownmenu').hide();
                return;
            }
            else {
                $('.topnavigation-dropdownmenu').hide();
                $(event.currentTarget).next('div').show();
            }
        }

        pub.showSignupModalToLandlords = function () {
            try {
                if (headerModel.domain.user() && headerModel.domain.user().UserType() !== headerModel.view.userType.Tenant) {
                    loginControl.logout();
                    headerModel.domain.showModalForOwnerFavorites(false);
                    //open signup popup for owner and ha
                    var signUpParams = {
                        renterRedirectUrl: ko.observable(null),
                        ownerRedirectUrl: ko.observable(null),
                        defaultUserType: ko.observable(headerModel.view.userType.Tenant)
                    };
                    setTimeout(function () {
                        loginControl.onSignUpClick(signUpParams);
                    }, 300);

                }
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        pub.cancelModalForOwnerFavorites = function () {
            try {
                headerModel.domain.showModalForOwnerFavorites(false);
                headerModel.domain.faviconCommunityId(0);
                headerModel.domain.favLandLordUserId(0);
                headerModel.domain.saveSearchAfterLogin(false);
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        /**
         * Show mobile refine search menu.
         */
        setTimeout(function () {

        }, 100);

        pub.mobileRefineSearch = function () {
            //  Close
            if ($('.mobilerefinesearch').hasClass("close")) {
                $('.mobilerefinesearch').removeClass("close");
                $(".mobileback, .listingviews, #menulogin").show();
                $(".mobilemenu").attr('style', 'display:block !important');
                if (headerModel.domain.profile.userId() === "") {
                    $(".mobilerefinesearch, .mobilerefinesearch.close").removeClass("search-close-icon-right");
                }
                $(".mobilerefinesearchini").hide();
                $(".mobiletitle").html("");
                $("body, html").removeClass("noscroll");
                $(".refine, .mobilefilter-view, .refinemodalbg").fadeOut(300);
            }
            // Open
            else {
                $(".mobileback, .listingviews, #menulogin").hide();
                $(".mobilemenu").attr('style', 'display:none !important');
                if (headerModel.domain.profile.userId() === "") {
                    $(".mobilerefinesearch, .mobilerefinesearch.close").addClass("search-close-icon-right");
                }
                $(".mobilerefinesearchini").show();
                if (typeof (portalDetails) !== 'undefined' && portalDetails.HaId() !== '') {
                    $(".mobiletitle").html("");
                }
                else {
                    $(".mobiletitle").html("Search");
                }
                $("body, html").addClass("noscroll");
                $(".refine, .mobilefilter-view, .refinemodalbg").fadeIn(300);
                $('.mobilerefinesearch').addClass("close");
            }
        }

        headerModel.domain.landlord.refreshNavigationCount.subscribe(function (newValue) {
            if (newValue) {
                getLandlordNavigation();
            }
        });

        /** setTenantRecentSearch location details
         *  Clear the search box after tenant login/signup 
            search control file path = 
            v4\controls\searchBoxForListings\searchBoxForListings.html
            v4\controls\searchBoxForListings\searchBoxForListings.js
        **/
        function setUserSpecificDetails() {
            if (headerModel.domain.user()) {
                if (typeof (index) !== "undefined" || typeof (haResults) !== "undefined" || typeof (propertyDetails) !== "undefined" || typeof (tnResult) !== "undefined" || typeof (partnerHaLanding) !== "undefined" || typeof (basicConnectLanding) !== "undefined" || typeof (nonPartnerHaLanding) !== "undefined") {

                    listing.getUserRecentSearchLocations(getUserRecentSearchLocationsSuccess,
                        helper.remoteOperationFailure);
                }

                if (headerModel.domain.user().UserType() === headerModel.view.userType.Tenant) {
                    $('.searchTextbox').val("");
                    $('.searchPreviewbox').val("");

                    $.cookie(lastsearchqueryCookieName, '', { expires: -1, path: '/', secure: true });

                    tenant.getTenant(function (result) {
                        var moveDate = moment(result.MoveBy).format("MM/DD/YYYY");
                        var firstName = result.FirstName;
                        var lastName = result.LastName;
                        var phone = result.Phone;
                        var email = result.Email;
                        var cookieValue = "FirstName=" + firstName + "&LastName=" + lastName + "&Email=" + email + "&Phone=" + phone + "&moveDate=" + moveDate + "";
                        $.cookie('tenantInfo', null, { path: '/' });
                        document.cookie = "tenantInfo" + "=" + cookieValue + "; path=/";
                    });
                }
                else if (headerModel.domain.user().UserType() === headerModel.view.userType.Landlord) {
                    setUserInfo();
                    updateRentalPanelList();//Owners
                }
            }
        }

        function clearTenantLastSearch()
        {
            $.cookie(lastsearchqueryCookieName, '', { expires: -1, path: '/', secure: true });
            $.cookie(visitorAffordabilityFilter, '', { expires: -1, path: '/', secure: true });
            $.cookie("userlastvalidsearchlocation", '', { expires: -1, path: '/', secure: true });
            
            var suggestionsRecent = JSON.parse($.cookie(recentSearchCookieName));
            if (suggestionsRecent == null || suggestionsRecent == undefined)
            {
                suggestionsRecent = [];
            }
            if (suggestionsRecent.length > 0)
            {
                suggestionsRecent = _.filter(suggestionsRecent, function (item)
                {
                    return item.isLoggedUserCookie == false;
                });

                if (suggestionsRecent.length > 10)
                {
                    suggestionsRecent = _.take(suggestionsRecent, 10);
                }

                if (suggestionsRecent.length > 0)
                    $.cookie(recentSearchCookieName, JSON.stringify(suggestionsRecent), { expires: 30, path: '/', secure: true });
                else
                    $.cookie(recentSearchCookieName, "", { expires: -1, path: '/', secure: true });
            }
            else
            {
                $.cookie(recentSearchCookieName, "", { expires: -1, path: '/', secure: true });
            }
        }

        function getUserRecentSearchLocationsSuccess(result)
        {
            var suggestionsRecent = [];
            
            suggestionsRecent = JSON.parse($.cookie(recentSearchCookieName));

            if (suggestionsRecent == null || suggestionsRecent == undefined)
            {
                suggestionsRecent = [];
            }

            if (suggestionsRecent.length > 0)
            {
                suggestionsRecent = _.forEach(suggestionsRecent, function (item)
                {
                    if (typeof item.isLoggedUserCookie == "undefined")
                    {
                        item.isLoggedUserCookie = false;
                    }
                });
            }

            if (result !== null && result.searchedLocations !== null && result.searchedLocations.length > 0) {
                for (var i = 0; i < result.searchedLocations.length; i++)
                {
                    var searchObj = JSON.parse(result.searchedLocations[i].searchedLocationText);
                    searchObj.isLoggedUserCookie = true;
                    suggestionsRecent.push(searchObj);
                }

                suggestionsRecent = _.uniqBy(suggestionsRecent, 'areaName');
                suggestionsRecent = _.orderBy(suggestionsRecent, ['isLoggedUserCookie'], ['desc']);

                if (suggestionsRecent.length > 10)
                {
                    suggestionsRecent = _.take(suggestionsRecent, 10);
                }

                if (suggestionsRecent.length > 0)
                    $.cookie(recentSearchCookieName, JSON.stringify(suggestionsRecent), { expires: 30, path: '/', secure: true });
                else
                    $.cookie(recentSearchCookieName, "", { expires: -1, path: '/', secure: true });
            }
            else {
                if (suggestionsRecent.length > 0)
                {
                    suggestionsRecent = _.uniqBy(suggestionsRecent, 'areaName');
                    suggestionsRecent = _.orderBy(suggestionsRecent, ['isLoggedUserCookie'], ['desc']);

                    if (suggestionsRecent.length > 10)
                    {
                        suggestionsRecent = _.take(suggestionsRecent, 10);
                    }

                    $.cookie(recentSearchCookieName, JSON.stringify(suggestionsRecent), { expires: 30, path: '/', secure: true });
                }
                else
                    $.cookie(recentSearchCookieName, "", { expires: -1, path: '/', secure: true });
            }

            updateRentalPanelList();
            if (typeof (index) !== "undefined") {
                index.populateHomeNearbyHAPanel();
            }
        }

        function updateRentalPanelList() {
            if (typeof (index) !== "undefined") {
                index.getRentalPanelList();
            }
            if (typeof (tnResult) !== "undefined") {
                tnResult.bindList();
            }
        }

        function hasNewInboundTenantEmails() {

            try {
                listing.hasNewInboundUserEmails(headerModel.domain.profile.userId(),
                    hasNewInboundTenantEmailsSuccess,
                    hasNewInboundTenantEmailsFailure);
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        function hasNewInboundTenantEmailsFailure() {
            try {
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        function hasNewInboundTenantEmailsSuccess(result) {
            try {
                if (result && result.Success) {
                    headerModel.view.showNewInboundTenantEmails(result.HasNewInboundEmails);
                }
                else {
                    headerModel.view.showNewInboundTenantEmails(false);
                }
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        /*** */

        function hasNewInboundOwnerEmails() {

            try {
                listing.hasNewInboundUserEmails(headerModel.domain.profile.userId(),
                    hasNewInboundOwnerEmailsSuccess,
                    hasNewInboundOwnerEmailsFailure);
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        function hasNewInboundOwnerEmailsFailure() {
            try {
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        function hasNewInboundOwnerEmailsSuccess(result) {
            try {
                if (result && result.Success) {
                    headerModel.view.showInboxNotification(result.HasNewInboundEmails);
                }
                else {
                    headerModel.view.showInboxNotification(false);
                }
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }
        /*** */
        pub.redirectToRenterInbox = function () {
            window.location.href = "/v4/pages/renterInbox/renterInbox.aspx";
        }

        pub.acknowledgeHaWLNotification = function () {           
            listing.updateHaToRenterNotifications(function (result) // Success
            {
                headerModel.view.showHaToRenterNotification(false);
            }, function (xhr, status, error) // Failure
            {
            });

            window.location.href = "/v4/pages/myWaitlistApplications/myWaitlistApplications.aspx";
        }

        pub.redirectToUrl = function (notificationId, url) {
            listing.watchUserBellNotification(
                notificationId,
                function () {
                    window.location.href = url;
                },
                function () {
                    // Fallback in case if backend can't process 'watch' request
                    // As we still need to redirect user to notification url
                    window.location.href = url;
                }
            );
        }

        //To set cookie values to detect the first page after login
        function firstActionAfterLogin() {
            if ($.cookie('firstAction') === null) {
                $.cookie('firstAction', 1, { path: '/' });
            }

            if ($.cookie('firstAction') != null) {
                if ($.cookie("firstAction") === '1') {
                    $.cookie('firstAction', 2, { path: '/' });
                }
                else if ($.cookie("firstAction") === '2'
                    && headerModel.domain.user()
                    && headerModel.domain.user().UserType() === headerModel.view.userType.Landlord) {
                    $.cookie('firstAction', 3, { path: '/' });
                }

                if (headerModel.domain.user()
                    && headerModel.domain.user().UserType() === headerModel.view.userType.Tenant
                    && $.cookie("firstAction") === '2') {
                    $(".noti--dropdown").toggle();
                    $.cookie('firstAction', 0, { path: '/' });
                } else if (headerModel.domain.user()
                    && headerModel.domain.user().UserType() === headerModel.view.userType.Landlord
                    && $.cookie("firstAction") === '3') {
                    $(".noti--dropdown").toggle();
                    $.cookie('firstAction', 0, { path: '/' });
                }
            }
        }
        pub.redicttoUrl = function (URL, type) {
            try {
                if (!helper.isUndefinedOrNullOrEmpty(URL) && URL != "undefined") {
                    if (type == "Internal") {
                        window.location.href = "/Resource/" + URL;
                    }
                    else {
                        $("#ExternalLinkModel").show();
                        headerModel.view.portalResourceExternalURL(URL);
                    }
                }
            }
            catch (ex) { go8Error.handleException(ex); }
        }

        pub.closoPopUp = function () {
            try {
                $("#ExternalLinkModel").hide();
                headerModel.view.portalResourceExternalURL('');
            }
            catch (ex) { go8Error.handleException(ex); }
        }
        pub.redirectUrl = function () {
            try {
                $("#ExternalLinkModel").hide();
                window.open(headerModel.view.portalResourceExternalURL(), '_blank')
            }
            catch (ex) { go8Error.handleException(ex); }
        }

        pub.getPortalHomePageData = function () {
            //if (window.location.href.includes("https://ahportaleditor.nirvana.gosection8.local"))
            // headerModel.view.portalHaId(468);

            if (headerModel.view.portalHaId() > 0) {
                listing.getHomePageData(headerModel.view.portalHaId(), headerModel.view.portalHomePageId(), headerModel.view.portalHomePagestatus(),
                    getHomePageDataSuccess, getHomePageDataFailure);
            }
        }

        function getHomePageDataSuccess(result) {
            try {
                if (result.Status == true) {
                    var modelData = result.Data;
                    headerModel.view.portalHeaderData(JSON.parse(modelData.HeaderJson));

                    if (!helper.isUndefinedOrNullOrEmpty(headerModel.view.portalHeaderData())) {
                        headerModel.view.portalHeaderLogo(headerModel.view.portalHeaderData().Logo);
                        if (!helper.isUndefinedOrNullOrEmpty(headerModel.view.portalHeaderData().Resources)) {
                            headerModel.view.portalHeaderResources(JSON.parse(headerModel.view.portalHeaderData().Resources));
                        }
                        if (!helper.isUndefinedOrNullOrEmpty(headerModel.view.portalHeaderData().Note)) {
                            headerModel.view.portalHeaderNote(headerModel.view.portalHeaderData().Note[0].Note);
                            headerModel.view.portalHeaderNoteLink(headerModel.view.portalHeaderData().Note[0].LinkUrl);
                        }
                    }
                    headerModel.view.portalFooterData(JSON.parse(modelData.FooterJson));
                }
            }
            catch (ex) { go8Error.handleException(ex); }
        }

        function getHomePageDataFailure() {
            try { }
            catch (ex) { go8Error.handleException(ex); }
        }

        pub.redirectToApplicantsPage = function () {
            window.location.href = headerModel.view.lastUpdatedApplicantPage();
        }

        pub.trustedToastMessageClicked = function () {
            sessionStorage.setItem("isTrustedOwnerToastMessageClosed", true);
            headerModel.view.isTrustedOwnerToastMessageClosed('true');
        }

        return pub;
    }
    catch (ex) {
        go8Error.handleException(ex);
    }
}());

function getMarketingFeatureBanner() {
    listing.getMarketingFeatureBanner(getMarketingFeatureBannerOnSuccess, getMarketingFeatureBannerOnFailure);
}

function getMarketingFeatureBannerOnSuccess(result) {
    try {
        localStorage.removeItem("BannersList");
        localStorage.removeItem("RSOD");
        localStorage.removeItem("OIB");
        localStorage.setItem("BannersList", JSON.stringify(result.FeatureBanners));
    }
    catch (ex) {
        go8Error.handleException(ex);
    }
}

function getMarketingFeatureBannerOnFailure(xhr, status, error) {
    try {
        user.handleOperationException(xhr, status, error);
    } catch (ex) {
        go8Error.handleException(ex);
    }
}

var loginControl = (function ()
{
    try
    {

        var pub = {
            isReady: ko.observable(false),
        };
        var loginViewModel;
        var isNeedToCallHousingAssistant = true;

        pub.init = function (vm)
        {
            loginViewModel = vm;
            if (headerModel.domain.options.signinControlType() === 'page')
                loadHashUrl();
            //may be we can move this to onsignupclick event  - praveena
            listing.checkScammerIPAddress(function (result)
            {
                if (result.isScammer)
                {
                    loginViewModel.domain.scammerIp(result.isScammer);
                } else
                {
                    loginViewModel.domain.scammerIp(false);
                }

            });
            var qs = helper.getQueryStrings();
            var qsAction = qs["action"];
            if (qsAction && qsAction === "signin")
            {
                pub.onSignInClick();
            }

            if (qsAction && qsAction === "isscammer") {
                /** Clears query string parameter values */
                $('.seon-scammer').show();
                setTimeout(function () {
                    var clean_uri = location.protocol + "//" + location.host + location.pathname;
                    window.history.replaceState({}, document.title, clean_uri);
                }, 200);
            }

            pub.isReady(true);
            googleSignIn.showGooglePopUp(loginViewModel);
        }

        //<to-do> pass default params values here
        pub.switchView = function (view)
        {
            //expected values signin, signup
            if (view === 'signin')
            {
                pub.onSignInClick();

            } else if (view === 'signup')
            {
                pub.onSignUpClick();
            }
            else
            {
                // close button click
                closeActiveElements();
                headerModel.domain.faviconCommunityId(0);
                headerModel.domain.favLandLordUserId(0);
                if (headerModel.domain.saveSearchAfterLogin() === true)
                {
                    headerModel.domain.saveSearchAfterLogin(false);
                    if (typeof (tnResult) != "undefined")
                    {
                        tnResult.redirectUserToKoAfterLogin();
                    }
                }
            }
        };
        pub.switchUser = function ()
        {
            if ($(".show-pwd").hasClass("fa-eye-slash"))
                $(".show-pwd").trigger("click");

            listing.logout(true, logOutOnSuccess, loginOnFailure);
            if (headerModel.domain.options.onSignInClose != null)
            {
                location.href = "/?action=signin";
            }
            else
            {
                resetModal();
                loginViewModel.userValidation.errors.showAllMessages(false);
                loginViewModel.view.activeModal(loginViewModel.view.modalState.signIn);
            }
        };

        pub.onSignInClose = function ()
        {
            if (headerModel.domain.user() && !headerModel.domain.user().SecureSignIn())
            {
                if (!helper.isUndefinedOrNullOrEmpty(loginViewModel.domain.params.renterRedirectUrl()))
                    window.location = loginViewModel.domain.params.renterRedirectUrl();
                else
                {
                    if (loginViewModel.domain.params.onSuccess)
                        loginViewModel.domain.params.onSuccess();
                    closeActiveElements();
                }
            }
            else
            {
                if (headerModel.domain.options.onSignInClose != null)
                {
                    headerModel.domain.options.onSignInClose();
                }
                else
                {
                    closeActiveElements();
                }
            }
            headerModel.domain.faviconCommunityId(0);
            headerModel.domain.favLandLordUserId(0);
            headerModel.domain.saveSearchAfterLogin(false);
        }

        pub.onSignInClick = function (signInParams)
        {
            if (headerModel.domain.options.signinControlType() === 'page' && !helper.isUndefinedOrNullOrEmpty(window.location.hash))
                window.history.pushState(null, null, "#sign-in");

           
            resetModal();
            pub.resetValidation();
            assignParams(signInParams);
            loginViewModel.view.activeAction('signin');
            loginViewModel.view.activeModal(loginViewModel.view.modalState.signIn);
            
            if (headerModel.domain.options.signinControlType() === 'page')
            {
                setTimeout(function ()
                {
                    googleSignIn.onPageLoad(loginViewModel);
                }, 100);
            }
            else
                googleSignIn.onPageLoad(loginViewModel);

            faceBookSignIn.onPageLoad(loginViewModel);

            loadContainerCSS();
        }

        pub.onSignUpClick = function (signUpParams)
        {
            if (headerModel.domain.options.signinControlType() === 'page')
                window.history.pushState(null, null, "#sign-up");

          
            var defaultUserType = loginViewModel.domain.params.signUpUserType();
            loginViewModel.domain.signup.userType(loginViewModel.view.userType.tenant);
            loginViewModel.domain.signup.userType(null);
            loginViewModel.domain.params.signUpUserType(null);
            resetModal();
            pub.resetValidation();
            if (!helper.isUndefinedOrNullOrEmpty(signUpParams))
            {
                assignParams(signUpParams);
            }
            else if (defaultUserType)
            {
                loginViewModel.domain.signup.userType(defaultUserType);
                loginViewModel.domain.params.signUpUserType(defaultUserType);
            }
            loginViewModel.view.activeAction('signup');
            loginViewModel.view.activeModal(loginViewModel.view.modalState.signUp);
            loadContainerCSS();
            loginViewModel.domain.signup.signupType('email');
            if (headerModel.domain.faviconCommunityId() > 0 || headerModel.domain.saveSearchAfterLogin() === true || (typeof (propertyDetailsModel) !== "undefined" && propertyDetailsModel.domain.landlordUserId() > 0))
            {
                loginViewModel.domain.signup.userType(loginViewModel.view.userType.tenant);
            }
            //else {
            //    loginViewModel.domain.signup.userType(null);
            //}

            if (headerModel.domain.options.signinControlType() === 'page')
            {
                setTimeout(function ()
                {
                    googleSignIn.onPageLoad(loginViewModel);
                }, 100);
            }
            else
                googleSignIn.onPageLoad(loginViewModel);

            faceBookSignIn.onPageLoad(loginViewModel);
        }

        function assignParams(params)
        {
            if (!helper.isUndefinedOrNullOrEmpty(params))
            {
                //redirect url after sign in as renter
                if (params.renterRedirectUrl && params.renterRedirectUrl())
                    loginViewModel.domain.params.renterRedirectUrl(params.renterRedirectUrl());
                //redirect url after sign in as owner
                if (params.ownerRedirectUrl && params.ownerRedirectUrl())
                    loginViewModel.domain.params.ownerRedirectUrl(params.ownerRedirectUrl());
                //redirect url from confirm, fgtpswd, fgtun emails cta
                if (params.emailRedirectUrl && params.emailRedirectUrl())
                    loginViewModel.domain.params.emailRedirectUrl(params.emailRedirectUrl());
                //default user type for sign up
                if (params.defaultUserType && params.defaultUserType())
                {
                    loginViewModel.domain.signup.userType(params.defaultUserType());
                    loginViewModel.domain.params.signUpUserType(params.defaultUserType());
                }
                //call back after sign in or sign up is complete
                if (!helper.isUndefinedOrNullOrEmpty(params.callBack))
                    loginViewModel.domain.params.onSuccess = params.callBack;
                //to force renter to sign up with password
                if (!helper.isUndefinedOrNullOrEmpty(params.passwordRequiredForTenant))
                    loginViewModel.domain.params.passwordRequiredForTenant = params.passwordRequiredForTenant;
                //to stop redirecting renters with password to wl apps page
                if (!helper.isUndefinedOrNullOrEmpty(params.shouldRedirectSecureRenter))
                    loginViewModel.domain.params.shouldRedirectSecureRenter = params.shouldRedirectSecureRenter;
                // to pre-populate username
                if (!helper.isUndefinedOrNullOrEmpty(params.preUserName))
                    loginViewModel.domain.signin.userName(params.preUserName);
            }

        }

        pub.onForgotUserNameClick = function ()
        {
            if (headerModel.domain.options.signinControlType() === 'page')
                window.history.pushState(null, null, "#forgot-username");

            resetModal();
            pub.resetValidation();
            loginViewModel.view.activeModal(loginViewModel.view.modalState.forgotUserName);
        }

        pub.loginWithUserName = function ()
        {
            loginViewModel.domain.signin.signInType('email');
            loginViewModel.domain.signin.scammerDeactive(false);
            loginViewModel.domain.signin.userNotFound(false);
            loginViewModel.domain.socialSignInNotAvailable(false);
            loginViewModel.view.activeLoading(loginViewModel.view.button.signIn);
            //check for dup user and if exists as renter and not scammer log them in and if they have pswrd then show next screen
            if (loginViewModel.userValidation.errors().length > 0)
            {
                loginViewModel.view.activeLoading('');
                loginViewModel.userValidation.errors.showAllMessages();
            }
            else
            {
                pub.login(loginViewModel.domain.signin.userName());
            }
            if (typeof (tnResult) !== "undefined")
            {
                if (tnResult.showMobileSearch())
                {
                    tnResult.showHideMobileFilter(false);
                }
            }
        }

        pub.loginUser = function ()
        {
            sessionStorage.removeItem("isTrustedOwnerToastMessageClosed");
            if (loginViewModel.view.activeModal() === loginViewModel.view.modalState.signInPassword)
                loginViewModel.domain.signin.buttonClicked(true);

            //we can expect user is clean here as this is step 2 of the process so no need to check for scammer stuff login user with username and password
            loginViewModel.domain.signin.signInType('email');
            loginViewModel.view.activeLoading(loginViewModel.view.button.signIn);
            if (loginViewModel.passwordValidation.errors().length === 0)
            {
                pub.toggleLoginControls(true);
                listing.login(loginViewModel.domain.signin.userName(), loginViewModel.domain.signin.password(), loginViewModel.domain.signin.userType(),
                    function (result)
                    {
                        loginOnSuccess(result, false);
                    },
                    loginOnFailure);
            }
            else
            {
                loginViewModel.view.activeLoading('');
                loginViewModel.passwordValidation.errors.showAllMessages();
            }

        }
        pub.goBack = function ()
        {
            window.history.go(-1);
        }
        //pub.updateEmail = function (){
        //    loginViewModel.view.activeLoading(loginViewModel.view.button.updateConfirmEmail);
        //    if (loginViewModel.updateEmailValidation.errors().length == 0){
        //        listing.emailExists(loginViewModel.domain.confirmEmail.newEmail(),
        //            function (result){
        //                if (result.exists){
        //                    loginViewModel.view.activeLoading('');
        //                    loginViewModel.domain.confirmEmail.emailExists(true);
        //                }                            
        //                else{
        //                    listing.updateEmail(loginViewModel.domain.confirmEmail.newEmail(), true, window.location.href,
        //                        function (result)
        //                        {
        //                            if (result.success)
        //                            {
        //                                loginViewModel.view.activeLoading('');
        //                                loginViewModel.domain.confirmEmail.newEmailSent(true);
        //                                loginViewModel.domain.confirmEmail.emailTokenExpirationInHours(result.emailTokenExpirationInHours);
        //                                loginViewModel.domain.confirmEmail.showUpdateEmail(false);
        //                                loginViewModel.domain.confirmEmail.emailSentTo(loginViewModel.domain.confirmEmail.newEmail());
        //                            }
        //                        });
        //                }
        //            });
        //    }
        //    else{
        //        loginViewModel.view.activeLoading('');
        //        loginViewModel.updateEmailValidation.errors.showAllMessages();
        //    }
        //}

        //pub.resendConfirmationEmail = function (){
        //    loginViewModel.view.activeLoading(loginViewModel.view.button.resendConfirmEmail);
        //    listing.resendConfirmationEmail(window.location.href, function (result) {
        //        if (result.success)
        //        {
        //            loginViewModel.view.activeLoading('');
        //            loginViewModel.domain.confirmEmail.newEmailSent(true);
        //            loginViewModel.domain.confirmEmail.emailTokenExpirationInHours(result.emailTokenExpirationInHours);
        //            loginViewModel.domain.confirmEmail.showUpdateEmail(false);
        //            loginViewModel.domain.confirmEmail.emailSentTo(result.emailAddress);
        //        }
        //    });
        //}

        pub.deactivateOtherUserTypes = function (userTypeToKeep)
        {
            var signInType = loginViewModel.domain.signin.signInType();
            loginViewModel.view.activeLoading(_.toLower(userTypeToKeep));
            if (signInType === 'facebook')
                loginViewModel.domain.signin.userName(loginViewModel.domain.signin.facebook.email());
            if (signInType === 'google')
                loginViewModel.domain.signin.userName(loginViewModel.domain.signin.google.email());

            listing.deactivateDuplicateAccount(loginViewModel.domain.signin.userName(), userTypeToKeep, function (result)
            {
                if (result.success)
                {
                    loginViewModel.view.activeLoading('');
                    loginViewModel.view.activeModal(loginViewModel.view.modalState.signIn);
                    loginViewModel.domain.dupAccount.error(false);
                    loginViewModel.domain.dupAccount.success(true);
                    loginViewModel.domain.dupAccount.exist(false);

                    if ((signInType === 'facebook' ||
                        signInType === 'google') && userTypeToKeep === loginViewModel.view.userType.ha)
                    {
                        loginViewModel.domain.dupAccount.success(false);
                        loginViewModel.domain.socialSignInNotAvailable(true);
                    }

                }
                else
                {
                    loginViewModel.view.activeLoading('');
                    loginViewModel.domain.dupAccount.error(true);
                    loginViewModel.domain.dupAccount.success(false);
                    loginViewModel.domain.dupAccount.exist(true);
                }
            });
        }

        pub.forgotUserName = function ()
        {
            loginViewModel.view.activeLoading(loginViewModel.view.button.forgotUserName);
            if (loginViewModel.forgotUsernameEmailValidation.errors().length == 0)
            {

                //localStorage.setItem("username", loginViewModel.domain.forgotUserName.userName());

                listing.sendForgotUsernameEmail(loginViewModel.domain.forgotUserName.userName(), loginViewModel.domain.emailRenterRedirect(), loginViewModel.domain.emailOwnerRedirect(),
                    function (result)
                    {
                        if (!result.emailExists)
                        {
                            loginViewModel.domain.forgotUserName.error(false);
                            loginViewModel.domain.forgotUserName.success(false);
                            loginViewModel.domain.forgotUserName.emailExists(false);
                            loginViewModel.domain.forgotUserName.emailSentTo('');
                        } else if (!result.success)
                        {
                            loginViewModel.domain.forgotUserName.error(true);
                            loginViewModel.domain.forgotUserName.success(false);
                            loginViewModel.domain.forgotUserName.emailExists(true);
                            loginViewModel.domain.forgotUserName.emailSentTo('');
                        } else
                        {
                            loginViewModel.domain.forgotUserName.error(false);
                            loginViewModel.domain.forgotUserName.success(true);
                            loginViewModel.domain.forgotUserName.emailExists(true);
                            loginViewModel.domain.forgotUserName.emailSentTo(loginViewModel.domain.forgotUserName.userName());
                        }

                        loginViewModel.view.activeLoading('');
                    });
            }
            else
            {
                loginViewModel.view.activeLoading('');
                loginViewModel.forgotUsernameEmailValidation.errors.showAllMessages();
            }
        }

        //pub.saveEmail = function ()
        //{
        //    loginViewModel.view.activeLoading(loginViewModel.view.button.emailRequired);
        //    if (loginViewModel.emailRequiredValidation.errors().length === 0)
        //    {
        //        // API to update the email of current username
        //        listing.updateEmail(loginViewModel.domain.emailRequired.emailAddress(), false, window.location.href, 
        //            function (result)
        //            {
        //                loginViewModel.view.activeLoading('');
        //                if (result.success)
        //                {
        //                    loginViewModel.domain.emailRequired.updateSuccess(true);
        //                }
        //                else
        //                {
        //                    loginViewModel.domain.emailRequired.updateSuccess(false);
        //                }
        //            });
        //    }
        //    else
        //    {
        //        loginViewModel.view.activeLoading('');
        //        loginViewModel.emailRequiredValidation.errors.showAllMessages();
        //    }
        //}

        pub.onClickForgotPassword = function ()
        {
            loginViewModel.view.activeLoading(loginViewModel.view.button.signIn);
            if (loginViewModel.domain.signin.userType() === loginViewModel.view.userType.ha)
            {
                loginViewModel.view.activeLoading('');
                listing.getHaDashboardRedirect(loginViewModel.domain.signin.userName(),
                    function (result)
                    {
                        window.location.href = result.redirectUrl;
                        return;
                    });
            }
            else
            {
                var redirect = '';
                if (loginViewModel.domain.signin.userType() === loginViewModel.view.userType.landlord)
                    redirect = loginViewModel.domain.emailOwnerRedirect();
                else if (loginViewModel.domain.signin.userType() === loginViewModel.view.userType.tenant)
                    redirect = loginViewModel.domain.emailRenterRedirect();

                listing.sendResetPasswordEmail(loginViewModel.domain.signin.userName(), loginViewModel.domain.signin.userType(), redirect,
                    function (result)
                    {
                        if (result)
                        {
                            loginViewModel.view.activeLoading('');
                            loginViewModel.domain.forgotPass.emailSentTo(result.email);
                            loginViewModel.domain.forgotPass.emailTokenExpirationInHours(result.emailTokenExpirationInHours);
                        }
                    });
            }
        }

        pub.validateRequiredEmail = function ()
        {
            try
            {
                listing.emailExists(loginViewModel.domain.emailRequired.emailAddress(),
                    function (result)
                    {
                        if (result.exists)
                        {

                            if (loginViewModel.domain.emailRequired.emailAddress() === loginViewModel.domain.signin.userName())
                            {
                                loginViewModel.domain.emailRequired.emailExists(false);
                            }
                            else
                            {
                                // show validation message if it exists
                                loginViewModel.domain.emailRequired.emailExists(true);
                            }
                        }
                        else
                        {
                            loginViewModel.domain.emailRequired.emailExists(false);
                        }
                    });

                return false;
            }
            catch (ex)
            {

            }
        }

        pub.validateEmail = function ()
        {
            try
            {
                loginViewModel.domain.signup.emailSelected(false);

                if (loginViewModel.domain.signup.email())
                {
                    if (loginViewModel.domain.signup.email.isModified() && loginViewModel.domain.signup.email.isValid())
                    {
                        listing.emailExists(loginViewModel.domain.signup.email(),
                            function (result)
                            {
                                if (result.exists)
                                {
                                    loginViewModel.domain.signup.emailExists(true);
                                }
                                else
                                {
                                    loginViewModel.domain.signup.emailExists(false);
                                }
                            });
                    }
                }
                else
                {
                    loginViewModel.domain.signup.email(null);
                }
            }
            catch (ex)
            {
            }
        }

        pub.enterBtnClick = function (action, e)
        {
            loginViewModel.domain.signup.phone.clearError();
            loginViewModel.domain.signup.lastName.clearError();

            if (action)
            {
                e.stopPropagation();
                if (e.keyCode === 13)
                {
                    if (action === 'login')
                    {
                        pub.loginWithUserName();
                    }
                    else if (action === 'loginWithPass')
                    {
                        pub.loginUser();
                    }
                    else if (action === 'signup')
                    {
                        pub.signUp();
                    }
                    else if (action === 'signUpPassword')
                    {
                        pub.signUpWithPassword();
                    }
                    else if (action === 'confirmEmailModal')
                    {
                        pub.updateEmail();
                    }
                    else if (action === 'requiredEmail')
                    {
                        pub.saveEmail();
                    }
                    else if (action === 'forgotUserName')
                    {
                        pub.forgotUserName();
                    }
                    else if (action === 'signUpMoreDetails')
                    {
                        pub.signUpMoreDetails();
                    }
                }
                else
                {
                    //for custom email validation in forgot username
                    if (action === 'forgotUserName')
                    {
                        if (loginViewModel.domain.forgotUserName.userName())
                        {
                            loginViewModel.domain.forgotUserName.emailExists(true);
                        }
                    }
                    //for locked user validation in forgot username
                    if (action === 'loginWithPass')
                    {
                        loginViewModel.domain.signin.locked(false);
                    }
                    //for custom email validation in sign up form
                    if (action === 'signup' && helper.isUndefinedOrNullOrEmpty(e.currentTarget.value))
                    {
                        loginViewModel.domain.signup.emailExists(false);
                    }
                }
            }

        };

        pub.login = function (userName, token)
        {
            pub.toggleLoginControls(true);
            var usrNotFound = true;
            var signInType = loginViewModel.domain.signin.signInType();

            loginViewModel.domain.signin.userNotFound(false);
            loginViewModel.domain.socialSignInNotAvailable(false);

            listing.getUserByUserNameOrEmail(userName, function (result)
            {
                var isStayDisabled = false;
                var users = getUserByUserNameOrEmail(result);
                if (!users || users.length === 0)
                {
                    if (signInType === 'facebook' || signInType === 'google')
                    {
                        loginViewModel.domain.signin.userName('');
                        loginViewModel.userValidation.errors.showAllMessages(false);
                    }

                    loginViewModel.view.activeLoading('');
                    loginViewModel.domain.signin.userNotFound(usrNotFound);
                }
                else if (users.length > 1)
                {
                    loginViewModel.view.activeLoading('');
                    loginViewModel.domain.dupAccount.landlord(_.find(users, function (u) { return _.toLower(u.UserType) == _.toLower(loginViewModel.view.userType.landlord); }));
                    loginViewModel.domain.dupAccount.tenant(_.find(users, function (u) { return _.toLower(u.UserType) == _.toLower(loginViewModel.view.userType.tenant); }));
                    loginViewModel.domain.dupAccount.ha(_.find(users, function (u) { return _.toLower(u.UserType) == _.toLower(loginViewModel.view.userType.ha); }));
                    loginViewModel.view.activeModal(loginViewModel.view.modalState.duplicateUser);
                    loginViewModel.view.activeLoading('');
                    // Set duplicate userexist flag. Added timeout due to animate(CSS) view from right side
                    setTimeout(function ()
                    {
                        loginViewModel.domain.dupAccount.exist(true);
                    }, 100);
                }
                else
                {
                    var user = users[0];
                    if (user.Deactive || user.Scammer)
                    {
                        loginViewModel.domain.signin.scammerDeactive(true);
                        loginViewModel.view.activeLoading('');
                    } else
                    {
                        if (signInType === 'facebook' || signInType === 'google')
                        {
                            loginViewModel.view.activeModal('');
                        }
                        loginViewModel.domain.signin.userName(user.UserName);
                        loginViewModel.domain.signin.userType(user.UserType);
                        if (token)
                        {
                            if ((signInType === 'facebook' ||
                                signInType === 'google') && user.UserType === loginViewModel.view.userType.ha)
                            {
                                if (signInType === 'facebook')
                                    loginViewModel.domain.signin.userName(loginViewModel.domain.signin.facebook.email());
                                if (signInType === 'google')
                                    loginViewModel.domain.signin.userName(loginViewModel.domain.signin.google.email());

                                loginViewModel.domain.socialSignInNotAvailable(true);
                                loginViewModel.view.activeLoading('');
                            }
                            else
                            {
                                isStayDisabled = true;
                                listing.tokenLogin(token,
                                    signInType,
                                    function (result)
                                    {
                                        loginOnSuccess(result, false);
                                    },
                                    loginOnFailure);
                            }
                        } else
                        {
                            if (user.UserType === loginViewModel.view.userType.tenant)
                            {
                                isStayDisabled = true;
                                listing.login(loginViewModel.domain.signin.userName(),
                                    '',
                                    loginViewModel.domain.signin.userType(),
                                    function (result)
                                    {
                                        loginOnSuccess(result, true);
                                    },
                                    loginOnFailure);
                            } else
                            {
                                loginViewModel.view.activeLoading('');
                                loginViewModel.view.activeModal(loginViewModel.view.modalState.signInPassword);
                                $("#ah_pass").focus();
                            }
                        }
                    }
                }
                if (!isStayDisabled) pub.toggleLoginControls(false);
            }, loginOnFailure);
        }

        pub.logout = function ()
        {
            headerModel.domain.user(null);
            listing.logout(true, logOutOnSuccess, loginOnFailure);
        }

        pub.signUpEmail = function ()
        {
            loginViewModel.domain.signup.signupType('email');
            if (loginViewModel.signupValidation.errors().length === 0)
            {
                loginViewModel.view.activeLoading(loginViewModel.view.button.signUp);
                pub.signUpUser(loginViewModel.domain.signup.email());
            } else
            {
                loginViewModel.view.activeLoading('');
                loginViewModel.signupValidation.errors.showAllMessages();
            }
        }

        pub.signUpWithPassword = function ()
        {
            if (loginViewModel.signUpPasswordValidation.errors().length === 0)
            {
                loginViewModel.view.activeLoading(loginViewModel.view.button.setPassword);
                pub.signUp();
            } else
            {
                loginViewModel.view.activeLoading('');
                loginViewModel.signUpPasswordValidation.errors.showAllMessages();
            }
        }

        pub.socialEmailCheck = function (email)
        {
            listing.getUserByUserNameOrEmail(email, function (result)
            {
                var users = getUserByUserNameOrEmail(result);
                if (!users || users.length === 0)
                {
                    pub.signUpUser(email);
                }
                else if (users.length > 1)
                {
                    loginViewModel.view.activeLoading('');
                    loginViewModel.domain.signup.emailExists(true);
                }
                else
                {
                    var user = users[0];
                    var signupType = loginViewModel.domain.signup.signupType();
                    var haWithSocialAccount = ((signupType === 'facebook' ||
                        signupType === 'google') && user.UserType === loginViewModel.view.userType.ha);
                    if (user.Locked || user.Deactive || user.Scammer || haWithSocialAccount)
                    {
                        loginViewModel.view.activeLoading('');
                        loginViewModel.domain.signup.emailExists(true);
                    } else
                    {
                        listing.tokenLogin(loginViewModel.domain.signup.socialToken(),
                            signupType,
                            function (result)
                            {
                                if (result.user.UserType !== loginViewModel.domain.signup.userType())
                                {
                                    loginViewModel.view.activeLoading('');
                                    loginViewModel.domain.signup.emailExists(true);
                                } else
                                {
                                    loginOnSuccess(result, false);
                                }
                            },
                            loginOnFailure);
                    }
                }
            }, loginOnFailure);
        }

        pub.signUpUser = function (email)
        {
            var signupType = loginViewModel.domain.signup.signupType();
            listing.emailExists(email,
                function (result)
                {
                    if (!result.exists)
                    {
                        if (signupType === 'google' || signupType === 'facebook')
                        {
                            //show more details screen
                            loginViewModel.domain.signup.email(email);
                            loginViewModel.view.activeLoading('');
                            loginViewModel.view.activeModal(loginViewModel.view.modalState.socialMoreInfoSignUp);
                        }
                        else if (signupType === 'email' &&
                            (loginViewModel.domain.signup.userType() === loginViewModel.view.userType.landlord || loginViewModel.domain.params.passwordRequiredForTenant() === true))
                        {
                            pub.resetValidation();
                            loginViewModel.view.activeLoading('');
                            loginViewModel.view.activeModal(loginViewModel.view.modalState.signUpWithPassword);
                        }
                        else
                        {
                            pub.signUp(null);
                        }

                        if (typeof (tnResult) !== "undefined")
                        {
                            if (tnResult.showMobileSearch())
                            {
                                tnResult.showHideMobileFilter(false);
                            }
                        }
                    }
                    else
                    {
                        loginViewModel.view.activeLoading('');
                        loginViewModel.domain.signup.emailExists(true);
                    }
                });

        }

        pub.signUpMoreDetails = function ()
        {
            if (loginViewModel.socialSignupMoreDetailsValidation.errors().length === 0)
            {
                loginViewModel.view.activeLoading(loginViewModel.view.button.finishSocialSignUp);
                pub.signUp(loginViewModel.domain.signup.socialToken());
            } else
            {
                loginViewModel.view.activeLoading('');
                loginViewModel.socialSignupMoreDetailsValidation.errors.showAllMessages();
            }
        }

        pub.signUp = function (token)
        {
            var redirect = '';
            var pass = null;
            loginViewModel.domain.socialSignInNotAvailable(false);
            var phoneNo = loginViewModel.domain.signup.phone();
            if (!helper.isUndefinedOrNullOrEmpty(headerModel.domain.google.phone()))
                phoneNo = headerModel.domain.google.phone();
            else
            {
                headerModel.domain.google.phone.setError('This field is required.');
                headerModel.googleSignupMoreDetailsValidation.errors.showAllMessages();
                loader.showLoading(false);
            }

            if (!helper.isUndefinedOrNullOrEmpty(phoneNo))
            {
                phoneNo = phoneNo.replace(/[^\d]/g, '');
                listing.phoneExists(
                    phoneNo,
                    function (result) // Success
                    {
                        try
                        {
                            if (result)
                            {
                                loader.showLoading(false);
                                if (result.exists && result.exists == true)
                                {
                                    if (headerModel.domain.google.phone())
                                    {
                                        headerModel.domain.google.phone.setError('Phone number already exists.');
                                        headerModel.googleSignupMoreDetailsValidation.errors.showAllMessages();
                                    }
                                    else
                                        loginViewModel.domain.signup.phone.setError('Phone number already exists.');
                                     
                                    loginViewModel.view.activeLoading('');
                                    loader.showLoading(false);
                                }
                                else
                                {
                                    if (loginViewModel.domain.signup.userType() === loginViewModel.view.userType.landlord)
                                    {
                                        redirect = loginViewModel.domain.emailOwnerRedirect();
                                        pass = loginViewModel.domain.signup.password();
                                    }
                                    else if (loginViewModel.domain.signup.userType() === loginViewModel.view.userType.tenant && loginViewModel.domain.params.passwordRequiredForTenant() === true)
                                    {
                                        redirect = loginViewModel.domain.emailRenterRedirect();
                                        pass = loginViewModel.domain.signup.password();
                                    }
                                    else if (loginViewModel.domain.signup.userType() === loginViewModel.view.userType.tenant)
                                    {
                                        redirect = loginViewModel.domain.emailRenterRedirect();
                                        pass = null;
                                    }
                                    if (helper.isUndefinedOrNullOrEmpty(token))
                                    {
                                        listing.signup(pass,
                                            loginViewModel.domain.signup.firstName(),
                                            loginViewModel.domain.signup.lastName(),
                                            loginViewModel.domain.signup.email(),
                                            loginViewModel.domain.signup.phone(),
                                            loginViewModel.domain.signup.userType(),
                                            loginViewModel.domain.signup.company(),
                                            loginViewModel.domain.signup.selectedTitle(),
                                            redirect,
                                            function (result)
                                            {
                                                signupOnSuccess(result, true);
                                            },
                                            loginOnFailure);
                                    }
                                    else
                                    {
                                        var signUpPhone = loginViewModel.domain.signup.phone();
                                        if (helper.isUndefinedOrNullOrEmpty(signUpPhone))
                                            signUpPhone = headerModel.domain.google.phone();

                                        loader.showLoading(true);
                                        listing.signUpWithToken(token, loginViewModel.domain.signup.signupType(),
                                            loginViewModel.domain.signup.userType(),
                                            loginViewModel.domain.signup.lastName(),
                                            signUpPhone,
                                            loginViewModel.domain.signup.company(),
                                            loginViewModel.domain.signup.selectedTitle(),
                                            redirect,
                                            function (result)
                                            {
                                                loader.showLoading(false);
                                                signupOnSuccess(result, true);
                                            },
                                            loginOnFailure);
                                    }
                                }
                            }
                        } catch (ex)
                        {
                            loader.showLoading(false);
                            go8Error.handleException(ex);
                        }
                    },
                    function () //Failure
                    {
                        loader.showLoading(false);
                    });

            }
               
        }

        pub.showHidePass = function (e)
        {
            var targetElementTag = $(e.target)[0].tagName;
            if (targetElementTag && targetElementTag.toLowerCase() === "i")
            {
                $(e.target).toggleClass("fa-eye fa-eye-slash");
                $(e.target).parent().find('input').attr('type', function (index, attr)
                {
                    return attr == 'password' ? 'text' : 'password';
                });
            }
        }

        pub.selectUserType = function (userType)
        {
            headerModel.googleSignupMoreDetailsValidation.errors.showAllMessages(false);
            loginViewModel.domain.signup.userType(userType);
            headerModel.domain.google.signUpUserType(userType);

            pub.resetValidation();
        }

        function resetModal()
        {
            resetObservables(loginViewModel.domain.signin);
            resetObservables(loginViewModel.domain.signup, ['emailExists', 'showSignup']);
            resetObservables(loginViewModel.domain.confirmEmail);
            resetObservables(loginViewModel.domain.dupAccount);
            resetObservables(loginViewModel.domain.forgotUserName, ['emailExists']);
            resetObservables(loginViewModel.domain.emailRequired);
            resetObservables(loginViewModel.domain.forgotPass);
            if ($("#loginForm")[0])
                $("#loginForm")[0].reset();
        }

        function resetObservables(model, ignoreList)
        {
            if (!ignoreList) ignoreList = [];
            for (var key in model)
            {
                if (model.hasOwnProperty(key) && ko.isObservable(model[key]) && ignoreList.indexOf(key) === -1)
                {
                    model[key](null);
                }
            }
        }
        pub.resetValidation = function ()
        {
            loginViewModel.userValidation.errors.showAllMessages(false);
            loginViewModel.passwordValidation.errors.showAllMessages(false);
            loginViewModel.forgotUsernameEmailValidation.errors.showAllMessages(false);
            //loginViewModel.updateEmailValidation.errors.showAllMessages(false);
            //loginViewModel.emailRequiredValidation.errors.showAllMessages(false);
            loginViewModel.domain.signin.userNotFound(false);
            loginViewModel.domain.socialSignInNotAvailable(false);
            loginViewModel.domain.forgotUserName.emailExists(true);
            loginViewModel.domain.signup.emailExists(false);
            loginViewModel.signupValidation.errors.showAllMessages(false);
            loginViewModel.signUpPasswordValidation.errors.showAllMessages(false);
            loginViewModel.socialSignupValidation.errors.showAllMessages(false);
            loginViewModel.socialSignupMoreDetailsValidation.errors.showAllMessages(false);
            // reset validation for custom messages in sign up is yet to be done
        }

        function getUserByUserNameOrEmail(result)
        {

            if (result.users && result.users.length > 0)
            {
                if (result.users.length > 1)
                {
                    //more than one user found with same user name; so remove any scammers and deactive accounts to see if they still have dup username
                    _.remove(result.users, function (user)
                    {
                        return user.Deactive || user.Scammer;
                    });
                }
                return result.users;
            }
        }

        function loginOnSuccess(result, askPassword)
        {            
            //callback function overwrites redirects. ex: if there is callback function specified then user wont get redirected instead call back function will be called
            
            headerModel.view.landlord.isAjaxSuccess(true);

            if (result.user.UserType === loginViewModel.view.userType.tenant && askPassword && result.user.HasPassword) {
                pub.toggleLoginControls(false);
                loginViewModel.view.activeLoading('');
                loginViewModel.view.activeModal(loginViewModel.view.modalState.signInPassword);
                $("#ah_pass").focus();
                return;
            }

            $("#dashboardpage, .afterajaxsuccess").css('display', 'block');
            if (result.user.PassedAuthentication)
            {
                applyRedirectRules(askPassword, result, "SignIn");
                resetHamburgerCSS();
            } else
            {
                loginViewModel.view.activeLoading('');

                if (result.user.Locked || result.user.Deactive || result.user.Scammer)
                {
                    if (result.user.Deactive || result.user.Scammer)
                        loginViewModel.domain.signin.scammerDeactive(true);
                    else if (result.user.Locked)
                        loginViewModel.domain.signin.locked(true);
                }
                else
                {
                    loginViewModel.domain.signin.password.setError('Invalid username or password. Please try a different combination or click \'Forgot Password\'');
                }
                loginViewModel.passwordValidation.errors.showAllMessages();
            }

            SaveFavouritesAfterLoginSignupSuccess("signIn");
            headerTopNav.getTenantFavoritesCount();

            if (result.user.UserType === loginViewModel.view.userType.tenant)
                listing.getWaitlistAlertsForUser(setWlAlertBellNotificationsSuccess, setWlAlertBellNotificationsFailure);

            if (typeof (tnResult) !== "undefined")
                tnResult.getTenantSearches();

            if (typeof (tnResult) !== "undefined")
            {
                var affordableModel = JSON.parse($.cookie(visitorAffordabilityFilter));
                if (affordableModel != null)
                {
                    tnResult.storeAffordabilitySearch();
                }
                else
                {
                    tnResult.GetUserAffordabilityfilter();
                }
                sessionStorage.setItem("ShouldShowHousingAssistance", "Yes");
                window.location.reload();
            }
            pub.toggleLoginControls(false);
        }

        function setWlAlertBellNotificationsSuccess(result) {
            if (!helper.isUndefinedOrNullOrEmpty(result.bellNotificationWaitlistAlerts)) {
                const sortedAlerts = _.orderBy(result.bellNotificationWaitlistAlerts, ['waitlistAlertLogId'], ['desc']);
                headerModel.domain.bellNotificationsWlAlerts(sortedAlerts);
            }
            else {
                headerModel.domain.bellNotificationsWlAlerts(result.bellNotificationWaitlistAlerts);
            }
            localStorage.setItem("bellNotificationWaitlistAlerts", JSON.stringify(result.bellNotificationWaitlistAlerts));
        }

        function setWlAlertBellNotificationsFailure(xhr, status, error) {
        }

        function SaveFavouritesAfterLoginSignupSuccess(source)
        {
            try
            {
                if (headerModel.domain.user())
                {
                    if (headerModel.domain.faviconCommunityId() != 0 && headerModel.domain.faviconCommunityId() > 0 && headerModel.domain.user().UserType() == "Tenant")
                    {
                        isNeedToCallHousingAssistant = false;
                        loading('show');
                        listing.saveFavourites(parseInt(headerModel.domain.faviconCommunityId()), headerModel.domain.user().UserId(), false, function (result)
                        {
                            favouriteSavedSuccess(result);
                        }, favouriteSavedFailure, 'loginControl.SaveFavouritesAfterLoginSignupSuccess');
                    }
                    if (headerModel.domain.favLandLordUserId() != 0 && headerModel.domain.favLandLordUserId() > 0 && headerModel.domain.user().UserType() == "Tenant")
                    {
                        isNeedToCallHousingAssistant = false;
                        loading('show');
                        listing.saveLandlordFavourite(propertyDetailsModel.domain.IsFavoriteLandlord(), headerModel.domain.favLandLordUserId(), saveLanloardFavouriteOnSuccess, saveLanloardFavouritOnFailure, "loginControl.SaveFavouritesAfterLoginSignupSuccess");
                        sessionStorage.setItem("ShouldShowHousingAssistanceForOnwerFavorites", "Yes");
                    }
                    if (typeof (propertyDetails) !== "undefined" && typeof (propertyDetailsModel) !== "undefined" && headerModel.domain.user().UserType() == "Tenant")
                    {
                        listing.getTenantsFavorites(propertyDetailsModel.domain.communityId(), propertyDetailsModel.domain.landlordUserId(), getTenantsFavoritesOnSuccess, getTenantsFavoritesOnFailure);
                        if (isNeedToCallHousingAssistant) {
                            sessionStorage.setItem("ShouldShowHousingAssistance", "Yes");
                        }
                        window.location.reload();
                    }
                    if (headerModel.domain.saveSearchAfterLogin() == true && headerModel.domain.user().UserType() == "Tenant")
                    {
                        //loading('show');                        
                        // listing.saveSearchFilters(0,tnResult.createSearchJsonPublic(), false, saveSearchFilerOnSuccess, saveSearchFilerOnFailure);                        
                        headerModel.domain.saveSearchAfterLogin(false);
                        if (typeof (tnResult) !== "undefined")
                        {
                            if (currentPage === "propertyListing")
                            {
                                tnResult.redirectUserToKoAfterLogin();
                            }
                            else
                            {
                                searchName.onOpenSearchName();
                            }
                        }
                    }
                    if (headerModel.view.isQuickMatch2On() && headerModel.domain.user().UserType() == "Tenant" && isNeedToCallHousingAssistant && source === "signIn") {
                        housingAssistant.initiateHousingAssistant(housingAssistantModal.view.sourceFunctionality.signIn);
                    }
                }
            }
            catch (ex)
            {
                go8Error.handleException(ex);
            }
        }

        function getTenatnsAllSearchesOnSuccess(result)
        {
            try
            {
                sessionStorage.setItem("favouritesearches", ko.toJSON(result));
                if (typeof (tnResult) !== "undefined")
                {
                    //tnResult.MatchAlreadySelectedValues();                 
                    tnResult.redirectUserToKoAfterLogin();
                }
            }
            catch (ex)
            {
                go8Error.handleException(ex);
            }
        }

        function getTenantFavoritesOnSuccess(result)
        {
            try
            {
                tnResult.IconChangesForFavoriteOnceLogin(result.tenantRentals);
            }
            catch (ex)
            {
                go8Error.handleException(ex);
            }
        }
        function getTenantFavoritesOnFailure()
        {
            try
            {
                tnResult.IconChangesForFavoriteOnceLogin(result.tenantRentals);
            }
            catch (ex)
            {
                go8Error.handleException(ex);
            }
        }

        function getTenatnsAllSearchesOnFailure(result)
        {
            try
            {

            }
            catch (ex)
            {
                go8Error.handleException(ex);
            }
        }

        function saveSearchFilerOnSuccess(result)
        {
            try
            {
                loading('hide');
                headerModel.domain.saveSearchAfterLogin(false);
                if (typeof (tnResult) != "undefined")
                {
                    tnResultModel.savedSearch(result.SaveSearch);
                    headerTopNav.getTenantFavoritesCount();

                    //tnResult.redirectUserToKoAfterLogin();
                    if (headerModel.domain.user().UserType() == "Tenant")
                    {

                        listing.getTenatnsAllSearches(getTenatnsAllSearchesOnSuccess, getTenatnsAllSearchesOnFailure);
                        if (typeof (tnResult) !== "undefined")
                        {
                            listing.getTenantFavorites(getTenantFavoritesOnSuccess, getTenantFavoritesOnFailure);
                        }
                    }
                }
            }
            catch (ex)
            {
                go8Error.handleException(ex);
            }
        }

        function saveSearchFilerOnFailure(xhr, status, error)
        {
            try
            {
                loading('hide');
                headerModel.domain.saveSearchAfterLogin(false);
                if (typeof (tnResult) !== "undefined")
                {
                    if (PageCurrentURL.indexOf("propertylisting.aspx") > -1)
                    {
                        tnResult.redirectUserToKoAfterLogin();
                    }
                    else
                    {
                        searchName.onOpenSearchName();
                    }
                }
            }
            catch (ex)
            {
                go8Error.handleException(ex);
            }
        }

        function getTenantsFavoritesOnSuccess(result)
        {
            try
            {
                propertyDetailsModel.domain.IsFavoriteLandlord(result.IsTenantsFavoriteLandlord);
                propertyDetailsModel.domain.IsTenantsFavorite(result.IsTenantsFavorite);
            }
            catch (ex)
            {
                go8Error.handleException(ex);
            }
        }

        function getTenantsFavoritesOnFailure(xhr, status, error)
        {
            try
            {
                user.handleOperationException(xhr, status, error);
            }
            catch (ex)
            {
                go8Error.handleException(ex);
            }
        }

        function initiatedCallBack()
        {
            if (!helper.isUndefinedOrNullOrEmpty(loginViewModel.domain.params.onSuccess))
            {
                loginViewModel.domain.params.onSuccess();
                return true;
            }
            return false;
        }

        function loginOnFailure(xhr, status, error)
        {
            try
            {
                pub.toggleLoginControls(false);
                loader.showLoading(false);
                loginViewModel.view.activeLoading('');
                loginViewModel.view.activeModal(loginViewModel.view.modalState.error);
                user.handleOperationException(xhr, status, error);
            }
            catch (ex)
            {
                go8Error.handleException(ex);
            }
        }

        function signupOnSuccess(result)
        {
            BackToTop();
            headerModel.domain.google.signUpShowMore(false);
            loader.showLoading(false);
            if (result.user.PassedAuthentication)
            {
                applyRedirectRules(false, result, "SignUp");
                closeMobileMenu(); // To close hamburger mobile menu after sign up completes.

            } else
            {
                loginViewModel.view.activeLoading('');
                if (result.user.Locked || result.user.Deactive || result.user.Scammer)
                {
                    loginViewModel.view.activeModal(loginViewModel.view.modalState.signUpScammer);
                }
            }

            SaveFavouritesAfterLoginSignupSuccess("SignUp");
            headerTopNav.getTenantFavoritesCount();

            if (typeof (tnResult) !== "undefined")
            {
                var affordableModel = JSON.parse($.cookie(visitorAffordabilityFilter));
                if (affordableModel != null)
                {
                    tnResult.storeAffordabilitySearch();
                }
                else
                {
                    tnResult.GetUserAffordabilityfilter();
                }
            }
        }

        function saveLanloardFavouriteOnSuccess(result)
        {
            try
            {
                headerModel.domain.favLandLordUserId(0);
                propertyDetailsModel.domain.IsFavoriteLandlord(result.IsTenantsFavoriteLandlord);
                loading('hide');
            }
            catch (ex)
            {

            }
        }

        function saveLanloardFavouritOnFailure(xhr, status, error)
        {
            try
            {
                headerModel.domain.favLandLordUserId(0);
                loading('hide');
            }
            catch (ex)
            {
                go8Error.handleException(ex);
            }
        }

        function favouriteSavedSuccess(result)
        {
            try
            {
                if (typeof (index) !== "undefined")
                {
                    for (var i = 0; i < indexModel.domain.rentalPanelList().length; i++)
                    {
                        var communityId = indexModel.domain.rentalPanelList()[i].CommunityId();
                        if (communityId == result.CommunityId)
                        {
                            indexModel.domain.rentalPanelList()[i].IsTenantFavourite(result.IsTenantFavorite);
                        }
                    }
                }
                if (typeof (tnResult) !== "undefined")
                {
                    for (var i = 0; i < tnResultModel.domain.propertyList().length; i++)
                    {
                        var communityId = tnResultModel.domain.propertyList()[i].CommunityId();
                        if (communityId == result.CommunityId)
                        {
                            tnResultModel.domain.propertyList()[i].IsTenantFavourite(result.IsTenantFavorite);
                        }
                    }
                    if (result.IsTenantFavorite === true)
                    {
                        $('#FavoritesHeart_' + result.CommunityId).addClass('selected');
                    }
                    else
                    {
                        $('#FavoritesHeart_' + result.CommunityId).removeClass('selected');
                    }
                    tnResult.redirectUserToKoAfterLogin();
                }
                if (typeof (propertyDetails) !== "undefined")
                {
                    var communityId = propertyDetailsModel.domain.communityId();
                    if (communityId == result.CommunityId)
                    {
                        propertyDetailsModel.domain.IsTenantsFavorite(result.IsTenantFavorite);
                    }
                }
                
                if (headerModel.view.isQuickMatch2On() && result.IsTenantFavorite && typeof (propertyDetails) == "undefined")
                    housingAssistant.initiateHousingAssistant(housingAssistantModal.view.sourceFunctionality.propertyFavorite);

                
                if (headerModel.view.isQuickMatch2On() && result.IsTenantFavorite && typeof (propertyDetails) != "undefined" && helper.isUndefinedOrNullOrEmpty(sessionStorage.getItem('initiateHousingAssistantPending')))
                    sessionStorage.setItem("initiateHousingAssistantPending", "true");

                headerModel.domain.faviconCommunityId(0);
                headerModel.domain.favLandLordUserId(0);
                headerModel.domain.tenant.favoriteCount(result.TotalFavoritesCount);
                loading('hide');

                if (!headerModel.view.isQuickMatch2On() && (typeof (haResults) !== "undefined" || typeof (index) !== "undefined"))
                {
                    window.location.reload();
                }
            }
            catch (ex)
            {
                go8Error.handleException(ex);
            }
        }
        function favouriteSavedFailure(xhr, status, error)
        {
            try
            {
                headerModel.domain.faviconCommunityId(0);
                headerModel.domain.favLandLordUserId(0);
                user.handleOperationException(xhr, status, error);
                loading('hide');
            }
            catch (ex)
            {
                go8Error.handleException(ex);
            }
        }

        function applyRedirectRules(askPassword, result,source)
        {
            //callback function overwrites redirects. ex: if there is callback function specified then user wont get redirected instead call back function will be called
            if (result.user.PassedAuthentication)
            {
                headerTopNav.loadUserState();
                if (result.user.UserType === loginViewModel.view.userType.landlord)
                {
                    if (!$('body').hasClass("owner-body"))
                        $('body').addClass("owner-body");

                    if (!initiatedCallBack())
                    {
                        if (helper.isUndefinedOrNullOrEmpty(loginViewModel.domain.params.ownerRedirectUrl()))
                        {
                            window.location = "/LL/dashboard.aspx";
                            return;
                        } else
                        {
                            if (loginViewModel.domain.params.ownerRedirectUrl().includes('listingWizard.aspx'))
                            {
                                // if user is redirected after signing up on lyp page to check if listing exists redirect them to manage listing page
                                listing.getLandlordListings(null, null, null, null, null, function (result)
                                {
                                    if (result.Listings.length > 0)
                                        loginViewModel.domain.params.ownerRedirectUrl(headerModel.view.ahSignInRedirects.manageListings);

                                    window.location = loginViewModel.domain.params.ownerRedirectUrl();

                                }, loginOnFailure);

                            }
                            else
                            {
                                if (result.user != null && loginViewModel.domain.params.ownerRedirectUrl() != null && loginViewModel.domain.params.ownerRedirectUrl().indexOf(headerModel.view.ahSignInRedirects.checkoutPage)>=0 && result.user.IsFree == false && result.user.MembershipType == 'PM') {
                                    loginViewModel.domain.params.ownerRedirectUrl(headerModel.view.ahSignInRedirects.planDetailsPage + window.location.search)
                                }
                                window.location.href = loginViewModel.domain.params.ownerRedirectUrl();
                            }

                            return;
                        }
                    }
                }
                else if (result.user.UserType === loginViewModel.view.userType.ha)
                {
                   
                    if (!initiatedCallBack() &&
                        !helper.isUndefinedOrNullOrEmpty(loginViewModel.domain.params.renterRedirectUrl())) {
                        var haPaths = [
                            "/v4/pages/ha/ha.aspx/leases",
                            "/v4/pages/ha/ha.aspx/program-packages",
                            "/v4/pages/ha/ha.aspx/documents",                          
                            "/ha/FrontControllerHandler.aspx"
                        ];
                        try {
                            var redirectUrL = loginViewModel.domain.params.renterRedirectUrl();
                            if (haPaths.find(function (x) { return redirectUrL == x; })) {
                                window.location = loginViewModel.domain.params.renterRedirectUrl();
                                return;
                            }
                        } catch (ex){
                            // supress
                        }
                    }
                    if (!initiatedCallBack())
                    {
                        listing.redirectToLDashboard(function (result)
                        {
                            if (!result.redirect)
                            {
                                window.location.href = result.url;
                                return;
                            }
                        });
                    }
                }
                else if (result.user.UserType === loginViewModel.view.userType.tenant)
                {
                    var isMandatoryToRedirectToQueryUrl = false;
                    var mandatoryRedirectPaths = [
                        "/v4/pages/signRequest/signRequest.aspx",
                    ];
                    if (!helper.isUndefinedOrNullOrEmpty(loginViewModel.domain.params.renterRedirectUrl())) {
                        var redirectUrL = loginViewModel.domain.params.renterRedirectUrl();
                        if (mandatoryRedirectPaths.find(function (x) { return redirectUrL == x; })) {
                            isMandatoryToRedirectToQueryUrl = true;
                        }
                    }

                    if (askPassword && result.user.HasPassword)
                    {
                        initiatedCallBack();
                        loginViewModel.view.activeLoading('');
                        loginViewModel.view.activeModal(loginViewModel.view.modalState.signInPassword);
                        $("#ah_pass").focus();
                        return;
                    }

                    //redirect to specific url if page requests
                    if (!initiatedCallBack() &&
                        !helper.isUndefinedOrNullOrEmpty(loginViewModel.domain.params.renterRedirectUrl())) {
                        isNeedToCallHousingAssistant = false;
                        if (headerModel.view.isQuickMatch2On() && source === "SignIn") {
                            sessionStorage.setItem("ShouldShowHousingAssistance", "Yes");
                        }
                        window.location = loginViewModel.domain.params.renterRedirectUrl();
                        return;
                    }

                    // redirect to my wl apps page if user has form and signed in with password and page is ok redirecting
                    if (result.user.SecureSignIn &&
                        result.user.HasWaitlistForm &&
                        loginViewModel.domain.params.shouldRedirectSecureRenter() &&
                        !initiatedCallBack() &&
                        !isMandatoryToRedirectToQueryUrl)
                    {
                        loginViewModel.view.activeAction('');
                        isNeedToCallHousingAssistant = false;
                        if (headerModel.view.isQuickMatch2On() && source === "SignIn") {
                            sessionStorage.setItem("ShouldShowHousingAssistance", "Yes");
                        }
                        window.location = headerModel.view.ahSignInRedirects.myApplications;
                        return;
                    }
                    
                    if (headerModel.domain.isHomePage() === true &&
                        headerModel.view.topNavSignInClicked() === true &&
                        result.user.SecureSignIn &&
                        result.user.HasRevolistForm &&
                        loginViewModel.domain.params.shouldRedirectSecureRenter() &&
                        !initiatedCallBack() &&
                        !isMandatoryToRedirectToQueryUrl)
                    {
                        loginViewModel.view.activeAction('');
                        headerModel.view.topNavSignInClicked(false);
                        isNeedToCallHousingAssistant = false;
                        if (headerModel.view.isQuickMatch2On() && source === "SignIn") {
                            sessionStorage.setItem("ShouldShowHousingAssistance", "Yes");
                        }
                        window.location = headerModel.view.ahSignInRedirects.myApplications;
                        return;
                    }

                    //stay on same page, if page doesnt have any specific url redirect or signed with password and page is not ok redirecting
                    if ((result.user.SecureSignIn && !loginViewModel.domain.params.shouldRedirectSecureRenter()) ||
                        helper.isUndefinedOrNullOrEmpty(loginViewModel.domain.params.renterRedirectUrl()))
                    {
                        closeActiveElements();
                        initiatedCallBack();
                        return;
                    }
                  
                }
            }

        }

        function closeActiveElements()
        {
            loginViewModel.view.activeLoading('');
            loginViewModel.view.activeAction('');
            loginViewModel.view.activeModal('');
            headerModel.domain.google.signUpShowMore(false);
           
            if (typeof (tnResult) !== "undefined" && helper.isMobileAndTablet) {             
                tnResult.showHideMobileFilter(false);
                tnResultModel.isLoginCancelled(true);
                tnResult.onClickViewPropertiesSaveSearch();
            }
        }

        function closeMobileMenu()
        {
            if ($('body').hasClass('menu--open'))
                $('body').removeClass('menu--open');
        }

        function loadContainerCSS()
        {
            if (loginViewModel.view.activeModal() === loginViewModel.view.modalState.signUp)
                $('.reset--pwd--blk').addClass('signup--container');
            else
                $('.reset--pwd--blk').removeClass('signup--container');

        }

        function resetHamburgerCSS()
        {
            setTimeout(function ()
            {
                // hamburger menu height set for mobile //
                if (helper.isMobile())
                {
                    $("#menu_popup .mbl--mid--cont").height(($(window).height() - $(".ah--modal--main .modal--hdr--bar").outerHeight()) - 10);
                }
            }, 1000);
        }

        pub.toggleLoginControls = function (state) {
            var signinControl = document.getElementById('signin-button');
            if (!!signinControl) signinControl.disabled = state
            var signinWithPasswordcontrol = document.getElementById('signin-with-password-button');
            if (!!signinWithPasswordcontrol) signinWithPasswordcontrol.disabled = state;
        }

        function loadHashUrl()
    {
        history.pushState("", document.title, window.location.pathname + window.location.search);

        window.onpopstate = function (e)
        {
            var hashLocation = location.hash;
            var hashSplit = hashLocation.split("#");
            var hashName = hashSplit[1];
            if (hashName !== '')
            {
                var hash = window.location.hash;
                if (hash === '')
                {
                    if (headerModel.domain.user())
                        pub.switchUser();

                    loginViewModel.view.activeAction('signin');
                    loginViewModel.view.activeModal(loginViewModel.view.modalState.signIn);
                }
                else if (hashName === 'sign-in')
                {
                    loginViewModel.view.activeAction('signin');
                    loginViewModel.view.activeModal(loginViewModel.view.modalState.signIn);
                }
                else if (hashName === 'sign-up')
                {
                    loginViewModel.view.activeAction('signup');
                    loginViewModel.view.activeModal(loginViewModel.view.modalState.signUp);
                }
                else if (hashName === 'forgot-username')
                {
                    loginViewModel.view.activeAction('signin');
                    loginViewModel.view.activeModal(loginViewModel.view.modalState.forgotUserName);
                }
            }

        }
    }

    function logOutOnSuccess()
    {
        headerTopNav.loadUserState();
        localStorage.removeItem("favouritesearches");
        sessionStorage.removeItem("landlordlistingpagefilters");
        localStorage.removeItem("BannersList");
        localStorage.removeItem("bellNotificationWaitlistAlerts");
        headerModel.domain.bellNotificationsWlAlerts([]);
        sessionStorage.removeItem("isTrustedOwnerToastMessageClosed");
    }
    /**
     * Scrolls to top of the page
     */
    function BackToTop(elem)
    {
        if (elem && $(elem))
        {
            $("html, body").animate({ scrollTop: $(elem).offset().top - 35 }, 0);
        }
        else
        {
            $("html, body").animate({
                scrollTop: 0
            }, 0);
        }
    }

    pub.secureRenterSignInShowPassword = function (shouldRedirect, callBack)
    {
        var isReadySubscription = pub.isReady.subscribe(function (isReady) {
            if (!isReady) {
                return;
            }

            if (!helper.isUndefinedOrNullOrEmpty(shouldRedirect))
                loginViewModel.domain.params.shouldRedirectSecureRenter(shouldRedirect);

            loginViewModel.domain.params.onSuccess = callBack;
            loginViewModel.domain.signin.userName(headerModel.domain.user().UserName());
            loginViewModel.domain.signin.userType(headerModel.domain.user().UserType());
            loginViewModel.view.activeAction('signin');
            loginViewModel.view.activeModal(loginViewModel.view.modalState.signInPassword);
            if (headerModel.domain.options.signinControlType() === 'page')
            {
                setTimeout(function ()
                {
                    googleSignIn.onPageLoad(loginViewModel);
                }, 100);
            }
            else
                googleSignIn.onPageLoad(loginViewModel);

            faceBookSignIn.onPageLoad(loginViewModel);
            loadContainerCSS();
            $("#ah_pass").focus();

            isReadySubscription.dispose();
        });
    }

    //loginViewModel.view.activeModal.subscribe(function (value)
    //{
    //    if (value && headerModel.domain.options.signinControlType() === 'page')
    //    {
    //        if (value == loginViewModel.view.modalState.signIn && !helper.isUndefinedOrNullOrEmpty(window.location.hash))
    //        {
    //            if (!helper.isUndefinedOrNullOrEmpty(window.location.hash))
    //                window.history.pushState(null, null, "#sign-in");
    //        }
    //        else if (value == loginViewModel.view.modalState.signUp)
    //        {
    //            window.history.pushState(null, null, "#sign-up");
    //        }
    //        else if (value == loginViewModel.view.modalState.forgotUserName)
    //        {
    //            window.history.pushState(null, null, "#forgot-username");
    //        }
    //    }                
    //});

    //pub.checkValidEmail = function (email)
    //{
    //    if (!email) return false;
    //    var pattern = /^\b[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b$/i;
    //    return pattern.test(email);
    //}

        pub.showPwdModalOnAlerts = function() {
            loginViewModel.domain.signin.userName(headerModel.domain.user().UserName());
            loginViewModel.domain.signin.userType(headerModel.domain.user().UserType());
            loginViewModel.view.activeAction('signin');
            loginViewModel.view.activeModal(loginViewModel.view.modalState.signInPassword);
            if (headerModel.domain.options.signinControlType() === 'page')
            {
                setTimeout(function ()
                {
                    googleSignIn.onPageLoad(loginViewModel);
                }, 100);
            }
            else
                googleSignIn.onPageLoad(loginViewModel);

            faceBookSignIn.onPageLoad(loginViewModel);
            loadContainerCSS();
            $("#ah_pass").focus();
        }

    return pub;
} catch (ex)
{
    go8Error.handleException(ex);
}
}());

var loginControlModel = function (params) {
    try {
        // Public functions and state.
        var pub = this;

        
        pub.domain =
            {
            params:
            {
                renterRedirectUrl: ko.observable(null),
                ownerRedirectUrl: ko.observable(null),
                emailRedirectUrl: ko.observable(null),
                shouldRedirectSecureRenter: ko.observable(true),
                signUpUserType: ko.observable(null),
                onSuccess: null,
                passwordRequiredForTenant: ko.observable(false),
                onActiveLoading: null,
                onActiveModal: null,
                preUserName: null
            },
            usersByUserName: ko.observableArray([]),
            scammerIp: ko.observable(false),
            signup:
            {
                userType: ko.observable("").extend({
                    required: {
                        message: 'This field is required. Let us know what type of user you are before continuing.'
                    }                  
                }),
                defaultUserType: ko.observable(""),
                firstName: ko.observable("").extend(
                    {
                        required: true,
                        signUpName: true,
                        maxLength: 50
                    }),
                lastName: ko.observable(""),
                email: ko.observable(""),
                phone: ko.observable("").extend(
                    {
                        required: true,
                        phoneUS: {
                            onlyIf: function ()
                            {
                                return !pub.domain.signup.phoneSelected();
                            }
                        },
                        validation:
                        {
                            async: true,
                            validator: isPhoneExists,
                            message: 'Phone number already exists.',
                            params: 'signUpPhone',
                            onlyIf: function ()
                            {
                                return !pub.domain.signup.phoneSelected() && !pub.domain.signup.socialToken();
                            }
                        }
                    }),
                company: ko.observable("").extend(
                    {
                        maxLength: 150
                    }),
                selectedTitle: ko.observable(""),
                emailExists: ko.observable(false),
                password: ko.observable("").extend(
                    {
                        required: true,
                        password: {
                            onlyIf: function ()
                            {
                                return !pub.domain.signup.passwordSelected();
                            }
                        }
                    }),
                verifyPassword: ko.observable(""),
                signupType: ko.observable(""),
                socialToken: ko.observable(""),
                socialMissingLastName: ko.observable(false),
                firstNameSelected: ko.observable(false),
                lastNameSelected: ko.observable(false),
                emailSelected: ko.observable(false),
                phoneSelected: ko.observable(false),
                passwordSelected: ko.observable(false),
                verifyPasswordSelected: ko.observable(false)
            },
            signin:
            {
                wizardType: ko.observable(""),
                userName: ko.observable(null).extend({ required: true, maxLength: 50 }),
                password: ko.observable("").extend({ maxLength: 50 }),
                userType: ko.observable(""),
                scammerDeactive: ko.observable(false),
                locked: ko.observable(false),
                signInType: ko.observable(""),
                userNotFound: ko.observable(false),
                buttonClicked: ko.observable(false),
                google:
                {
                    token: ko.observable(""),
                    email: ko.observable("")

                },
                facebook:
                {
                    token: ko.observable(""),
                    email: ko.observable("")
                }
            },
            socialSignInNotAvailable: ko.observable(false),
            //confirmEmail:
            //{
            //    newEmail: ko.observable("").extend({ required: true, maxLength: 50 }),
            //    emailExists: ko.observable(false),
            //    newEmailSent: ko.observable(false),
            //    showUpdateEmail: ko.observable(false),
            //    emailSentTo: ko.observable(""),
            //    emailTokenExpirationInHours: ko.observable(0)
            //},
            dupAccount:
            {
                landlord: ko.observable(),
                tenant: ko.observable(),
                ha: ko.observable(),
                exist: ko.observable(),
                error: ko.observable(false),
                success: ko.observable(false)
            },
            forgotUserName:
            {
                emailSelected: ko.observable(false),
                userName: ko.observable("").extend(
                    {
                        required: true,
                        email:
                        {
                            params: false,
                            message: 'Please enter a valid email address.',
                            onlyIf: function ()
                            {
                                return !pub.domain.forgotUserName.emailSelected();
                            }
                        },
                        maxLength: 50
                    }),
                emailSentTo: ko.observable(),
                emailExists: ko.observable(true),
                error: ko.observable(false),
                success: ko.observable(false)
            },
            //emailRequired:
            //{
            //    emailAddress: ko.observable(""),
            //    confirmEmailAddress: ko.observable(""),
            //    updateSuccess: ko.observable(false),
            //    emailExists: ko.observable(false)
            //},
            forgotPass:
            {
                emailSentTo: ko.observable(),
                emailTokenExpirationInHours: ko.observable(0)
            }
        };


        pub.operations =
        {
        };

        pub.view =
        {
            activeAction: ko.observable(''),
            activeModal: ko.observable(''),
            activeLoading: ko.observable(''),

            userType:
            {
                landlord: "Landlord",
                tenant: "Tenant",
                ha: "Ha"
            },
            button:
            {
                signIn: "signIn",
                signUp: "signUp",
                setPassword: "setPassword",
                forgotUserName: "forgotUserName",
                emailRequired: "emailRequired",
                resendConfirmEmail: "resendConfirmEmail",
                updateConfirmEmail: "updateConfirmEmail",
                facebookMissingEmail: "facebookMissingEmail",
                finishSocialSignUp: "finishSocialSignUp",
                googleSignIn: "googleSignIn",
                fbSignIn: "fbSignIn",
                tenant: "tenant",
                landlord: "landlord",
                ha: "ha",
                googleSignup: "googleSignup",
                fbSignup: "fbSignup",
                fbRelogin: "fbRelogin"

            },
            modalState: {
                signIn: 1,
                signInPassword: 2,
                signUp: 3,
                socialMoreInfoSignUp: 4,
                forgotUserName: 5,
                duplicateUser: 6,
                confirmEmail: 7,
                emailRequired: 8,
                facebookEmailRequired: 9,
                signUpWithPassword: 10,
                signUpScammer: 11,
                error: 12
            },
            ownerTitles: ko.observableArray([
                { name: 'Select Role', id: 0, code: '' },
                { name: 'Real Estate Agent/Broker', id: 1, code: 'agent' },
                { name: 'Property Owner/Landlord', id: 2, code: 'owner' },
                { name: 'Property Manager', id: 3, code: 'manager' },
                { name: 'Other Real Estate Industry Professional', id: 4, code: 'other' }
            ])
        };

        pub.domain.signin.password.extend({
            required: {
                onlyIf: function () {
                    return pub.view.activeModal() === pub.view.modalState.signInPassword && pub.domain.signin.buttonClicked() === true;
                }
            }
        });

        var mustEqual = function (val, other)
        {
            return val === other;
        }

        pub.domain.signup.email.extend({
            required: true,
            email:
            {
                params: false,
                message: 'Please enter a valid email address.',
                onlyIf: function ()
                {
                    return !pub.domain.signup.emailSelected();
                }
            },
            maxLength: 100
        });

        pub.domain.signup.verifyPassword.extend(
            {
                required: true,
                validation: {
                    validator: mustEqual,
                    message: 'Passwords do not match.',
                    params: pub.domain.signup.password,
                    onlyIf: function ()
                    {
                        return !pub.domain.signup.verifyPasswordSelected();
                    }
                }
            });
        pub.domain.signup.lastName.extend(
            {
                required: {
                    onlyIf: function ()
                    {
                        return (pub.domain.signup.socialMissingLastName() && pub.domain.signup.signupType() !== 'email') || pub.domain.signup.signupType() === 'email';
                    }
                },
                signUpName: true,
                maxLength: 50
            });
        pub.userValidation = ko.validatedObservable([
            pub.domain.signin.userName
        ]);

        pub.passwordValidation = ko.validatedObservable([
            pub.domain.signin.password
        ]);

        pub.signUpPasswordValidation = ko.validatedObservable([
            pub.domain.signup.password,
            pub.domain.signup.verifyPassword
        ]);

        pub.forgotUsernameEmailValidation = ko.validatedObservable([
            pub.domain.forgotUserName.userName
        ]);

        pub.signupValidation = ko.validatedObservable([
            pub.domain.signup.firstName,
            pub.domain.signup.lastName,
            pub.domain.signup.userType,
            pub.domain.signup.email,
            pub.domain.signup.phone
        ]);

        pub.socialSignupValidation = ko.validatedObservable([
            pub.domain.signup.userType
        ]);
        pub.socialSignupMoreDetailsValidation = ko.validatedObservable([
            pub.domain.signup.phone,
            pub.domain.signup.lastName
        ]);

        pub.domain.emailRenterRedirect = ko.computed(function () {
            var renterRedirect = pub.domain.params.emailRedirectUrl();

            if (helper.isUndefinedOrNullOrEmpty(renterRedirect))
                renterRedirect = pub.domain.params.renterRedirectUrl();
            if (helper.isUndefinedOrNullOrEmpty(renterRedirect))
                return window.location.pathname;
            else
                return renterRedirect;
        });

        pub.domain.emailOwnerRedirect = ko.computed(function () {
            var redirect = pub.domain.params.emailRedirectUrl();

            if (helper.isUndefinedOrNullOrEmpty(redirect))
                redirect = pub.domain.params.ownerRedirectUrl();

            if (helper.isUndefinedOrNullOrEmpty(redirect))
                return "/LL/dashboard.aspx";
            else
                return redirect;
        });

        pub.domain.signup.showSignup = ko.computed(function () {
            if (pub.domain.scammerIp() && pub.domain.signup.userType() === pub.view.userType.landlord)
                return false;
            else
                return true;
        });

        function isPhoneExists(val, params, callback)
        {
            if (val)
            {
                val = val.replace(/[^\d]/g, '');
                if (val.length == 10) {
                listing.phoneExists(
                    val,
                    function (result) // Success
                    {
                        try
                        {
                            if (result)
                            {
                                if (result.exists && result.exists == true)
                                {
                                    pub.domain.signup.phone.setError('Phone number already exists.');
                                }
                            }
                        } catch (ex)
                        {
                            go8Error.handleException(ex);
                        }
                    },
                    function () //Failure
                    {
                    });
                }
            }
        }
        loginControl.init(pub);

        if (params)
        {
            if (params.onLoadComplete)
            {
                params.onLoadComplete();
            }

            if (!helper.isUndefinedOrNullOrEmpty(params.onActiveLoading))
            {
                pub.domain.params.onActiveLoading = params.onActiveLoading;
            }
            if (!helper.isUndefinedOrNullOrEmpty(params.onActiveModal))
            {
                pub.domain.params.onActiveModal = params.onActiveModal;
            }
        }

        if (pub.domain.params.onActiveModal)
        {
            pub.view.activeModal.subscribe(function (value)
            {
                pub.domain.params.onActiveModal();
            });
        }


        pub.view.activeLoading.subscribe(function(value) {
            if (pub.domain.params.onActiveLoading) {
                pub.domain.params.onActiveLoading();
            }
            if (!helper.isUndefinedOrNullOrEmpty(value) && value !== false) {
                //loader.showLoading(true);
            } else {
                loader.showLoading(false);
            }
        });


        return pub;
    }
    catch (ex) {
        go8Error.handleException(ex);
    }
};

ko.components.register('AHLogin-Modal', {
    template: { element: 'loginModelHtml' },
    viewModel: loginControlModel
});



ko.components.register('AHLogin', {
    template: { element: 'loginPageHtml' },
    viewModel: loginControlModel
});



ko.components.register('SignIn', {
    template: { element: 'signInHtml' },
    viewModel: function (params) {
        return params.model;
    }
});


ko.components.register('SignUp', {
    template: { element: 'signupHtml' },
    viewModel: function (params) {
        return params.model;
    }
});



//$.ajax({
//    url: '/Header/loginControl/components/SignupPassword.aspx',
//    async: false,
//    success: function (templateString) {
//        ko.components.register('SignUpPass', {
//            template: templateString,
//            viewModel: function (params)
//            {
//                return params.model;
//            }
//        });
//    }
//});

var googleSignIn = (function ()
{
    try
    {

        var pub = {};
        var loginViewModel;
        var googleObj;

        pub.onPageLoad = function (vm) 
        {
            try 
            {
                loginViewModel = vm;
                googleInitScript();
            }
            catch (ex) 
            {
                go8Error.handleException(ex);
            }
        }
        function googleInitScript()
        {
            if (headerModel.view.IsNewGoogleLoginOn())
            {
                renderGoogleButton();
            }
            else
            {
                attachClickHandler();
            }
        }
        function renderGoogleButton()
        {

            google.accounts.id.initialize({
                client_id: gClientId,
                callback: handleResponse
            });

            google.accounts.id.renderButton(document.getElementById("googleSignInNew"), {
                size: "medium",
                theme: "filled_blue",
                use_fedcm_for_button: true,
                button_auto_select: false
            });
            google.accounts.id.renderButton(document.getElementById("googleSignInNew1"), {
                size: "medium",
                theme: "filled_blue",
                use_fedcm_for_button: true,
                button_auto_select: false
            });
            google.accounts.id.renderButton(document.getElementById("googleSignUpNew"), {
                size: "medium",
                theme: "filled_blue",
                text: "signup_with",
                use_fedcm_for_button: true,
                button_auto_select: false
            });
        }

        function attachClickHandler()
        {
            gapi.load('auth2', function ()
            {

                auth2 = gapi.auth2.init({
                    client_id: gClientId,
                    cookiepolicy: 'single_host_origin',
                    scope: 'profile'
                });
                auth2.attachClickHandler('googleSignIn', {},
                    function (googleUser)
                    {
                        googleSignIn(googleUser, false);
                    });

                auth2.attachClickHandler('googleSignIn1', {},
                    function (googleUser)
                    {
                        googleSignIn(googleUser, false);
                    });
                auth2.attachClickHandler('googleSignUp', {},
                    function (googleUser)
                    {
                        googleSignup(googleUser);
                    });
            });
        }
        pub.showGooglePopUp = function (vm)
        {
            if (!headerModel.domain.user())
            {
                loginViewModel = null;
                loginViewModel = vm;

                if (!headerModel.view.IsNewGoogleLoginOn())
                    google.accounts.id.prompt();
               
            }
        }

        function handleResponse(response)
        {
            try
            {
                if (!response || !response.credential)
                {
                    showModal('error-message-popup');
                    throw new Error("Invalid response: Missing credential.");
                }

                const base64Url = response.credential.split('.')[1];
                const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');
                const jsonPayload = decodeURIComponent(atob(base64).split('').map(function (c)
                {
                    return '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);
                }).join(''));

                googleObj = JSON.parse(jsonPayload);

                if (!googleObj || !googleObj.email)
                {
                    showModal('error-message-popup');
                    throw new Error("Invalid token: Missing email in payload.");
                }

                googleObj.credentials = response.credential;

                if (!headerModel.domain.user())
                {
                    listing.emailExists(googleObj.email,
                        function (result)
                        {
                            if (result.exists)
                            {
                                googleSignIn(googleObj, true);
                            }
                            else
                            {
                                if (helper.isUndefinedOrNullOrEmpty(googleObj.family_name))
                                    headerModel.domain.google.missingLastName(true);
                                else
                                {
                                    headerModel.domain.google.missingLastName(false);
                                    headerModel.domain.google.lastName(googleObj.family_name);
                                }
                                headerModel.domain.google.signUpShowMore(true);
                            }
                        });
                }
            } catch (ex)
            {
                go8Error.handleException(ex);
                loader.showLoading(false);
            }
            
        }

        function googleSignup(googleUser)
        {
            loginControl.resetValidation();
            loginViewModel.domain.signup.signupType('google');

            loginViewModel.view.activeLoading(loginViewModel.view.button.googleSignup);
            loginViewModel.domain.signup.socialToken(googleUser.getAuthResponse().id_token);
            var profile = googleUser.getBasicProfile();
            var email = profile.getEmail();
            var lastName = profile.getFamilyName();

            if (loginViewModel.socialSignupValidation.errors().length === 0 && email)
            {
                if (helper.isUndefinedOrNullOrEmpty(lastName))
                    loginViewModel.domain.signup.socialMissingLastName(true);
                loginControl.socialEmailCheck(email);
            } else
            {
                loginViewModel.domain.signup.signupType('email');
                loginViewModel.view.activeLoading('');
                loginViewModel.socialSignupValidation.errors.showAllMessages();
            }

        }
       
        function googleSignIn(googleUser, isNewSDK)
        {
            loginControl.resetValidation();
            loginViewModel.view.activeLoading(loginViewModel.view.button.googleSignIn);
            loginViewModel.domain.signin.signInType('google');

            if (isNewSDK)
            {
                loginViewModel.domain.signin.google.token(googleUser.credentials);
                loginViewModel.domain.signin.google.email(googleUser.email);
            }
            else
            {
                loginViewModel.domain.signin.google.token(googleUser.getAuthResponse().id_token);
                loginViewModel.domain.signin.google.email(googleUser.getBasicProfile().getEmail());
            }

            if (loginViewModel.domain.signin.google.email() &&
                loginViewModel.domain.signin.google.token())
            {
                loginControl.login(loginViewModel.domain.signin.google.email(), loginViewModel.domain.signin.google.token());
            }

        }

        pub.signUpMoreDetails = function ()
        {
            headerModel.domain.google.phone.clearError();
            headerModel.googleSignupMoreDetailsValidation.errors.showAllMessages(false);

            loader.showLoading(true);
            if (!googleObj && typeof (secureRenterControl) !== "undefined" && secureRenterControl.sendGoogleObj()) {
                if (!headerModel.domain.google.signUpUserType())
                    headerModel.domain.google.signUpUserType(headerModel.view.userType.Tenant)

                googleObj = secureRenterControl.sendGoogleObj();
            }
            var email = googleObj.email;

            if (headerModel.googleSignupMoreDetailsValidation.errors().length === 0 && email)
            {
                if (headerModel.domain.google.signUpUserType() === headerModel.view.userType.Tenant){
                    loginControl.selectUserType(headerModel.view.userType.Tenant)
                    $("input[value='Tenant']").prop("checked", true);
                }
                else if (headerModel.domain.google.signUpUserType() === headerModel.view.userType.Landlord){
                    loginControl.selectUserType(headerModel.view.userType.Landlord)
                    $("input[value='Landlord']").prop("checked", true);
                }
                else{
                    loginControl.selectUserType(headerModel.view.userType.Tenant)
                    $("input[value='Tenant']").prop("checked", true);
                }

                loginViewModel.domain.signup.userType(headerModel.domain.google.signUpUserType());
                loginViewModel.domain.signup.socialToken(googleObj.credentials);
                loginViewModel.domain.signup.signupType('google');
                loginViewModel.domain.signup.lastName(headerModel.domain.google.lastName());
                loginViewModel.domain.signup.company(headerModel.domain.google.company());
                loginViewModel.domain.signup.selectedTitle(headerModel.domain.google.selectedTitle());

                loginControl.signUp(loginViewModel.domain.signup.socialToken());
            } else
            {
                loader.showLoading(false);
                loginViewModel.domain.signup.signupType('email');
                loginViewModel.view.activeLoading('');
                headerModel.googleSignupMoreDetailsValidation.errors.showAllMessages();
            }
        }

        return pub;
    }
    catch (ex)
    {
        go8Error.handleException(ex);
    }
}());

var faceBookSignIn = (function ()
{
    try
    {

        var pub = {};

        var loginViewModel;
        pub.onPageLoad = function (vm) 
        {
            try 
            {
                loginViewModel = vm;
                loadFbInitScript();
            }
            catch (ex) 
            {
                go8Error.handleException(ex);
            }
        }

        /** FB initialization script **/
        function loadFbInitScript()
        {
            (function (d, s, id)
            {
                var js, fjs = d.getElementsByTagName(s)[0];
                if (d.getElementById(id)) return;
                js = d.createElement(s); js.id = id;
                js.src = "https://connect.facebook.net/en_US/sdk.js";
                fjs.parentNode.insertBefore(js, fjs);
            }(document, 'script', 'facebook-jssdk'));

            // initialize the facebook sdk
            window.fbAsyncInit = function ()
            {
                FB.init({
                    appId: fbAppId,
                    cookie: true,  // enable cookies to allow the server to access 
                    // the session
                    xfbml: true,  // parse social plugins on this page
                    version: 'v6.0' // The Graph API version to use for the call
                });
            }
        }

        pub.fbLogin = function (askPermission)
        {
            if (loginViewModel.view.activeAction() == 'signin' || loginViewModel.socialSignupValidation.errors().length === 0)
            {
                
                if (askPermission)
                {
                    loginViewModel.view.activeLoading(loginViewModel.view.button.fbRelogin);
                    FB.login(function (response)
                    {
                        fbResponse(response);
                    }, {
                        scope: 'public_profile,email',
                        auth_type: 'rerequest'
                    });

                } else
                {
                    loginViewModel.view.activeLoading(loginViewModel.view.button.fbSignIn);
                    FB.login(function (response)
                    {
                        fbResponse(response);
                    }, {
                        scope: 'public_profile,email'
                    });

                }
            }
            else
            {
                loginViewModel.view.activeLoading('');
                loginViewModel.socialSignupValidation.errors.showAllMessages();
            }          
        }
       

        function fbResponse(response) {
            if (response.status === 'connected') {
                loginControl.resetValidation();
                if (loginViewModel.view.activeAction() === 'signin')
                {
                    facebookSignIn(response);
                }
                else
                {
                    facebookSignup(response);
                }
            } else
            {
                loginViewModel.domain.signup.signupType('email');
                loginViewModel.view.activeLoading('');
            }
        }

        function facebookSignIn(response) {
            FB.api('/me', 'GET', { "fields": "id,first_name,last_name,email" }, function (meResponse) {
                loginViewModel.domain.signin.signInType('facebook');
                loginViewModel.domain.signin.facebook.token(response.authResponse.accessToken);
                loginViewModel.domain.signin.facebook.email(meResponse.email);

                if (loginViewModel.domain.signin.facebook.email()) {
                    loginControl.login(loginViewModel.domain.signin.facebook.email(),
                        loginViewModel.domain.signin.facebook.token());
                } else
                {
                    loginViewModel.view.activeLoading('');
                    loginViewModel.view.activeModal(loginViewModel.view.modalState.facebookEmailRequired);
                }
            });


           
        }
        function facebookSignup(response) {
            FB.api('/me', 'GET', { "fields": "id,first_name,last_name,email" }, function (meResponse) {
                loginViewModel.domain.signup.signupType('facebook');
                loginViewModel.domain.signup.socialToken(response.authResponse.accessToken);
                var email = meResponse.email;
                var lastName = meResponse.last_name;
                if (loginViewModel.socialSignupValidation.errors().length === 0 && email) {
                    if (helper.isUndefinedOrNullOrEmpty(lastName))
                        loginViewModel.domain.signup.socialMissingLastName(true);
                    loginControl.socialEmailCheck(email);
                } else {
                    loginViewModel.view.activeLoading('');
                    loginViewModel.view.activeModal(loginViewModel.view.modalState.facebookEmailRequired);
                }
            });
        }
     

       

        return pub;
    }
    catch (ex)
    {
        go8Error.handleException(ex);
    }
}());

/**
 * Script: sessionTimer.js
 *
 * @requires
 *     jquery
2 */

var sessionTimer = (function () {
        try {

            var pub = {
                showTime: ko.observable(false),
                fudgeFactorTime: 2,
                timeOutMinutes: 0,
                serverTimer: 0,
                clientTimer: 0,
                millisecondConversion: 60 * 1000,
                redirect: false,
                timeLeft: ko.observable(),
                callBackFuncBeforeSignOut: null,
                redirectToHomeOnLogout: ko.observable(false),
                redirectToHomeOnScammerLogout: ko.observable(false),
                timerId : null
        };

            pub.initilaizeSession = function () {
                $.cookie("sessionTimerCookie", null);
                if (headerModel.domain.user() &&
                    headerModel.domain.user().UserType() !== headerModel.view.userType.Ha) {
                    var sessionTimeOut = 45;
                    if (serverSessionTimeOut && serverSessionTimeOut > 0)
                        sessionTimeOut = serverSessionTimeOut;

                    pub.timeOutMinutes = (sessionTimeOut - pub.fudgeFactorTime) * pub.millisecondConversion;
                    reSetTimerVariables();
                    startCountDown();
                    wireFormEvents();
                } else {
                    clearInterval(pub.timerId);
                }
            }

            pub.renewSession = function () {
                reSetTimerVariables(); 
                $('#sessionWarningModal').fadeOut();
                $.cookie("sessionTimerCookie", null);
            }

            pub.clearSession = function() {
                try {
                    $.when(saveForm()).then(function(success) {
                        setTimeout(function () {
                                $('#sessionWarningModal').fadeOut();
                                headerTopNav.onClickLogout();
                            },
                            1000);
                    });
                } catch (ex) {
                    go8Error.handleException(ex);
                }
            }

            function reSetTimerVariables() {
                pub.serverTimer = pub.timeOutMinutes;
                pub.clientTimer = pub.timeOutMinutes;
                pub.redirect = false;
            }

            function resetServerTimer() {
                pub.serverTimer = pub.timeOutMinutes;
            }

            function resetClientTimer() {
                pub.clientTimer = pub.timeOutMinutes;
                $.cookie("sessionTimerCookie", null);
            }

            function startCountDown() {
                //call countDownTimers every sec
                pub.timerId =  setInterval(countDownTimers, 1000);
            }

            function countDownTimers() {
                try {
                    var timersCk = $.cookie("sessionTimerCookie");
                    var cookieVal = { clientTimer: pub.clientTimer};
                    var popupTimer = pub.fudgeFactorTime * pub.millisecondConversion;
                    var shownPopUp = false;
                    if (pub.clientTimer === 0) {
                        if (pub.redirect === false) {
                            //client session expired, so show the warning popup
                            $("#sessionWarningModal").fadeIn();
                            pub.redirect = true;
                            shownPopUp = true;
                        } else {
                            //user didn't renew their session, so redirect them to login page                        
                            pub.clearSession();
                        }
                    } else if (pub.serverTimer <= 0 && pub.clientTimer > 0) {
                        //server session about to expire in 2 min(fudge factor time) but client session is still active, so ping the server to renew the session
                        listing.pingServer();
                        resetServerTimer();
                    } 
                    if (timersCk != null) {
                        var timer = JSON.parse(timersCk);
                        if (timer.clientTimer > pub.clientTimer) {
                            pub.clientTimer = timer.clientTimer;
                            if (pub.clientTimer > popupTimer) {
                                pub.redirect = false;
                                $('#sessionWarningModal').fadeOut();
                            }
                            else if (pub.clientTimer <= popupTimer && !shownPopUp) {
                                $("#sessionWarningModal").fadeIn();
                                pub.redirect = true;
                            }
                        }
                    }
                    pub.serverTimer = pub.serverTimer > 0 ? pub.serverTimer - 1000 : -1;
                    pub.clientTimer =
                        pub.clientTimer > 0
                        ? pub.clientTimer - 1000
                        : popupTimer; //when client timer hits 0 then set it to 2 min(fudge factor time, still have 2min to renew server session) to keep the popup open without redirecting to login page                

                    cookieVal.clientTimer = pub.clientTimer;
                    $.cookie("sessionTimerCookie", JSON.stringify(cookieVal), { expires: new Date(new Date().getTime() + 15 * 60 * 1000), path: '/', secure: true });

                    var minutes = Math.floor((pub.clientTimer % (1000 * 60 * 60)) / (1000 * 60));
                    var seconds = Math.floor((pub.clientTimer % (1000 * 60)) / 1000);
                    pub.timeLeft(minutes + "m " + seconds + "s");
                } catch (ex) {
                    go8Error.handleException(ex);
                }
            }

            function wireFormEvents() {
                // all ajax calls complete
                $(document).ajaxComplete(function(event, xhr, settings) {
                    if (xhr != undefined && xhr.statusText === 'OK') {
                        resetServerTimer();
                    }
                });

                $(document).bind("mousemove keypress",
                    function() {
                        resetClientTimer();
                    });
            }

            function saveForm() {
                var dfd = jQuery.Deferred();
                if (headerModel.domain.options.sessionTimeOutCallBackFuncBeforeSignOut != null) {
                    $.when(headerModel.domain.options.sessionTimeOutCallBackFuncBeforeSignOut()).done(function() {
                        dfd.resolve(true);
                    });
                } else {
                    dfd.resolve(true);
                }
                return dfd.promise();
            };

            return pub;
        } catch (ex) {
            go8Error.handleException(ex);
        }
    }
    ());






ko.validation.rules.personName = { validator: function (e, a) { return !e || new RegExp("^[a-zA-Z- '’]+$").test(e) }, message: "Please enter only letters, hyphens, apostrophes and spaces as special characters." }, ko.validation.rules.signUpName = { validator: function (e, a) { return !e || new RegExp("^[a-zA-Z-'’.\\s]+$").test(e) }, message: "Please enter only letters, hyphens, period, apostrophes as special characters." }, ko.validation.rules.middleNameInitial = { validator: function (e, a) { return !e || new RegExp("^[a-zA-Z]+$").test(e) }, message: "Please enter only alphabetic letter." }, ko.validation.rules.addressUS = { validator: function (e, a) { return /^\d+\s(\d|[A-Za-z]|\s|\#|\,|\'|\-|\.|\’)+$/gi.test(e) }, message: "Please use only hash, periods, spaces, apostrophes and hyphens as special characters." }, ko.validation.rules.claimId = { validator: function (e, a) { return /^[A-Za-z0-9]+(?: +[A-Za-z0-9\-]+)*$/i.test(e) }, message: "Please use only - and space as special characters without leading and trailing spaces." }, ko.validation.rules.address1 = { validator: function (e, a) { if (e) { return /^[0-9a-zA-Z#-\s\'\’.]+$/gi.test(e) } return !0 }, message: "Please enter only letters, numbers and these special characters (dot, spaces, hash, apostrophes and hyphens)." }, ko.validation.rules.address2 = { validator: function (e, a) { if (e) { return /^[0-9a-zA-Z-\s\'\’]+$/gi.test(e) } return !0 }, message: "Please enter only letters, numbers and these special characters (spaces, apostrophes and hyphens)." }, ko.validation.rules.cityUS = { validator: function (e, a) { return new RegExp("^[a-zA-Z- .'’]+$").test(e) }, message: "Please use only hyphens, apostrophes, dot and spaces as special characters." }, ko.validation.rules.cityUSNonMandatory = { validator: function (e, a) { return null == e || null == e || "" == e || new RegExp("^[a-zA-Z- .'’]+$").test(e) }, message: "Please use only hyphens, apostrophes, dot and spaces as special characters." }, ko.validation.rules.zipUS = { validator: function (e, a) { return /^\d{5}$/.test(e) }, message: "Please enter a valid zip code." }, ko.validation.rules.zipUSNotMandatory = { validator: function (e, a) { if (null != e && null != e && "" != e) { return /^\d{5}$/.test(e) } return !0 }, message: "Please enter a valid zip code." }, ko.validation.rules.income = { validator: function (e, a) { if (a) { return /^(((\d){1,6}(\.(\d){1,2})*)|(1000000)|(1000000\.(0){1,2}))$/.test(e) } return !0 }, message: "Please enter a value between 0-1000000.00" }, ko.validation.rules.incomeNonMandatory = { validator: function (e, a) { if (e) { return /^(((\d){1,6}(\.(\d){1,2})*)|(1000000)|(1000000\.(0){1,2}))$/.test(e) } return !0 }, message: "Please enter a value between 0-1000000.00" }, ko.validation.rules.ssn = { validator: function (e, a) { return ko.validation.utils.isEmptyVal(e) || /^(?!(000|666|9))\d{3}(?!00)\d{2}(?!0000)\d{4}$/.test(e) }, message: "Please enter a valid Social Security number." }, ko.validation.rules.ssnformated = { validator: function (e, a) { return ko.validation.utils.isEmptyVal(e) || /^((?!666|000)[0-8][0-9\_]{2}\-(?!00)[0-9\_]{2}\-(?!0000)[0-9\_]{4})*$/.test(e) }, message: "Please enter a valid Social Security number." }, ko.validation.rules.disallowZeros = { validator: function (e, a) { return ko.validation.utils.isEmptyVal(e) || /^(?!0+$)[0-9]+$/.test(e) }, message: "Please enter a valid Bank Account Number." }, ko.validation.rules.disallowSamechar = { validator: function (e, a) { for (var t = e.substring(0, 1), i = 0, s = 0; s < e.length; s++)e[s] == t && i++; return i != e.length }, message: "Please enter a valid Policy Number." }, ko.validation.rules.ssnDummy = { validator: function (e, a) { return !e || (1 == a.hasFocus() || a.ssnDummy.isModified(!0), ko.validation.utils.isEmptyVal(e) || a.ssn.isValid()) }, message: "Please enter a valid Social Security number." }, ko.validation.rules.alienId = { validator: function (e, a) { if (e) { return /^\d{8,9}$/.test(e) } return !0 }, message: "Please enter a valid Alien ID." }, ko.validation.rules.alienIdDummy = { validator: function (e, a) { return !e || (1 == a.hasFocus() || a.alienIdDummy.isModified(!0), ko.validation.utils.isEmptyVal(e) || a.alienId.isValid()) }, message: "Please enter a valid Alien ID." }, ko.validation.rules.notNull = { validator: function (e, a) { return "null" !== e }, message: "Please select an option." }, ko.validation.rules.email = { validator: function (e, a) { return 0 == a && null != e && "" != e.trim() ? /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/i.test(e) : 0 == a && null != e && "" == e.trim() || (!a || a && /^([a-zA-Z0-9_\.\-\+])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/i.test(e)) }, message: "Please enter a proper email address." }, ko.validation.rules.uniqueValue = { validator: function (e, a) { var t = !0; return e && a[0] && ko.utils.arrayFirst(a[0](), function (i) { e = $.trim(e.replace(/[-()+/\s]/g, "")); var s = $.trim(i[a[2]]()); if (s && (s = s.replace(/-/g, "")), e === s && i !== a[1]) return t = !1, !0 }), t }, message: "Phone number can not be duplicated." }, ko.validation.rules.uniqueEmailValue = { validator: function (e, a) { var t = !0; return a[0] && ko.utils.arrayFirst(a[0](), function (i) { e = $.trim(e); var s = $.trim(i[a[2]]()); if (e === s && i !== a[1]) return t = !1, !0 }), t }, message: "Email address can not be duplicated." }, ko.validation.rules.ssnWithoutMask = { validator: function (e, a) { return ko.validation.utils.isEmptyVal(e) || /^00[1-9](?=\-?[0-9][1-9](?=\-?[0-9][0-9][0-9][1-9]))|00[1-9](?=\-?[0-9][1-9](?=\-?[0-9][0-9][1-9][0-9]))|00[1-9](?=\-?[0-9][1-9](?=\-?[0-9][1-9][0-9][0-9]))|00[1-9](?=\-?[0-9][1-9](?=\-?[1-9][0-9][0-9][0-9]))|00[1-9](?=\-?[1-9][0-9](?=\-?[0-9][0-9][0-9][1-9]))|00[1-9](?=\-?[1-9][0-9](?=\-?[0-9][0-9][1-9][0-9]))|00[1-9](?=\-?[1-9][0-9](?=\-?[0-9][1-9][0-9][0-9]))|00[1-9](?=\-?[1-9][0-9](?=\-?[1-9][0-9][0-9][0-9]))|0[1-9][0-9](?=\-?[0-9][1-9](?=\-?[0-9][0-9][0-9][1-9]))|0[1-9][0-9](?=\-?[0-9][1-9](?=\-?[0-9][0-9][1-9][0-9]))|0[1-9][0-9](?=\-?[0-9][1-9](?=\-?[0-9][1-9][0-9][0-9]))|0[1-9][0-9](?=\-?[0-9][1-9](?=\-?[1-9][0-9][0-9][0-9]))|0[1-9][0-9](?=\-?[1-9][0-9](?=\-?[0-9][0-9][0-9][1-9]))|0[1-9][0-9](?=\-?[1-9][0-9](?=\-?[0-9][0-9][1-9][0-9]))|0[1-9][0-9](?=\-?[1-9][0-9](?=\-?[0-9][1-9][0-9][0-9]))|0[1-9][0-9](?=\-?[1-9][0-9](?=\-?[1-9][0-9][0-9][0-9]))|[1-5][0-9][0-9](?=\-?[0-9][1-9](?=\-?[0-9][0-9][0-9][1-9]))|[1-5][0-9][0-9](?=\-?[0-9][1-9](?=\-?[0-9][0-9][1-9][0-9]))|[1-5][0-9][0-9](?=\-?[0-9][1-9](?=\-?[0-9][1-9][0-9][0-9]))|[1-5][0-9][0-9](?=\-?[0-9][1-9](?=\-?[1-9][0-9][0-9][0-9]))|[1-5][0-9][0-9](?=\-?[1-9][0-9](?=\-?[0-9][0-9][0-9][1-9]))|[1-5][0-9][0-9](?=\-?[1-9][0-9](?=\-?[0-9][0-9][1-9][0-9]))|[1-5][0-9][0-9](?=\-?[1-9][0-9](?=\-?[0-9][1-9][0-9][0-9]))|[1-5][0-9][0-9](?=\-?[1-9][0-9](?=\-?[1-9][0-9][0-9][0-9]))|6[0-5][0-9](?=\-?[0-9][1-9](?=\-?[0-9][0-9][0-9][1-9]))|6[0-5][0-9](?=\-?[0-9][1-9](?=\-?[0-9][0-9][1-9][0-9]))|6[0-5][0-9](?=\-?[0-9][1-9](?=\-?[0-9][1-9][0-9][0-9]))|6[0-5][0-9](?=\-?[0-9][1-9](?=\-?[1-9][0-9][0-9][0-9]))|6[0-5][0-9](?=\-?[1-9][0-9](?=\-?[0-9][0-9][0-9][1-9]))|6[0-5][0-9](?=\-?[1-9][0-9](?=\-?[0-9][0-9][1-9][0-9]))|6[0-5][0-9](?=\-?[1-9][0-9](?=\-?[0-9][1-9][0-9][0-9]))|6[0-5][0-9](?=\-?[1-9][0-9](?=\-?[1-9][0-9][0-9][0-9]))|66[0-5](?=\-?[0-9][1-9](?=\-?[0-9][0-9][0-9][1-9]))|66[0-5](?=\-?[0-9][1-9](?=\-?[0-9][0-9][1-9][0-9]))|66[0-5](?=\-?[0-9][1-9](?=\-?[0-9][1-9][0-9][0-9]))|66[0-5](?=\-?[0-9][1-9](?=\-?[1-9][0-9][0-9][0-9]))|66[0-5](?=\-?[1-9][0-9](?=\-?[0-9][0-9][0-9][1-9]))|66[0-5](?=\-?[1-9][0-9](?=\-?[0-9][0-9][1-9][0-9]))|66[0-5](?=\-?[1-9][0-9](?=\-?[0-9][1-9][0-9][0-9]))|66[0-5](?=\-?[1-9][0-9](?=\-?[1-9][0-9][0-9][0-9]))|66[7-9](?=\-?[0-9][1-9](?=\-?[0-9][0-9][0-9][1-9]))|66[7-9](?=\-?[0-9][1-9](?=\-?[0-9][0-9][1-9][0-9]))|66[7-9](?=\-?[0-9][1-9](?=\-?[0-9][1-9][0-9][0-9]))|66[7-9](?=\-?[0-9][1-9](?=\-?[1-9][0-9][0-9][0-9]))|66[7-9](?=\-?[1-9][0-9](?=\-?[0-9][0-9][0-9][1-9]))|66[7-9](?=\-?[1-9][0-9](?=\-?[0-9][0-9][1-9][0-9]))|66[7-9](?=\-?[1-9][0-9](?=\-?[0-9][1-9][0-9][0-9]))|66[7-9](?=\-?[1-9][0-9](?=\-?[1-9][0-9][0-9][0-9]))|6[7-9][0-9](?=\-?[0-9][1-9](?=\-?[0-9][0-9][0-9][1-9]))|6[7-9][0-9](?=\-?[0-9][1-9](?=\-?[0-9][0-9][1-9][0-9]))|6[7-9][0-9](?=\-?[0-9][1-9](?=\-?[0-9][1-9][0-9][0-9]))|6[7-9][0-9](?=\-?[0-9][1-9](?=\-?[1-9][0-9][0-9][0-9]))|6[7-9][0-9](?=\-?[1-9][0-9](?=\-?[0-9][0-9][0-9][1-9]))|6[7-9][0-9](?=\-?[1-9][0-9](?=\-?[0-9][0-9][1-9][0-9]))|6[7-9][0-9](?=\-?[1-9][0-9](?=\-?[0-9][1-9][0-9][0-9]))|6[7-9][0-9](?=\-?[1-9][0-9](?=\-?[1-9][0-9][0-9][0-9]))|[7-8][0-9][0-9](?=\-?[0-9][1-9](?=\-?[0-9][0-9][0-9][1-9]))|[7-8][0-9][0-9](?=\-?[0-9][1-9](?=\-?[0-9][0-9][1-9][0-9]))|[7-8][0-9][0-9](?=\-?[0-9][1-9](?=\-?[0-9][1-9][0-9][0-9]))|[7-8][0-9][0-9](?=\-?[0-9][1-9](?=\-?[1-9][0-9][0-9][0-9]))|[7-8][0-9][0-9](?=\-?[1-9][0-9](?=\-?[0-9][0-9][0-9][1-9]))|[7-8][0-9][0-9](?=\-?[1-9][0-9](?=\-?[0-9][0-9][1-9][0-9]))|[7-8][0-9][0-9](?=\-?[1-9][0-9](?=\-?[0-9][1-9][0-9][0-9]))|[7-8][0-9][0-9](?=\-?[1-9][0-9](?=\-?[1-9][0-9][0-9][0-9]))$/.test(e) }, message: "Please enter a valid Social Security number." }, ko.validation.rules.ssnDummyUnMasked = { validator: function (e, a) { return !e || (1 == a.hasFocus() || a.ssnWithoutMask.isModified(!0), ko.validation.utils.isEmptyVal(e) || a.ssnWithoutMask.isValid()) }, message: "Please enter a valid Social Security number." }, ko.validation.rules.hoursperweek = { validator: function (e, a) { return /^(([1-9](\.(\d){1,2})*)|([1-9][0-9](\.(\d){1,2})*)|([1][0-5][0-9](\.(\d){1,2})*)|([1][6][0-7](\.(\d){1,2})*)|([1][6][8](\.([0]){1,2})*))$/.test(e) }, message: "Please enter a value between 1-168." }, ko.validation.rules.dateOfDisaster = { validator: function (e, a) { return ko.validation.utils.isEmptyVal(e) || !moment(e).isSameOrAfter(moment(), "day") }, message: "Date of disaster must be a date in the past." }, ko.validation.rules.password = { validator: function (e, a) { return /^(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[!@#\$%\^&\*\.\=\?\[\]])(?=.{8,})/.test(e) }, message: "Password must be minimum 8 characters containing at least 1 letter, 1 number, and 1 special character." }, ko.validation.rules.futureDate = { validator: function (e, a) { return e ? ko.validation.utils.isEmptyVal(e) || moment(e).isSameOrAfter(moment(), "day") : !a }, message: "Date must be a future date." }, ko.validation.rules.futureOnlyDate = { validator: function (e, a) { return e ? ko.validation.utils.isEmptyVal(e) || moment(e).isAfter(moment(), "day") : !a }, message: "Date must be a future date." }, ko.validation.rules.inFuture90Days = { validator: function (e, a) { return e ? ko.validation.utils.isEmptyVal(e) || moment(e).isSameOrBefore(moment().add(90, "days"), "day") : !a }, message: "Select a date up to 90 days away" }, ko.validation.rules.profanity = { validator: function (e, a) { return e ? ko.validation.utils.isEmptyVal(e) || !CheckProfanity(e) : !a }, message: "This field contains inappropriate language. Please modify content to continue." }, ko.validation.rules.maxAmount = { validator: function (e, a) { return e ? ko.validation.utils.isEmptyVal(e) || parseInt(e.replace(",", "")) <= a.maxValue : !a.required }, message: function (e) { return "Maximum amount allowed is $" + e.maxValue.toLocaleString() } }, ko.validation.rules.minAmount = { validator: function (e, a) { return e ? ko.validation.utils.isEmptyVal(e) || parseInt(e.replace(",", "")) > a.minValue : !a.required }, message: function (e) { return "Amount must be greater than $" + e.minValue.toLocaleString() } },
    ko.validation.rules['requiredCustom'] = {
        validator: function (val) {
            // Accept null, but not undefined or empty string
            return val !== undefined && val !== '';
        },
        message: 'This field is required.'
    };
    ko.validation.rules.url = { validator: function (e, a) { if (!e) return !a; e = e.replace(/^\s+|\s+$/, ""); return ko.validation.utils.isEmptyVal(e) || /^(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.‌​\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[‌​6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1‌​,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00‌​a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u‌​00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?$/i.test(e) }, message: "Invalid URL" }, ko.validation.rules.restrictHtmlTag = { validator: function (e, a) { if (!e) return !a; return ko.validation.utils.isEmptyVal(e) || !/<(br|basefont|hr|input|source|frame|param|area|meta|!--|col|link|option|base|img|wbr|!DOCTYPE|a|abbr|acronym|address|applet|article|aside|audio|b|bdi|bdo|big|blockquote|body|button|canvas|caption|center|cite|code|colgroup|command|datalist|dd|del|details|dfn|dialog|dir|div|dl|dt|em|embed|fieldset|figcaption|figure|font|footer|form|frameset|head|header|hgroup|h1|h2|h3|h4|h5|h6|html|i|iframe|ins|kbd|keygen|label|legend|li|map|mark|menu|meter|nav|noframes|noscript|object|ol|optgroup|output|p|pre|progress|q|rp|rt|ruby|s|samp|script|section|select|small|span|strike|strong|style|sub|summary|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|track|tt|u|ul|var|video).*?>|<(video).*?<\/\2>/i.test(e) }, message: "Tags are not allowed" }, ko.validation.rules.restrictGreaterThanLessThanChar = { validator: function (e, a) { if (!e) return !a; return ko.validation.utils.isEmptyVal(e) || !/<|>/g.test(e) }, message: '"<" and ">" characters are not allowed' }, ko.validation.rules.charLimit = { validator: function (e, a) { if (!e) return !a.required; var t = a.limitValue - e.length; return ko.validation.utils.isEmptyVal(e) || 0 !== t }, message: "Your content has reached the maximum number of characters" }, ko.validation.rules.nonZero = { validator: function (e, a) { if (!e) return !a.required; var t = 0; e.length > 0 && (t = parseInt(e)); return ko.validation.utils.isEmptyVal(e) || /^[0-9]*[1-9][0-9]*$/i.test(t) }, message: "Value must be greater than 0" }, ko.validation.rules.flName = { validator: function (e, a) { return !e || new RegExp("[a-zA-Z-s'.]+$").test(e) }, message: "Please enter only letters, hyphens, period, apostrophes as special characters." }, ko.validation.rules.accessibilityFeatures = { validator: function (e, a) { return !(!e && a) }, message: "Please select at least one Accessibility Feature." }, ko.validation.registerExtenders();

var footerModel = (function () {
    try {
        // Public functions and state.
        var pub = {};

        pub =
            {

                // The domain model contains all information relevant to server calls.
                domain:
                {
                },

                // Any necessary public operations should be exposed here.  Functions here should just call private
                // functions.  This may be ommitted if you have no such requirements.
                operations:
                {
                },

                // The pojo model contains state information that cannot be observable because of constaints imposed by
                // third party software like Google maps.  This may be ommitted if you have no such requirements.
                pojo:
                {
                },

                // The view model contains state only of interest to the view.
                view:
                {
                }
            }

        return pub;
    }
    catch (ex) {
        go8Error.handleException(ex);
    }
}
    ());

$(function () {
    footerNav.onPageLoad();
})

var footerNav = (function ()
{
    try
    {

        var pub = {};

        pub.onPageLoad = function ()
        {
            try
            {
                getFooterTemplateBinding();
                loadReturnToTop();
                getUserLocationFromIP();
            }
            catch (ex)
            {
                go8Error.handleException(ex);
            }
        }

        pub.property = function (property)
        {
        }

        /* Get header HTML from the page  */

        function getFooterTemplateBinding()
        {
            //ko.components.register('Common-Footer', {
            //    template: { element: 'searchResultFooterHtml' },
            //    // viewModel: footerModel
            //});
            $.ajax({
                url: '/Footer/footer.aspx',
                error: errorfn,
                success: function (templateString)
                {
                    ko.components.register('Common-Footer', {
                        template: templateString,
                        // viewModel: footerModel
                    });
                   
                    viewFooterModelBind();
                   
                }
            });
        }

        function errorfn(xhr, status, error)
        {
            ////alert('Hey i am not loading!!!');
        }
        function loadReturnToTop()
        {
            $(window).scroll(function ()
            {
                if ($(this).scrollTop() >= 50)
                {        // If page is scrolled more than 50px
                    $('#return-to-top').fadeIn(200);    // Fade in the arrow
                } else
                {
                    $('#return-to-top').fadeOut(200);   // Else fade out the arrow
                }
            });
            $('#return-to-top').fadeOut(0);
            $('#return-to-top').click(function ()
            {      // When arrow is clicked
                $('body,html').animate({
                    scrollTop: 0                       // Scroll to top of body
                }, 500);
            });
        }
        function viewFooterModelBind()
        {
            var ftrElement = document.getElementById('footerControlDiv');
            if (typeof (ftrElement) != 'undefined' && ftrElement != null) {
                ko.applyBindings(footerModel, ftrElement);
            }
        }

        /**
         * Get user's location from IP.
         * */
        function getUserLocationFromIP() {
            if ($.cookie('userlocation') == null) {
                listing.getLocationByIPAddress(getLocationByIPOnSuccess, getLocationByIPOnFailure);
            }
        }

        /**
         * Invoked on success when calling getLocationByIPAddress.
         */
        function getLocationByIPOnSuccess(result) {
            try {
                // If ip address is identified
                if (result && (!helper.isNullOrEmpty(result.Location.city) || !helper.isNullOrEmpty(result.Location.district) || !helper.isNullOrEmpty(result.Location.state))) {
                    var currentlocation = result.Location;
                    var zip = (!helper.isNullOrEmpty(currentlocation["zipCode"])) ? currentlocation["zipCode"] : '';
                    var lat = (!helper.isNullOrEmpty(currentlocation["latitude"])) ? currentlocation["latitude"] : '';
                    var long = (!helper.isNullOrEmpty(currentlocation["longitude"])) ? currentlocation["longitude"] : '';
                    var city = (!helper.isNullOrEmpty(currentlocation["city"])) ? currentlocation["city"] : '';
                    var county = (!helper.isNullOrEmpty(currentlocation["district"])) ? currentlocation["district"] : '';
                    var state = (!helper.isNullOrEmpty(currentlocation["stateProv"])) ? currentlocation["stateProv"] : '';

                    var locationString = JSON.stringify({
                        City: city,
                        County: county,
                        State: state,
                        Zip: zip,
                        Latitude: lat,
                        Longitude: long
                    });

                    //add cookie for users location
                    $.cookie("userlocation", locationString, { expires: 365, path: '/', secure: true });
                }
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        /**
         * Invoked on failure when calling getLocationByIPAddress.
         */
        function getLocationByIPOnFailure() {
            try {

            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        return pub;
    }
    catch (ex)
    {
        go8Error.handleException(ex);
    }
}());


function CheckProfanity(Msg) {

    var returnString = false;

    if (Msg != '') {

        Msg = jQuery.trim(Msg);

        Msg = ' ' + Msg.toLowerCase() + ' ';

        var ProfanityString = 'scam;cheat;scumbag;*damn;*dyke;*fuck*;*shit*;@$$;ahole;amcik;andskota;anus;arschloch;arse*;ash0le;ash0les;asholes;ass;ass lick;ass monkey;asses;assface;assh0le;assh0lez;asshole;assholes;assholz;asskisser;assrammer;asswipe;ayir;azzhole;b!+ch;b!tch;b00b*;b00bs;b17ch;b1tch;balls;bassterds;bastard;bastards;bastardz;basterds;basterdz;beastial;beastiality;beastility;beaver;belly whacker;bestial;bestiality;bi+ch;bi7ch;biatch;bitch;bitch*;bitcher;bitchers;bitches;bitchin;bitching;blow job;blowjob;blowjobs;boffing;boiolas;bollock*;bonehead;boner;boobs;breasts;brown eye;browneye;browntown;buceta;bucket cunt;bull shit;bullshit;bum;bung hole;butch;butt;butt breath;butt fucker;butt hair;buttface;buttfuck;buttfucker;butthead;butthole;buttpicker;butt-pirate;buttwipe;c0ck;c0cks;c0k;cabron;carpet muncher;cawk;cawks;cazzo;chink;chraa;chuj;cipa;circle jerk;clam;clit;clits;cnts;cntz;cobia;cock;cock*;cockhead;cock-head;cocks;cocksuck;cocksucked;cocksucker;cock-sucker;cocksucking;cocksucks;cooter;crap;cum;cummer;cumming;cums;cumshot;cunilingus;cunillingus;cunnilingus;cunt;cunt*;cuntlick;cuntlicker;cuntlicking;cunts;cuntz;cyberfuc;cyberfuck;cyberfucked;cyberfucker;cyberfuckers;cyberfucking;d4mn;damn;daygo;dego;dick;dick*;dike;dike*;dild0;dild0s;dildo;dildos;dilld0;dilld0s;dink;dinks;dipshit;dirsa;dominatricks;dominatrics;dominatrix;dong;douche bag;dumbass;dupa;dyke;dziwka;ejackulate;ejaculate;ejaculated;ejaculates;ejaculating;ejaculatings;ejaculation;ejakulate;ekrem*;ekto;enculer;enema;f u c k;f u c k e r;faen;fag;fag*;fag1t;faget;fagg1t;fagget;fagging;faggit;faggot;faggs;fagit;fagot;fagots;fags;fagz;faig;faigs;fanculo;fart;farted;farting;fartings;farts;farty;fatass;fatso;fcuk;feces;feg;felatio;felcher;fellatio;ficken;fingerfuck;fingerfucked;fingerfucker;fingerfuckers;fingerfucking;fingerfucks;fistfuck;fistfucked;fistfucker;fistfuckers;fistfucking;fistfuckings;fistfucks;fitt*;flikker;flipping the bird;foreskin;fotze;fu(*;fuck;fucked;fucker;fuckers;fuckin;fucking;fuckings;fuckme;fucks;fudge packer;fuk;fuk*;fukah;fuken;fuker;fukin;fukk;fukkah;fukken;fukker;fukkin;fuks;furburger;futkretzn;fux0r;g00k;gangbang;gangbanged;gangbangs;gayboy;gaygirl;gaysex;gayz;gazongers;goddamn;god-damned;gonads;gook;guiena;guinne;h00r;h0ar;h0r;h0re;h4x0r;hard on;hardcoresex;hell;hells;helvete;hoar;hoer;hoer*;homo;honkey;hooker;hoor;hoore;hore;horniest;horny;hotsex;huevon;hui;hussy;injun;jack off;jackass;jacking off;jackoff;jack-off;jap;japs;jerk;jerk-off;jisim;jism;jiss;jiz ;jizm;jizz;kanker*;kawk;kike;klootzak;knulle;kock;kondum;kondums;kraut;kuk;kuksuger;kum;kummer;kumming;kums;kunilingus;kunt;kunts;kuntz;kurac;kurwa;kusi*;kyrpa*;l3i+ch;l3itch;lesbian;lesbo;lezzian;lipshits;lipshitz;mamhoon;masochist;masokist;massterbait;masstrbait;masstrbate;masterbaiter;masterbat*;masterbat3;masterbate;masterbates;masturbat*;masturbate;merd*;merde;mibun;mick;mofo;monkleigh;motha fucker;motha fuker;motha fukkah;motha fukker;mothafuck;mothafucka;mothafuckas;mothafuckaz;mothafucked;mothafucker;mothafuckers;mothafuckin;mothafucking;mothafuckings;mothafucks;mother fucker;mother fukah;mother fuker;mother fukkah;mother fukker;motherfuck;motherfucked;motherfucker;mother-fucker;motherfuckers;motherfuckin;motherfucking;motherfuckings;motherfucks;mouliewop;muff;muie;mulkku;muschi;mutha fucker;mutha fukah;mutha fuker;mutha fukkah;mutha fukker;n1gr;nastt;nazi;nazis;nepesaurio;nigga;nigger;nigger*;nigger;niggers;nigur;;niiger;;niigr;;nutsack;orafis;orgasim;orgasim;;orgasims;orgasm;orgasms;orgasum;oriface;orifice;orifiss;orospu;p0rn;packi;packie;packy;paki;pakie;paky;paska*;pecker;peeenus;peeenusss;peenus;peinus;pen1s;penas;penis;penis-breath;penus;penuus;perse;phonesex;phuc;phuck;phuk;phuked;phuker;phuking;phukked;phukker;phukking;phuks;phuq;picka;pierdol*;pillu*;pimmel;pimp;pimpis;piss;piss*;pissed;pissers;pisses;pissin;pissing;pissoff;pissrr;pizda;polac;polack;polak;poonani;poontsee;poop;porn;pr0n;pr1c;pr1ck;pr1k;preteen;prick;pricks;pula;pule;pusse;pussee;pussies;pussy;pussys;puta;puto;puuke;puuker;qahbeh;queef*;queer;queers;queerz;qweers;qweerz;qweir;rautenberg;recktum;rectum;retard;s.o.b.;sadist;scank;schaffer;scheiss*;schlampe;schlong;schmuck;screw;screwing;scrotum;semen;sex;sexy;sh!+;sh!t;sh!t*;sh1t;sh1ter;sh1ts;sh1tter;sh1tz;sharmuta;sharmute;sheister;shemale;shi+;shipal;shit;shited;shitfull;shiting;shitings;shits;shitted;shitter;shitters;shitting;shittings;shitty;shity;shitz;shiz;shyt;shyte;shytty;shyty;skanck;skank;skankee;skankey;skanks;skanky;skribz;skurwysyn;slag;sleaze;slut;sluts;slutty;slutz;smut;snatch;son-of-a-bitch;sphencter;spic;spierdalaj;splooge;spunk;suka;teets;teez;testical;testicle;testicle*;tit;tits;titt;titt*;turd;twat;va1jina;vag1na;vagiina;vagina;vaj1na;vajina;vittu;vullva;vulva;w00se;w0p;wank;wank*;wetback;wetback*;wh00r;wh0re;whoar;whore;wichser;wop;wop*;xrated;xxx;yed;zabourah;arse;arsehole ;ass-hat;ass-jabber;ass-pirate;assbag;assbandit;assbanger;assbite;assclown;asscock;asscracker;assfuck;assfucker;assgoblin;asshat;asshead;asshopper;assjacker;asslick;asslicker;assmonkey;assmunch;assmuncher;assnigger;asspirate;assshit;assshole;asssucker;asswad;bampot;beaner;bitchass;bitchtits;bitchy;bollocks;bollox;brotherfucker;bumblefuck;butt plug;buttfucka;camel toe;carpetmuncher;chinc;choad;chode;clitface;clitfuck;clusterfuck;cockass;cockbite;4r5e;5h1t;5hit;a55;a s s;ass-fucker;assfukka;a_s_s;@ s s;@ 5 5;@55;a 5 5;@ss;ballbag;ballsack;bellend;bloody;boob;booob;boooob;booooob;booooooob;booobs;boooobs;booooobs;booooooobs'

        var lines = ProfanityString.split(';');

        $.each(lines, function (itemNo, item) {

            if (item != '' && Msg.indexOf(' ' + item.toLowerCase() + ' ') > -1)

                returnString = true;

        });

    }

    return returnString;

}


/*! tooltipster v4.2.6 */!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):b(jQuery)}(this,function(a){function b(a){this.$container,this.constraints=null,this.__$tooltip,this.__init(a)}function c(b,c){var d=!0;return a.each(b,function(a,e){return void 0===c[a]||b[a]!==c[a]?(d=!1,!1):void 0}),d}function d(b){var c=b.attr("id"),d=c?h.window.document.getElementById(c):null;return d?d===b[0]:a.contains(h.window.document.body,b[0])}function e(){if(!g)return!1;var a=g.document.body||g.document.documentElement,b=a.style,c="transition",d=["Moz","Webkit","Khtml","O","ms"];if("string"==typeof b[c])return!0;c=c.charAt(0).toUpperCase()+c.substr(1);for(var e=0;e<d.length;e++)if("string"==typeof b[d[e]+c])return!0;return!1}var f={animation:"fade",animationDuration:350,content:null,contentAsHTML:!1,contentCloning:!1,debug:!0,delay:300,delayTouch:[300,500],functionInit:null,functionBefore:null,functionReady:null,functionAfter:null,functionFormat:null,IEmin:6,interactive:!1,multiple:!1,parent:null,plugins:["sideTip"],repositionOnScroll:!1,restoration:"none",selfDestruction:!0,theme:[],timer:0,trackerInterval:500,trackOrigin:!1,trackTooltip:!1,trigger:"hover",triggerClose:{click:!1,mouseleave:!1,originClick:!1,scroll:!1,tap:!1,touchleave:!1},triggerOpen:{click:!1,mouseenter:!1,tap:!1,touchstart:!1},updateAnimation:"rotate",zIndex:9999999},g="undefined"!=typeof window?window:null,h={hasTouchCapability:!(!g||!("ontouchstart"in g||g.DocumentTouch&&g.document instanceof g.DocumentTouch||g.navigator.maxTouchPoints)),hasTransitions:e(),IE:!1,semVer:"4.2.6",window:g},i=function(){this.__$emitterPrivate=a({}),this.__$emitterPublic=a({}),this.__instancesLatestArr=[],this.__plugins={},this._env=h};i.prototype={__bridge:function(b,c,d){if(!c[d]){var e=function(){};e.prototype=b;var g=new e;g.__init&&g.__init(c),a.each(b,function(a,b){0!=a.indexOf("__")&&(c[a]?f.debug&&console.log("The "+a+" method of the "+d+" plugin conflicts with another plugin or native methods"):(c[a]=function(){return g[a].apply(g,Array.prototype.slice.apply(arguments))},c[a].bridged=g))}),c[d]=g}return this},__setWindow:function(a){return h.window=a,this},_getRuler:function(a){return new b(a)},_off:function(){return this.__$emitterPrivate.off.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_on:function(){return this.__$emitterPrivate.on.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_one:function(){return this.__$emitterPrivate.one.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_plugin:function(b){var c=this;if("string"==typeof b){var d=b,e=null;return d.indexOf(".")>0?e=c.__plugins[d]:a.each(c.__plugins,function(a,b){return b.name.substring(b.name.length-d.length-1)=="."+d?(e=b,!1):void 0}),e}if(b.name.indexOf(".")<0)throw new Error("Plugins must be namespaced");return c.__plugins[b.name]=b,b.core&&c.__bridge(b.core,c,b.name),this},_trigger:function(){var a=Array.prototype.slice.apply(arguments);return"string"==typeof a[0]&&(a[0]={type:a[0]}),this.__$emitterPrivate.trigger.apply(this.__$emitterPrivate,a),this.__$emitterPublic.trigger.apply(this.__$emitterPublic,a),this},instances:function(b){var c=[],d=b||".tooltipstered";return a(d).each(function(){var b=a(this),d=b.data("tooltipster-ns");d&&a.each(d,function(a,d){c.push(b.data(d))})}),c},instancesLatest:function(){return this.__instancesLatestArr},off:function(){return this.__$emitterPublic.off.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},on:function(){return this.__$emitterPublic.on.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},one:function(){return this.__$emitterPublic.one.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},origins:function(b){var c=b?b+" ":"";return a(c+".tooltipstered").toArray()},setDefaults:function(b){return a.extend(f,b),this},triggerHandler:function(){return this.__$emitterPublic.triggerHandler.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this}},a.tooltipster=new i,a.Tooltipster=function(b,c){this.__callbacks={close:[],open:[]},this.__closingTime,this.__Content,this.__contentBcr,this.__destroyed=!1,this.__$emitterPrivate=a({}),this.__$emitterPublic=a({}),this.__enabled=!0,this.__garbageCollector,this.__Geometry,this.__lastPosition,this.__namespace="tooltipster-"+Math.round(1e6*Math.random()),this.__options,this.__$originParents,this.__pointerIsOverOrigin=!1,this.__previousThemes=[],this.__state="closed",this.__timeouts={close:[],open:null},this.__touchEvents=[],this.__tracker=null,this._$origin,this._$tooltip,this.__init(b,c)},a.Tooltipster.prototype={__init:function(b,c){var d=this;if(d._$origin=a(b),d.__options=a.extend(!0,{},f,c),d.__optionsFormat(),!h.IE||h.IE>=d.__options.IEmin){var e=null;if(void 0===d._$origin.data("tooltipster-initialTitle")&&(e=d._$origin.attr("title"),void 0===e&&(e=null),d._$origin.data("tooltipster-initialTitle",e)),null!==d.__options.content)d.__contentSet(d.__options.content);else{var g,i=d._$origin.attr("data-tooltip-content");i&&(g=a(i)),g&&g[0]?d.__contentSet(g.first()):d.__contentSet(e)}d._$origin.removeAttr("title").addClass("tooltipstered"),d.__prepareOrigin(),d.__prepareGC(),a.each(d.__options.plugins,function(a,b){d._plug(b)}),h.hasTouchCapability&&a(h.window.document.body).on("touchmove."+d.__namespace+"-triggerOpen",function(a){d._touchRecordEvent(a)}),d._on("created",function(){d.__prepareTooltip()})._on("repositioned",function(a){d.__lastPosition=a.position})}else d.__options.disabled=!0},__contentInsert:function(){var a=this,b=a._$tooltip.find(".tooltipster-content"),c=a.__Content,d=function(a){c=a};return a._trigger({type:"format",content:a.__Content,format:d}),a.__options.functionFormat&&(c=a.__options.functionFormat.call(a,a,{origin:a._$origin[0]},a.__Content)),"string"!=typeof c||a.__options.contentAsHTML?b.empty().append(c):b.text(c),a},__contentSet:function(b){return b instanceof a&&this.__options.contentCloning&&(b=b.clone(!0)),this.__Content=b,this._trigger({type:"updated",content:b}),this},__destroyError:function(){throw new Error("This tooltip has been destroyed and cannot execute your method call.")},__geometry:function(){var b=this,c=b._$origin,d=b._$origin.is("area");if(d){var e=b._$origin.parent().attr("name");c=a('img[usemap="#'+e+'"]')}var f=c[0].getBoundingClientRect(),g=a(h.window.document),i=a(h.window),j=c,k={available:{document:null,window:null},document:{size:{height:g.height(),width:g.width()}},window:{scroll:{left:h.window.scrollX||h.window.document.documentElement.scrollLeft,top:h.window.scrollY||h.window.document.documentElement.scrollTop},size:{height:i.height(),width:i.width()}},origin:{fixedLineage:!1,offset:{},size:{height:f.bottom-f.top,width:f.right-f.left},usemapImage:d?c[0]:null,windowOffset:{bottom:f.bottom,left:f.left,right:f.right,top:f.top}}};if(d){var l=b._$origin.attr("shape"),m=b._$origin.attr("coords");if(m&&(m=m.split(","),a.map(m,function(a,b){m[b]=parseInt(a)})),"default"!=l)switch(l){case"circle":var n=m[0],o=m[1],p=m[2],q=o-p,r=n-p;k.origin.size.height=2*p,k.origin.size.width=k.origin.size.height,k.origin.windowOffset.left+=r,k.origin.windowOffset.top+=q;break;case"rect":var s=m[0],t=m[1],u=m[2],v=m[3];k.origin.size.height=v-t,k.origin.size.width=u-s,k.origin.windowOffset.left+=s,k.origin.windowOffset.top+=t;break;case"poly":for(var w=0,x=0,y=0,z=0,A="even",B=0;B<m.length;B++){var C=m[B];"even"==A?(C>y&&(y=C,0===B&&(w=y)),w>C&&(w=C),A="odd"):(C>z&&(z=C,1==B&&(x=z)),x>C&&(x=C),A="even")}k.origin.size.height=z-x,k.origin.size.width=y-w,k.origin.windowOffset.left+=w,k.origin.windowOffset.top+=x}}var D=function(a){k.origin.size.height=a.height,k.origin.windowOffset.left=a.left,k.origin.windowOffset.top=a.top,k.origin.size.width=a.width};for(b._trigger({type:"geometry",edit:D,geometry:{height:k.origin.size.height,left:k.origin.windowOffset.left,top:k.origin.windowOffset.top,width:k.origin.size.width}}),k.origin.windowOffset.right=k.origin.windowOffset.left+k.origin.size.width,k.origin.windowOffset.bottom=k.origin.windowOffset.top+k.origin.size.height,k.origin.offset.left=k.origin.windowOffset.left+k.window.scroll.left,k.origin.offset.top=k.origin.windowOffset.top+k.window.scroll.top,k.origin.offset.bottom=k.origin.offset.top+k.origin.size.height,k.origin.offset.right=k.origin.offset.left+k.origin.size.width,k.available.document={bottom:{height:k.document.size.height-k.origin.offset.bottom,width:k.document.size.width},left:{height:k.document.size.height,width:k.origin.offset.left},right:{height:k.document.size.height,width:k.document.size.width-k.origin.offset.right},top:{height:k.origin.offset.top,width:k.document.size.width}},k.available.window={bottom:{height:Math.max(k.window.size.height-Math.max(k.origin.windowOffset.bottom,0),0),width:k.window.size.width},left:{height:k.window.size.height,width:Math.max(k.origin.windowOffset.left,0)},right:{height:k.window.size.height,width:Math.max(k.window.size.width-Math.max(k.origin.windowOffset.right,0),0)},top:{height:Math.max(k.origin.windowOffset.top,0),width:k.window.size.width}};"html"!=j[0].tagName.toLowerCase();){if("fixed"==j.css("position")){k.origin.fixedLineage=!0;break}j=j.parent()}return k},__optionsFormat:function(){return"number"==typeof this.__options.animationDuration&&(this.__options.animationDuration=[this.__options.animationDuration,this.__options.animationDuration]),"number"==typeof this.__options.delay&&(this.__options.delay=[this.__options.delay,this.__options.delay]),"number"==typeof this.__options.delayTouch&&(this.__options.delayTouch=[this.__options.delayTouch,this.__options.delayTouch]),"string"==typeof this.__options.theme&&(this.__options.theme=[this.__options.theme]),null===this.__options.parent?this.__options.parent=a(h.window.document.body):"string"==typeof this.__options.parent&&(this.__options.parent=a(this.__options.parent)),"hover"==this.__options.trigger?(this.__options.triggerOpen={mouseenter:!0,touchstart:!0},this.__options.triggerClose={mouseleave:!0,originClick:!0,touchleave:!0}):"click"==this.__options.trigger&&(this.__options.triggerOpen={click:!0,tap:!0},this.__options.triggerClose={click:!0,tap:!0}),this._trigger("options"),this},__prepareGC:function(){var b=this;return b.__options.selfDestruction?b.__garbageCollector=setInterval(function(){var c=(new Date).getTime();b.__touchEvents=a.grep(b.__touchEvents,function(a,b){return c-a.time>6e4}),d(b._$origin)||b.close(function(){b.destroy()})},2e4):clearInterval(b.__garbageCollector),b},__prepareOrigin:function(){var a=this;if(a._$origin.off("."+a.__namespace+"-triggerOpen"),h.hasTouchCapability&&a._$origin.on("touchstart."+a.__namespace+"-triggerOpen touchend."+a.__namespace+"-triggerOpen touchcancel."+a.__namespace+"-triggerOpen",function(b){a._touchRecordEvent(b)}),a.__options.triggerOpen.click||a.__options.triggerOpen.tap&&h.hasTouchCapability){var b="";a.__options.triggerOpen.click&&(b+="click."+a.__namespace+"-triggerOpen "),a.__options.triggerOpen.tap&&h.hasTouchCapability&&(b+="touchend."+a.__namespace+"-triggerOpen"),a._$origin.on(b,function(b){a._touchIsMeaningfulEvent(b)&&a._open(b)})}if(a.__options.triggerOpen.mouseenter||a.__options.triggerOpen.touchstart&&h.hasTouchCapability){var b="";a.__options.triggerOpen.mouseenter&&(b+="mouseenter."+a.__namespace+"-triggerOpen "),a.__options.triggerOpen.touchstart&&h.hasTouchCapability&&(b+="touchstart."+a.__namespace+"-triggerOpen"),a._$origin.on(b,function(b){!a._touchIsTouchEvent(b)&&a._touchIsEmulatedEvent(b)||(a.__pointerIsOverOrigin=!0,a._openShortly(b))})}if(a.__options.triggerClose.mouseleave||a.__options.triggerClose.touchleave&&h.hasTouchCapability){var b="";a.__options.triggerClose.mouseleave&&(b+="mouseleave."+a.__namespace+"-triggerOpen "),a.__options.triggerClose.touchleave&&h.hasTouchCapability&&(b+="touchend."+a.__namespace+"-triggerOpen touchcancel."+a.__namespace+"-triggerOpen"),a._$origin.on(b,function(b){a._touchIsMeaningfulEvent(b)&&(a.__pointerIsOverOrigin=!1)})}return a},__prepareTooltip:function(){var b=this,c=b.__options.interactive?"auto":"";return b._$tooltip.attr("id",b.__namespace).css({"pointer-events":c,zIndex:b.__options.zIndex}),a.each(b.__previousThemes,function(a,c){b._$tooltip.removeClass(c)}),a.each(b.__options.theme,function(a,c){b._$tooltip.addClass(c)}),b.__previousThemes=a.merge([],b.__options.theme),b},__scrollHandler:function(b){var c=this;if(c.__options.triggerClose.scroll)c._close(b);else if(d(c._$origin)&&d(c._$tooltip)){var e=null;if(b.target===h.window.document)c.__Geometry.origin.fixedLineage||c.__options.repositionOnScroll&&c.reposition(b);else{e=c.__geometry();var f=!1;if("fixed"!=c._$origin.css("position")&&c.__$originParents.each(function(b,c){var d=a(c),g=d.css("overflow-x"),h=d.css("overflow-y");if("visible"!=g||"visible"!=h){var i=c.getBoundingClientRect();if("visible"!=g&&(e.origin.windowOffset.left<i.left||e.origin.windowOffset.right>i.right))return f=!0,!1;if("visible"!=h&&(e.origin.windowOffset.top<i.top||e.origin.windowOffset.bottom>i.bottom))return f=!0,!1}return"fixed"==d.css("position")?!1:void 0}),f)c._$tooltip.css("visibility","hidden");else if(c._$tooltip.css("visibility","visible"),c.__options.repositionOnScroll)c.reposition(b);else{var g=e.origin.offset.left-c.__Geometry.origin.offset.left,i=e.origin.offset.top-c.__Geometry.origin.offset.top;c._$tooltip.css({left:c.__lastPosition.coord.left+g,top:c.__lastPosition.coord.top+i})}}c._trigger({type:"scroll",event:b,geo:e})}return c},__stateSet:function(a){return this.__state=a,this._trigger({type:"state",state:a}),this},__timeoutsClear:function(){return clearTimeout(this.__timeouts.open),this.__timeouts.open=null,a.each(this.__timeouts.close,function(a,b){clearTimeout(b)}),this.__timeouts.close=[],this},__trackerStart:function(){var a=this,b=a._$tooltip.find(".tooltipster-content");return a.__options.trackTooltip&&(a.__contentBcr=b[0].getBoundingClientRect()),a.__tracker=setInterval(function(){if(d(a._$origin)&&d(a._$tooltip)){if(a.__options.trackOrigin){var e=a.__geometry(),f=!1;c(e.origin.size,a.__Geometry.origin.size)&&(a.__Geometry.origin.fixedLineage?c(e.origin.windowOffset,a.__Geometry.origin.windowOffset)&&(f=!0):c(e.origin.offset,a.__Geometry.origin.offset)&&(f=!0)),f||(a.__options.triggerClose.mouseleave?a._close():a.reposition())}if(a.__options.trackTooltip){var g=b[0].getBoundingClientRect();g.height===a.__contentBcr.height&&g.width===a.__contentBcr.width||(a.reposition(),a.__contentBcr=g)}}else a._close()},a.__options.trackerInterval),a},_close:function(b,c,d){var e=this,f=!0;if(e._trigger({type:"close",event:b,stop:function(){f=!1}}),f||d){c&&e.__callbacks.close.push(c),e.__callbacks.open=[],e.__timeoutsClear();var g=function(){a.each(e.__callbacks.close,function(a,c){c.call(e,e,{event:b,origin:e._$origin[0]})}),e.__callbacks.close=[]};if("closed"!=e.__state){var i=!0,j=new Date,k=j.getTime(),l=k+e.__options.animationDuration[1];if("disappearing"==e.__state&&l>e.__closingTime&&e.__options.animationDuration[1]>0&&(i=!1),i){e.__closingTime=l,"disappearing"!=e.__state&&e.__stateSet("disappearing");var m=function(){clearInterval(e.__tracker),e._trigger({type:"closing",event:b}),e._$tooltip.off("."+e.__namespace+"-triggerClose").removeClass("tooltipster-dying"),a(h.window).off("."+e.__namespace+"-triggerClose"),e.__$originParents.each(function(b,c){a(c).off("scroll."+e.__namespace+"-triggerClose")}),e.__$originParents=null,a(h.window.document.body).off("."+e.__namespace+"-triggerClose"),e._$origin.off("."+e.__namespace+"-triggerClose"),e._off("dismissable"),e.__stateSet("closed"),e._trigger({type:"after",event:b}),e.__options.functionAfter&&e.__options.functionAfter.call(e,e,{event:b,origin:e._$origin[0]}),g()};h.hasTransitions?(e._$tooltip.css({"-moz-animation-duration":e.__options.animationDuration[1]+"ms","-ms-animation-duration":e.__options.animationDuration[1]+"ms","-o-animation-duration":e.__options.animationDuration[1]+"ms","-webkit-animation-duration":e.__options.animationDuration[1]+"ms","animation-duration":e.__options.animationDuration[1]+"ms","transition-duration":e.__options.animationDuration[1]+"ms"}),e._$tooltip.clearQueue().removeClass("tooltipster-show").addClass("tooltipster-dying"),e.__options.animationDuration[1]>0&&e._$tooltip.delay(e.__options.animationDuration[1]),e._$tooltip.queue(m)):e._$tooltip.stop().fadeOut(e.__options.animationDuration[1],m)}}else g()}return e},_off:function(){return this.__$emitterPrivate.off.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_on:function(){return this.__$emitterPrivate.on.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_one:function(){return this.__$emitterPrivate.one.apply(this.__$emitterPrivate,Array.prototype.slice.apply(arguments)),this},_open:function(b,c){var e=this;if(!e.__destroying&&d(e._$origin)&&e.__enabled){var f=!0;if("closed"==e.__state&&(e._trigger({type:"before",event:b,stop:function(){f=!1}}),f&&e.__options.functionBefore&&(f=e.__options.functionBefore.call(e,e,{event:b,origin:e._$origin[0]}))),f!==!1&&null!==e.__Content){c&&e.__callbacks.open.push(c),e.__callbacks.close=[],e.__timeoutsClear();var g,i=function(){"stable"!=e.__state&&e.__stateSet("stable"),a.each(e.__callbacks.open,function(a,b){b.call(e,e,{origin:e._$origin[0],tooltip:e._$tooltip[0]})}),e.__callbacks.open=[]};if("closed"!==e.__state)g=0,"disappearing"===e.__state?(e.__stateSet("appearing"),h.hasTransitions?(e._$tooltip.clearQueue().removeClass("tooltipster-dying").addClass("tooltipster-show"),e.__options.animationDuration[0]>0&&e._$tooltip.delay(e.__options.animationDuration[0]),e._$tooltip.queue(i)):e._$tooltip.stop().fadeIn(i)):"stable"==e.__state&&i();else{if(e.__stateSet("appearing"),g=e.__options.animationDuration[0],e.__contentInsert(),e.reposition(b,!0),h.hasTransitions?(e._$tooltip.addClass("tooltipster-"+e.__options.animation).addClass("tooltipster-initial").css({"-moz-animation-duration":e.__options.animationDuration[0]+"ms","-ms-animation-duration":e.__options.animationDuration[0]+"ms","-o-animation-duration":e.__options.animationDuration[0]+"ms","-webkit-animation-duration":e.__options.animationDuration[0]+"ms","animation-duration":e.__options.animationDuration[0]+"ms","transition-duration":e.__options.animationDuration[0]+"ms"}),setTimeout(function(){"closed"!=e.__state&&(e._$tooltip.addClass("tooltipster-show").removeClass("tooltipster-initial"),e.__options.animationDuration[0]>0&&e._$tooltip.delay(e.__options.animationDuration[0]),e._$tooltip.queue(i))},0)):e._$tooltip.css("display","none").fadeIn(e.__options.animationDuration[0],i),e.__trackerStart(),a(h.window).on("resize."+e.__namespace+"-triggerClose",function(b){var c=a(document.activeElement);(c.is("input")||c.is("textarea"))&&a.contains(e._$tooltip[0],c[0])||e.reposition(b)}).on("scroll."+e.__namespace+"-triggerClose",function(a){e.__scrollHandler(a)}),e.__$originParents=e._$origin.parents(),e.__$originParents.each(function(b,c){a(c).on("scroll."+e.__namespace+"-triggerClose",function(a){e.__scrollHandler(a)})}),e.__options.triggerClose.mouseleave||e.__options.triggerClose.touchleave&&h.hasTouchCapability){e._on("dismissable",function(a){a.dismissable?a.delay?(m=setTimeout(function(){e._close(a.event)},a.delay),e.__timeouts.close.push(m)):e._close(a):clearTimeout(m)});var j=e._$origin,k="",l="",m=null;e.__options.interactive&&(j=j.add(e._$tooltip)),e.__options.triggerClose.mouseleave&&(k+="mouseenter."+e.__namespace+"-triggerClose ",l+="mouseleave."+e.__namespace+"-triggerClose "),e.__options.triggerClose.touchleave&&h.hasTouchCapability&&(k+="touchstart."+e.__namespace+"-triggerClose",l+="touchend."+e.__namespace+"-triggerClose touchcancel."+e.__namespace+"-triggerClose"),j.on(l,function(a){if(e._touchIsTouchEvent(a)||!e._touchIsEmulatedEvent(a)){var b="mouseleave"==a.type?e.__options.delay:e.__options.delayTouch;e._trigger({delay:b[1],dismissable:!0,event:a,type:"dismissable"})}}).on(k,function(a){!e._touchIsTouchEvent(a)&&e._touchIsEmulatedEvent(a)||e._trigger({dismissable:!1,event:a,type:"dismissable"})})}e.__options.triggerClose.originClick&&e._$origin.on("click."+e.__namespace+"-triggerClose",function(a){e._touchIsTouchEvent(a)||e._touchIsEmulatedEvent(a)||e._close(a)}),(e.__options.triggerClose.click||e.__options.triggerClose.tap&&h.hasTouchCapability)&&setTimeout(function(){if("closed"!=e.__state){var b="",c=a(h.window.document.body);e.__options.triggerClose.click&&(b+="click."+e.__namespace+"-triggerClose "),e.__options.triggerClose.tap&&h.hasTouchCapability&&(b+="touchend."+e.__namespace+"-triggerClose"),c.on(b,function(b){e._touchIsMeaningfulEvent(b)&&(e._touchRecordEvent(b),e.__options.interactive&&a.contains(e._$tooltip[0],b.target)||e._close(b))}),e.__options.triggerClose.tap&&h.hasTouchCapability&&c.on("touchstart."+e.__namespace+"-triggerClose",function(a){e._touchRecordEvent(a)})}},0),e._trigger("ready"),e.__options.functionReady&&e.__options.functionReady.call(e,e,{origin:e._$origin[0],tooltip:e._$tooltip[0]})}if(e.__options.timer>0){var m=setTimeout(function(){e._close()},e.__options.timer+g);e.__timeouts.close.push(m)}}}return e},_openShortly:function(a){var b=this,c=!0;if("stable"!=b.__state&&"appearing"!=b.__state&&!b.__timeouts.open&&(b._trigger({type:"start",event:a,stop:function(){c=!1}}),c)){var d=0==a.type.indexOf("touch")?b.__options.delayTouch:b.__options.delay;d[0]?b.__timeouts.open=setTimeout(function(){b.__timeouts.open=null,b.__pointerIsOverOrigin&&b._touchIsMeaningfulEvent(a)?(b._trigger("startend"),b._open(a)):b._trigger("startcancel")},d[0]):(b._trigger("startend"),b._open(a))}return b},_optionsExtract:function(b,c){var d=this,e=a.extend(!0,{},c),f=d.__options[b];return f||(f={},a.each(c,function(a,b){var c=d.__options[a];void 0!==c&&(f[a]=c)})),a.each(e,function(b,c){void 0!==f[b]&&("object"!=typeof c||c instanceof Array||null==c||"object"!=typeof f[b]||f[b]instanceof Array||null==f[b]?e[b]=f[b]:a.extend(e[b],f[b]))}),e},_plug:function(b){var c=a.tooltipster._plugin(b);if(!c)throw new Error('The "'+b+'" plugin is not defined');return c.instance&&a.tooltipster.__bridge(c.instance,this,c.name),this},_touchIsEmulatedEvent:function(a){for(var b=!1,c=(new Date).getTime(),d=this.__touchEvents.length-1;d>=0;d--){var e=this.__touchEvents[d];if(!(c-e.time<500))break;e.target===a.target&&(b=!0)}return b},_touchIsMeaningfulEvent:function(a){return this._touchIsTouchEvent(a)&&!this._touchSwiped(a.target)||!this._touchIsTouchEvent(a)&&!this._touchIsEmulatedEvent(a)},_touchIsTouchEvent:function(a){return 0==a.type.indexOf("touch")},_touchRecordEvent:function(a){return this._touchIsTouchEvent(a)&&(a.time=(new Date).getTime(),this.__touchEvents.push(a)),this},_touchSwiped:function(a){for(var b=!1,c=this.__touchEvents.length-1;c>=0;c--){var d=this.__touchEvents[c];if("touchmove"==d.type){b=!0;break}if("touchstart"==d.type&&a===d.target)break}return b},_trigger:function(){var b=Array.prototype.slice.apply(arguments);return"string"==typeof b[0]&&(b[0]={type:b[0]}),b[0].instance=this,b[0].origin=this._$origin?this._$origin[0]:null,b[0].tooltip=this._$tooltip?this._$tooltip[0]:null,this.__$emitterPrivate.trigger.apply(this.__$emitterPrivate,b),a.tooltipster._trigger.apply(a.tooltipster,b),this.__$emitterPublic.trigger.apply(this.__$emitterPublic,b),this},_unplug:function(b){var c=this;if(c[b]){var d=a.tooltipster._plugin(b);d.instance&&a.each(d.instance,function(a,d){c[a]&&c[a].bridged===c[b]&&delete c[a]}),c[b].__destroy&&c[b].__destroy(),delete c[b]}return c},close:function(a){return this.__destroyed?this.__destroyError():this._close(null,a),this},content:function(a){var b=this;if(void 0===a)return b.__Content;if(b.__destroyed)b.__destroyError();else if(b.__contentSet(a),null!==b.__Content){if("closed"!==b.__state&&(b.__contentInsert(),b.reposition(),b.__options.updateAnimation))if(h.hasTransitions){var c=b.__options.updateAnimation;b._$tooltip.addClass("tooltipster-update-"+c),setTimeout(function(){"closed"!=b.__state&&b._$tooltip.removeClass("tooltipster-update-"+c)},1e3)}else b._$tooltip.fadeTo(200,.5,function(){"closed"!=b.__state&&b._$tooltip.fadeTo(200,1)})}else b._close();return b},destroy:function(){var b=this;if(b.__destroyed)b.__destroyError();else{"closed"!=b.__state?b.option("animationDuration",0)._close(null,null,!0):b.__timeoutsClear(),b._trigger("destroy"),b.__destroyed=!0,b._$origin.removeData(b.__namespace).off("."+b.__namespace+"-triggerOpen"),a(h.window.document.body).off("."+b.__namespace+"-triggerOpen");var c=b._$origin.data("tooltipster-ns");if(c)if(1===c.length){var d=null;"previous"==b.__options.restoration?d=b._$origin.data("tooltipster-initialTitle"):"current"==b.__options.restoration&&(d="string"==typeof b.__Content?b.__Content:a("<div></div>").append(b.__Content).html()),d&&b._$origin.attr("title",d),b._$origin.removeClass("tooltipstered"),b._$origin.removeData("tooltipster-ns").removeData("tooltipster-initialTitle")}else c=a.grep(c,function(a,c){return a!==b.__namespace}),b._$origin.data("tooltipster-ns",c);b._trigger("destroyed"),b._off(),b.off(),b.__Content=null,b.__$emitterPrivate=null,b.__$emitterPublic=null,b.__options.parent=null,b._$origin=null,b._$tooltip=null,a.tooltipster.__instancesLatestArr=a.grep(a.tooltipster.__instancesLatestArr,function(a,c){return b!==a}),clearInterval(b.__garbageCollector)}return b},disable:function(){return this.__destroyed?(this.__destroyError(),this):(this._close(),this.__enabled=!1,this)},elementOrigin:function(){return this.__destroyed?void this.__destroyError():this._$origin[0]},elementTooltip:function(){return this._$tooltip?this._$tooltip[0]:null},enable:function(){return this.__enabled=!0,this},hide:function(a){return this.close(a)},instance:function(){return this},off:function(){return this.__destroyed||this.__$emitterPublic.off.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},on:function(){return this.__destroyed?this.__destroyError():this.__$emitterPublic.on.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},one:function(){return this.__destroyed?this.__destroyError():this.__$emitterPublic.one.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this},open:function(a){return this.__destroyed?this.__destroyError():this._open(null,a),this},option:function(b,c){return void 0===c?this.__options[b]:(this.__destroyed?this.__destroyError():(this.__options[b]=c,this.__optionsFormat(),a.inArray(b,["trigger","triggerClose","triggerOpen"])>=0&&this.__prepareOrigin(),"selfDestruction"===b&&this.__prepareGC()),this)},reposition:function(a,b){var c=this;return c.__destroyed?c.__destroyError():"closed"!=c.__state&&d(c._$origin)&&(b||d(c._$tooltip))&&(b||c._$tooltip.detach(),c.__Geometry=c.__geometry(),c._trigger({type:"reposition",event:a,helper:{geo:c.__Geometry}})),c},show:function(a){return this.open(a)},status:function(){return{destroyed:this.__destroyed,enabled:this.__enabled,open:"closed"!==this.__state,state:this.__state}},triggerHandler:function(){return this.__destroyed?this.__destroyError():this.__$emitterPublic.triggerHandler.apply(this.__$emitterPublic,Array.prototype.slice.apply(arguments)),this}},a.fn.tooltipster=function(){var b=Array.prototype.slice.apply(arguments),c="You are using a single HTML element as content for several tooltips. You probably want to set the contentCloning option to TRUE.";if(0===this.length)return this;if("string"==typeof b[0]){var d="#*$~&";return this.each(function(){var e=a(this).data("tooltipster-ns"),f=e?a(this).data(e[0]):null;if(!f)throw new Error("You called Tooltipster's \""+b[0]+'" method on an uninitialized element');if("function"!=typeof f[b[0]])throw new Error('Unknown method "'+b[0]+'"');this.length>1&&"content"==b[0]&&(b[1]instanceof a||"object"==typeof b[1]&&null!=b[1]&&b[1].tagName)&&!f.__options.contentCloning&&f.__options.debug&&console.log(c);var g=f[b[0]](b[1],b[2]);return g!==f||"instance"===b[0]?(d=g,!1):void 0}),"#*$~&"!==d?d:this}a.tooltipster.__instancesLatestArr=[];var e=b[0]&&void 0!==b[0].multiple,g=e&&b[0].multiple||!e&&f.multiple,h=b[0]&&void 0!==b[0].content,i=h&&b[0].content||!h&&f.content,j=b[0]&&void 0!==b[0].contentCloning,k=j&&b[0].contentCloning||!j&&f.contentCloning,l=b[0]&&void 0!==b[0].debug,m=l&&b[0].debug||!l&&f.debug;return this.length>1&&(i instanceof a||"object"==typeof i&&null!=i&&i.tagName)&&!k&&m&&console.log(c),this.each(function(){var c=!1,d=a(this),e=d.data("tooltipster-ns"),f=null;e?g?c=!0:m&&(console.log("Tooltipster: one or more tooltips are already attached to the element below. Ignoring."),console.log(this)):c=!0,c&&(f=new a.Tooltipster(this,b[0]),e||(e=[]),e.push(f.__namespace),d.data("tooltipster-ns",e),d.data(f.__namespace,f),f.__options.functionInit&&f.__options.functionInit.call(f,f,{origin:this}),f._trigger("init")),a.tooltipster.__instancesLatestArr.push(f)}),this},b.prototype={__init:function(b){this.__$tooltip=b,this.__$tooltip.css({left:0,overflow:"hidden",position:"absolute",top:0}).find(".tooltipster-content").css("overflow","auto"),this.$container=a('<div class="tooltipster-ruler"></div>').append(this.__$tooltip).appendTo(h.window.document.body)},__forceRedraw:function(){var a=this.__$tooltip.parent();this.__$tooltip.detach(),this.__$tooltip.appendTo(a)},constrain:function(a,b){return this.constraints={width:a,height:b},this.__$tooltip.css({display:"block",height:"",overflow:"auto",width:a}),this},destroy:function(){this.__$tooltip.detach().find(".tooltipster-content").css({display:"",overflow:""}),this.$container.remove()},free:function(){return this.constraints=null,this.__$tooltip.css({display:"",height:"",overflow:"visible",width:""}),this},measure:function(){this.__forceRedraw();var a=this.__$tooltip[0].getBoundingClientRect(),b={size:{height:a.height||a.bottom-a.top,width:a.width||a.right-a.left}};if(this.constraints){var c=this.__$tooltip.find(".tooltipster-content"),d=this.__$tooltip.outerHeight(),e=c[0].getBoundingClientRect(),f={height:d<=this.constraints.height,width:a.width<=this.constraints.width&&e.width>=c[0].scrollWidth-1};b.fits=f.height&&f.width}return h.IE&&h.IE<=11&&b.size.width!==h.window.document.documentElement.clientWidth&&(b.size.width=Math.ceil(b.size.width)+1),b}};var j=navigator.userAgent.toLowerCase();-1!=j.indexOf("msie")?h.IE=parseInt(j.split("msie")[1]):-1!==j.toLowerCase().indexOf("trident")&&-1!==j.indexOf(" rv:11")?h.IE=11:-1!=j.toLowerCase().indexOf("edge/")&&(h.IE=parseInt(j.toLowerCase().split("edge/")[1]));var k="tooltipster.sideTip";return a.tooltipster._plugin({name:k,instance:{__defaults:function(){return{arrow:!0,distance:6,functionPosition:null,maxWidth:null,minIntersection:16,minWidth:0,position:null,side:"top",viewportAware:!0}},__init:function(a){var b=this;b.__instance=a,b.__namespace="tooltipster-sideTip-"+Math.round(1e6*Math.random()),b.__previousState="closed",b.__options,b.__optionsFormat(),b.__instance._on("state."+b.__namespace,function(a){"closed"==a.state?b.__close():"appearing"==a.state&&"closed"==b.__previousState&&b.__create(),b.__previousState=a.state}),b.__instance._on("options."+b.__namespace,function(){b.__optionsFormat()}),b.__instance._on("reposition."+b.__namespace,function(a){b.__reposition(a.event,a.helper)})},__close:function(){this.__instance.content()instanceof a&&this.__instance.content().detach(),this.__instance._$tooltip.remove(),this.__instance._$tooltip=null},__create:function(){var b=a('<div class="tooltipster-base tooltipster-sidetip"><div class="tooltipster-box"><div class="tooltipster-content"></div></div><div class="tooltipster-arrow"><div class="tooltipster-arrow-uncropped"><div class="tooltipster-arrow-border"></div><div class="tooltipster-arrow-background"></div></div></div></div>');this.__options.arrow||b.find(".tooltipster-box").css("margin",0).end().find(".tooltipster-arrow").hide(),this.__options.minWidth&&b.css("min-width",this.__options.minWidth+"px"),this.__options.maxWidth&&b.css("max-width",this.__options.maxWidth+"px"),
this.__instance._$tooltip=b,this.__instance._trigger("created")},__destroy:function(){this.__instance._off("."+self.__namespace)},__optionsFormat:function(){var b=this;if(b.__options=b.__instance._optionsExtract(k,b.__defaults()),b.__options.position&&(b.__options.side=b.__options.position),"object"!=typeof b.__options.distance&&(b.__options.distance=[b.__options.distance]),b.__options.distance.length<4&&(void 0===b.__options.distance[1]&&(b.__options.distance[1]=b.__options.distance[0]),void 0===b.__options.distance[2]&&(b.__options.distance[2]=b.__options.distance[0]),void 0===b.__options.distance[3]&&(b.__options.distance[3]=b.__options.distance[1]),b.__options.distance={top:b.__options.distance[0],right:b.__options.distance[1],bottom:b.__options.distance[2],left:b.__options.distance[3]}),"string"==typeof b.__options.side){var c={top:"bottom",right:"left",bottom:"top",left:"right"};b.__options.side=[b.__options.side,c[b.__options.side]],"left"==b.__options.side[0]||"right"==b.__options.side[0]?b.__options.side.push("top","bottom"):b.__options.side.push("right","left")}6===a.tooltipster._env.IE&&b.__options.arrow!==!0&&(b.__options.arrow=!1)},__reposition:function(b,c){var d,e=this,f=e.__targetFind(c),g=[];e.__instance._$tooltip.detach();var h=e.__instance._$tooltip.clone(),i=a.tooltipster._getRuler(h),j=!1,k=e.__instance.option("animation");switch(k&&h.removeClass("tooltipster-"+k),a.each(["window","document"],function(d,k){var l=null;if(e.__instance._trigger({container:k,helper:c,satisfied:j,takeTest:function(a){l=a},results:g,type:"positionTest"}),1==l||0!=l&&0==j&&("window"!=k||e.__options.viewportAware))for(var d=0;d<e.__options.side.length;d++){var m={horizontal:0,vertical:0},n=e.__options.side[d];"top"==n||"bottom"==n?m.vertical=e.__options.distance[n]:m.horizontal=e.__options.distance[n],e.__sideChange(h,n),a.each(["natural","constrained"],function(a,d){if(l=null,e.__instance._trigger({container:k,event:b,helper:c,mode:d,results:g,satisfied:j,side:n,takeTest:function(a){l=a},type:"positionTest"}),1==l||0!=l&&0==j){var h={container:k,distance:m,fits:null,mode:d,outerSize:null,side:n,size:null,target:f[n],whole:null},o="natural"==d?i.free():i.constrain(c.geo.available[k][n].width-m.horizontal,c.geo.available[k][n].height-m.vertical),p=o.measure();if(h.size=p.size,h.outerSize={height:p.size.height+m.vertical,width:p.size.width+m.horizontal},"natural"==d?c.geo.available[k][n].width>=h.outerSize.width&&c.geo.available[k][n].height>=h.outerSize.height?h.fits=!0:h.fits=!1:h.fits=p.fits,"window"==k&&(h.fits?"top"==n||"bottom"==n?h.whole=c.geo.origin.windowOffset.right>=e.__options.minIntersection&&c.geo.window.size.width-c.geo.origin.windowOffset.left>=e.__options.minIntersection:h.whole=c.geo.origin.windowOffset.bottom>=e.__options.minIntersection&&c.geo.window.size.height-c.geo.origin.windowOffset.top>=e.__options.minIntersection:h.whole=!1),g.push(h),h.whole)j=!0;else if("natural"==h.mode&&(h.fits||h.size.width<=c.geo.available[k][n].width))return!1}})}}),e.__instance._trigger({edit:function(a){g=a},event:b,helper:c,results:g,type:"positionTested"}),g.sort(function(a,b){if(a.whole&&!b.whole)return-1;if(!a.whole&&b.whole)return 1;if(a.whole&&b.whole){var c=e.__options.side.indexOf(a.side),d=e.__options.side.indexOf(b.side);return d>c?-1:c>d?1:"natural"==a.mode?-1:1}if(a.fits&&!b.fits)return-1;if(!a.fits&&b.fits)return 1;if(a.fits&&b.fits){var c=e.__options.side.indexOf(a.side),d=e.__options.side.indexOf(b.side);return d>c?-1:c>d?1:"natural"==a.mode?-1:1}return"document"==a.container&&"bottom"==a.side&&"natural"==a.mode?-1:1}),d=g[0],d.coord={},d.side){case"left":case"right":d.coord.top=Math.floor(d.target-d.size.height/2);break;case"bottom":case"top":d.coord.left=Math.floor(d.target-d.size.width/2)}switch(d.side){case"left":d.coord.left=c.geo.origin.windowOffset.left-d.outerSize.width;break;case"right":d.coord.left=c.geo.origin.windowOffset.right+d.distance.horizontal;break;case"top":d.coord.top=c.geo.origin.windowOffset.top-d.outerSize.height;break;case"bottom":d.coord.top=c.geo.origin.windowOffset.bottom+d.distance.vertical}"window"==d.container?"top"==d.side||"bottom"==d.side?d.coord.left<0?c.geo.origin.windowOffset.right-this.__options.minIntersection>=0?d.coord.left=0:d.coord.left=c.geo.origin.windowOffset.right-this.__options.minIntersection-1:d.coord.left>c.geo.window.size.width-d.size.width&&(c.geo.origin.windowOffset.left+this.__options.minIntersection<=c.geo.window.size.width?d.coord.left=c.geo.window.size.width-d.size.width:d.coord.left=c.geo.origin.windowOffset.left+this.__options.minIntersection+1-d.size.width):d.coord.top<0?c.geo.origin.windowOffset.bottom-this.__options.minIntersection>=0?d.coord.top=0:d.coord.top=c.geo.origin.windowOffset.bottom-this.__options.minIntersection-1:d.coord.top>c.geo.window.size.height-d.size.height&&(c.geo.origin.windowOffset.top+this.__options.minIntersection<=c.geo.window.size.height?d.coord.top=c.geo.window.size.height-d.size.height:d.coord.top=c.geo.origin.windowOffset.top+this.__options.minIntersection+1-d.size.height):(d.coord.left>c.geo.window.size.width-d.size.width&&(d.coord.left=c.geo.window.size.width-d.size.width),d.coord.left<0&&(d.coord.left=0)),e.__sideChange(h,d.side),c.tooltipClone=h[0],c.tooltipParent=e.__instance.option("parent").parent[0],c.mode=d.mode,c.whole=d.whole,c.origin=e.__instance._$origin[0],c.tooltip=e.__instance._$tooltip[0],delete d.container,delete d.fits,delete d.mode,delete d.outerSize,delete d.whole,d.distance=d.distance.horizontal||d.distance.vertical;var l=a.extend(!0,{},d);if(e.__instance._trigger({edit:function(a){d=a},event:b,helper:c,position:l,type:"position"}),e.__options.functionPosition){var m=e.__options.functionPosition.call(e,e.__instance,c,l);m&&(d=m)}i.destroy();var n,o;"top"==d.side||"bottom"==d.side?(n={prop:"left",val:d.target-d.coord.left},o=d.size.width-this.__options.minIntersection):(n={prop:"top",val:d.target-d.coord.top},o=d.size.height-this.__options.minIntersection),n.val<this.__options.minIntersection?n.val=this.__options.minIntersection:n.val>o&&(n.val=o);var p;p=c.geo.origin.fixedLineage?c.geo.origin.windowOffset:{left:c.geo.origin.windowOffset.left+c.geo.window.scroll.left,top:c.geo.origin.windowOffset.top+c.geo.window.scroll.top},d.coord={left:p.left+(d.coord.left-c.geo.origin.windowOffset.left),top:p.top+(d.coord.top-c.geo.origin.windowOffset.top)},e.__sideChange(e.__instance._$tooltip,d.side),c.geo.origin.fixedLineage?e.__instance._$tooltip.css("position","fixed"):e.__instance._$tooltip.css("position",""),e.__instance._$tooltip.css({left:d.coord.left,top:d.coord.top,height:d.size.height,width:d.size.width}).find(".tooltipster-arrow").css({left:"",top:""}).css(n.prop,n.val),e.__instance._$tooltip.appendTo(e.__instance.option("parent")),e.__instance._trigger({type:"repositioned",event:b,position:d})},__sideChange:function(a,b){a.removeClass("tooltipster-bottom").removeClass("tooltipster-left").removeClass("tooltipster-right").removeClass("tooltipster-top").addClass("tooltipster-"+b)},__targetFind:function(a){var b={},c=this.__instance._$origin[0].getClientRects();if(c.length>1){var d=this.__instance._$origin.css("opacity");1==d&&(this.__instance._$origin.css("opacity",.99),c=this.__instance._$origin[0].getClientRects(),this.__instance._$origin.css("opacity",1))}if(c.length<2)b.top=Math.floor(a.geo.origin.windowOffset.left+a.geo.origin.size.width/2),b.bottom=b.top,b.left=Math.floor(a.geo.origin.windowOffset.top+a.geo.origin.size.height/2),b.right=b.left;else{var e=c[0];b.top=Math.floor(e.left+(e.right-e.left)/2),e=c.length>2?c[Math.ceil(c.length/2)-1]:c[0],b.right=Math.floor(e.top+(e.bottom-e.top)/2),e=c[c.length-1],b.bottom=Math.floor(e.left+(e.right-e.left)/2),e=c.length>2?c[Math.ceil((c.length+1)/2)-1]:c[c.length-1],b.left=Math.floor(e.top+(e.bottom-e.top)/2)}return b}}}),a});

/* == jquery mousewheel plugin == Version: 3.1.13, License: MIT License (MIT) */
!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?module.exports=a:a(jQuery)}(function(a){function b(b){var g=b||window.event,h=i.call(arguments,1),j=0,l=0,m=0,n=0,o=0,p=0;if(b=a.event.fix(g),b.type="mousewheel","detail"in g&&(m=-1*g.detail),"wheelDelta"in g&&(m=g.wheelDelta),"wheelDeltaY"in g&&(m=g.wheelDeltaY),"wheelDeltaX"in g&&(l=-1*g.wheelDeltaX),"axis"in g&&g.axis===g.HORIZONTAL_AXIS&&(l=-1*m,m=0),j=0===m?l:m,"deltaY"in g&&(m=-1*g.deltaY,j=m),"deltaX"in g&&(l=g.deltaX,0===m&&(j=-1*l)),0!==m||0!==l){if(1===g.deltaMode){var q=a.data(this,"mousewheel-line-height");j*=q,m*=q,l*=q}else if(2===g.deltaMode){var r=a.data(this,"mousewheel-page-height");j*=r,m*=r,l*=r}if(n=Math.max(Math.abs(m),Math.abs(l)),(!f||f>n)&&(f=n,d(g,n)&&(f/=40)),d(g,n)&&(j/=40,l/=40,m/=40),j=Math[j>=1?"floor":"ceil"](j/f),l=Math[l>=1?"floor":"ceil"](l/f),m=Math[m>=1?"floor":"ceil"](m/f),k.settings.normalizeOffset&&this.getBoundingClientRect){var s=this.getBoundingClientRect();o=b.clientX-s.left,p=b.clientY-s.top}return b.deltaX=l,b.deltaY=m,b.deltaFactor=f,b.offsetX=o,b.offsetY=p,b.deltaMode=0,h.unshift(b,j,l,m),e&&clearTimeout(e),e=setTimeout(c,200),(a.event.dispatch||a.event.handle).apply(this,h)}}function c(){f=null}function d(a,b){return k.settings.adjustOldDeltas&&"mousewheel"===a.type&&b%120===0}var e,f,g=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],h="onwheel"in document||document.documentMode>=9?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"],i=Array.prototype.slice;if(a.event.fixHooks)for(var j=g.length;j;)a.event.fixHooks[g[--j]]=a.event.mouseHooks;var k=a.event.special.mousewheel={version:"3.1.12",setup:function(){if(this.addEventListener)for(var c=h.length;c;)this.addEventListener(h[--c],b,!1);else this.onmousewheel=b;a.data(this,"mousewheel-line-height",k.getLineHeight(this)),a.data(this,"mousewheel-page-height",k.getPageHeight(this))},teardown:function(){if(this.removeEventListener)for(var c=h.length;c;)this.removeEventListener(h[--c],b,!1);else this.onmousewheel=null;a.removeData(this,"mousewheel-line-height"),a.removeData(this,"mousewheel-page-height")},getLineHeight:function(b){var c=a(b),d=c["offsetParent"in a.fn?"offsetParent":"parent"]();return d.length||(d=a("body")),parseInt(d.css("fontSize"),10)||parseInt(c.css("fontSize"),10)||16},getPageHeight:function(b){return a(b).height()},settings:{adjustOldDeltas:!0,normalizeOffset:!0}};a.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})});!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof exports?module.exports=a:a(jQuery)}(function(a){function b(b){var g=b||window.event,h=i.call(arguments,1),j=0,l=0,m=0,n=0,o=0,p=0;if(b=a.event.fix(g),b.type="mousewheel","detail"in g&&(m=-1*g.detail),"wheelDelta"in g&&(m=g.wheelDelta),"wheelDeltaY"in g&&(m=g.wheelDeltaY),"wheelDeltaX"in g&&(l=-1*g.wheelDeltaX),"axis"in g&&g.axis===g.HORIZONTAL_AXIS&&(l=-1*m,m=0),j=0===m?l:m,"deltaY"in g&&(m=-1*g.deltaY,j=m),"deltaX"in g&&(l=g.deltaX,0===m&&(j=-1*l)),0!==m||0!==l){if(1===g.deltaMode){var q=a.data(this,"mousewheel-line-height");j*=q,m*=q,l*=q}else if(2===g.deltaMode){var r=a.data(this,"mousewheel-page-height");j*=r,m*=r,l*=r}if(n=Math.max(Math.abs(m),Math.abs(l)),(!f||f>n)&&(f=n,d(g,n)&&(f/=40)),d(g,n)&&(j/=40,l/=40,m/=40),j=Math[j>=1?"floor":"ceil"](j/f),l=Math[l>=1?"floor":"ceil"](l/f),m=Math[m>=1?"floor":"ceil"](m/f),k.settings.normalizeOffset&&this.getBoundingClientRect){var s=this.getBoundingClientRect();o=b.clientX-s.left,p=b.clientY-s.top}return b.deltaX=l,b.deltaY=m,b.deltaFactor=f,b.offsetX=o,b.offsetY=p,b.deltaMode=0,h.unshift(b,j,l,m),e&&clearTimeout(e),e=setTimeout(c,200),(a.event.dispatch||a.event.handle).apply(this,h)}}function c(){f=null}function d(a,b){return k.settings.adjustOldDeltas&&"mousewheel"===a.type&&b%120===0}var e,f,g=["wheel","mousewheel","DOMMouseScroll","MozMousePixelScroll"],h="onwheel"in document||document.documentMode>=9?["wheel"]:["mousewheel","DomMouseScroll","MozMousePixelScroll"],i=Array.prototype.slice;if(a.event.fixHooks)for(var j=g.length;j;)a.event.fixHooks[g[--j]]=a.event.mouseHooks;var k=a.event.special.mousewheel={version:"3.1.12",setup:function(){if(this.addEventListener)for(var c=h.length;c;)this.addEventListener(h[--c],b,!1);else this.onmousewheel=b;a.data(this,"mousewheel-line-height",k.getLineHeight(this)),a.data(this,"mousewheel-page-height",k.getPageHeight(this))},teardown:function(){if(this.removeEventListener)for(var c=h.length;c;)this.removeEventListener(h[--c],b,!1);else this.onmousewheel=null;a.removeData(this,"mousewheel-line-height"),a.removeData(this,"mousewheel-page-height")},getLineHeight:function(b){var c=a(b),d=c["offsetParent"in a.fn?"offsetParent":"parent"]();return d.length||(d=a("body")),parseInt(d.css("fontSize"),10)||parseInt(c.css("fontSize"),10)||16},getPageHeight:function(b){return a(b).height()},settings:{adjustOldDeltas:!0,normalizeOffset:!0}};a.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})});
/* == malihu jquery custom scrollbar plugin == Version: 3.1.5, License: MIT License (MIT) */
!function(e){"function"==typeof define&&define.amd?define(["jquery"],e):"undefined"!=typeof module&&module.exports?module.exports=e:e(jQuery,window,document)}(function(e){!function(t){var o="function"==typeof define&&define.amd,a="undefined"!=typeof module&&module.exports,n="https:"==document.location.protocol?"https:":"http:",i="cdnjs.cloudflare.com/ajax/libs/jquery-mousewheel/3.1.13/jquery.mousewheel.min.js";o||(a?require("jquery-mousewheel")(e):e.event.special.mousewheel||e("head").append(decodeURI("%3Cscript src="+n+"//"+i+"%3E%3C/script%3E"))),t()}(function(){var t,o="mCustomScrollbar",a="mCS",n=".mCustomScrollbar",i={setTop:0,setLeft:0,axis:"y",scrollbarPosition:"inside",scrollInertia:950,autoDraggerLength:!0,alwaysShowScrollbar:0,snapOffset:0,mouseWheel:{enable:!0,scrollAmount:"auto",axis:"y",deltaFactor:"auto",disableOver:["select","option","keygen","datalist","textarea"]},scrollButtons:{scrollType:"stepless",scrollAmount:"auto"},keyboard:{enable:!0,scrollType:"stepless",scrollAmount:"auto"},contentTouchScroll:25,documentTouchScroll:!0,advanced:{autoScrollOnFocus:"input,textarea,select,button,datalist,keygen,a[tabindex],area,object,[contenteditable='true']",updateOnContentResize:!0,updateOnImageLoad:"auto",autoUpdateTimeout:60},theme:"light",callbacks:{onTotalScrollOffset:0,onTotalScrollBackOffset:0,alwaysTriggerOffsets:!0}},r=0,l={},s=window.attachEvent&&!window.addEventListener?1:0,c=!1,d=["mCSB_dragger_onDrag","mCSB_scrollTools_onDrag","mCS_img_loaded","mCS_disabled","mCS_destroyed","mCS_no_scrollbar","mCS-autoHide","mCS-dir-rtl","mCS_no_scrollbar_y","mCS_no_scrollbar_x","mCS_y_hidden","mCS_x_hidden","mCSB_draggerContainer","mCSB_buttonUp","mCSB_buttonDown","mCSB_buttonLeft","mCSB_buttonRight"],u={init:function(t){var t=e.extend(!0,{},i,t),o=f.call(this);if(t.live){var s=t.liveSelector||this.selector||n,c=e(s);if("off"===t.live)return void m(s);l[s]=setTimeout(function(){c.mCustomScrollbar(t),"once"===t.live&&c.length&&m(s)},500)}else m(s);return t.setWidth=t.set_width?t.set_width:t.setWidth,t.setHeight=t.set_height?t.set_height:t.setHeight,t.axis=t.horizontalScroll?"x":p(t.axis),t.scrollInertia=t.scrollInertia>0&&t.scrollInertia<17?17:t.scrollInertia,"object"!=typeof t.mouseWheel&&1==t.mouseWheel&&(t.mouseWheel={enable:!0,scrollAmount:"auto",axis:"y",preventDefault:!1,deltaFactor:"auto",normalizeDelta:!1,invert:!1}),t.mouseWheel.scrollAmount=t.mouseWheelPixels?t.mouseWheelPixels:t.mouseWheel.scrollAmount,t.mouseWheel.normalizeDelta=t.advanced.normalizeMouseWheelDelta?t.advanced.normalizeMouseWheelDelta:t.mouseWheel.normalizeDelta,t.scrollButtons.scrollType=g(t.scrollButtons.scrollType),h(t),e(o).each(function(){var o=e(this);if(!o.data(a)){o.data(a,{idx:++r,opt:t,scrollRatio:{y:null,x:null},overflowed:null,contentReset:{y:null,x:null},bindEvents:!1,tweenRunning:!1,sequential:{},langDir:o.css("direction"),cbOffsets:null,trigger:null,poll:{size:{o:0,n:0},img:{o:0,n:0},change:{o:0,n:0}}});var n=o.data(a),i=n.opt,l=o.data("mcs-axis"),s=o.data("mcs-scrollbar-position"),c=o.data("mcs-theme");l&&(i.axis=l),s&&(i.scrollbarPosition=s),c&&(i.theme=c,h(i)),v.call(this),n&&i.callbacks.onCreate&&"function"==typeof i.callbacks.onCreate&&i.callbacks.onCreate.call(this),e("#mCSB_"+n.idx+"_container img:not(."+d[2]+")").addClass(d[2]),u.update.call(null,o)}})},update:function(t,o){var n=t||f.call(this);return e(n).each(function(){var t=e(this);if(t.data(a)){var n=t.data(a),i=n.opt,r=e("#mCSB_"+n.idx+"_container"),l=e("#mCSB_"+n.idx),s=[e("#mCSB_"+n.idx+"_dragger_vertical"),e("#mCSB_"+n.idx+"_dragger_horizontal")];if(!r.length)return;n.tweenRunning&&Q(t),o&&n&&i.callbacks.onBeforeUpdate&&"function"==typeof i.callbacks.onBeforeUpdate&&i.callbacks.onBeforeUpdate.call(this),t.hasClass(d[3])&&t.removeClass(d[3]),t.hasClass(d[4])&&t.removeClass(d[4]),l.css("max-height","none"),l.height()!==t.height()&&l.css("max-height",t.height()),_.call(this),"y"===i.axis||i.advanced.autoExpandHorizontalScroll||r.css("width",x(r)),n.overflowed=y.call(this),M.call(this),i.autoDraggerLength&&S.call(this),b.call(this),T.call(this);var c=[Math.abs(r[0].offsetTop),Math.abs(r[0].offsetLeft)];"x"!==i.axis&&(n.overflowed[0]?s[0].height()>s[0].parent().height()?B.call(this):(G(t,c[0].toString(),{dir:"y",dur:0,overwrite:"none"}),n.contentReset.y=null):(B.call(this),"y"===i.axis?k.call(this):"yx"===i.axis&&n.overflowed[1]&&G(t,c[1].toString(),{dir:"x",dur:0,overwrite:"none"}))),"y"!==i.axis&&(n.overflowed[1]?s[1].width()>s[1].parent().width()?B.call(this):(G(t,c[1].toString(),{dir:"x",dur:0,overwrite:"none"}),n.contentReset.x=null):(B.call(this),"x"===i.axis?k.call(this):"yx"===i.axis&&n.overflowed[0]&&G(t,c[0].toString(),{dir:"y",dur:0,overwrite:"none"}))),o&&n&&(2===o&&i.callbacks.onImageLoad&&"function"==typeof i.callbacks.onImageLoad?i.callbacks.onImageLoad.call(this):3===o&&i.callbacks.onSelectorChange&&"function"==typeof i.callbacks.onSelectorChange?i.callbacks.onSelectorChange.call(this):i.callbacks.onUpdate&&"function"==typeof i.callbacks.onUpdate&&i.callbacks.onUpdate.call(this)),N.call(this)}})},scrollTo:function(t,o){if("undefined"!=typeof t&&null!=t){var n=f.call(this);return e(n).each(function(){var n=e(this);if(n.data(a)){var i=n.data(a),r=i.opt,l={trigger:"external",scrollInertia:r.scrollInertia,scrollEasing:"mcsEaseInOut",moveDragger:!1,timeout:60,callbacks:!0,onStart:!0,onUpdate:!0,onComplete:!0},s=e.extend(!0,{},l,o),c=Y.call(this,t),d=s.scrollInertia>0&&s.scrollInertia<17?17:s.scrollInertia;c[0]=X.call(this,c[0],"y"),c[1]=X.call(this,c[1],"x"),s.moveDragger&&(c[0]*=i.scrollRatio.y,c[1]*=i.scrollRatio.x),s.dur=ne()?0:d,setTimeout(function(){null!==c[0]&&"undefined"!=typeof c[0]&&"x"!==r.axis&&i.overflowed[0]&&(s.dir="y",s.overwrite="all",G(n,c[0].toString(),s)),null!==c[1]&&"undefined"!=typeof c[1]&&"y"!==r.axis&&i.overflowed[1]&&(s.dir="x",s.overwrite="none",G(n,c[1].toString(),s))},s.timeout)}})}},stop:function(){var t=f.call(this);return e(t).each(function(){var t=e(this);t.data(a)&&Q(t)})},disable:function(t){var o=f.call(this);return e(o).each(function(){var o=e(this);if(o.data(a)){o.data(a);N.call(this,"remove"),k.call(this),t&&B.call(this),M.call(this,!0),o.addClass(d[3])}})},destroy:function(){var t=f.call(this);return e(t).each(function(){var n=e(this);if(n.data(a)){var i=n.data(a),r=i.opt,l=e("#mCSB_"+i.idx),s=e("#mCSB_"+i.idx+"_container"),c=e(".mCSB_"+i.idx+"_scrollbar");r.live&&m(r.liveSelector||e(t).selector),N.call(this,"remove"),k.call(this),B.call(this),n.removeData(a),$(this,"mcs"),c.remove(),s.find("img."+d[2]).removeClass(d[2]),l.replaceWith(s.contents()),n.removeClass(o+" _"+a+"_"+i.idx+" "+d[6]+" "+d[7]+" "+d[5]+" "+d[3]).addClass(d[4])}})}},f=function(){return"object"!=typeof e(this)||e(this).length<1?n:this},h=function(t){var o=["rounded","rounded-dark","rounded-dots","rounded-dots-dark"],a=["rounded-dots","rounded-dots-dark","3d","3d-dark","3d-thick","3d-thick-dark","inset","inset-dark","inset-2","inset-2-dark","inset-3","inset-3-dark"],n=["minimal","minimal-dark"],i=["minimal","minimal-dark"],r=["minimal","minimal-dark"];t.autoDraggerLength=e.inArray(t.theme,o)>-1?!1:t.autoDraggerLength,t.autoExpandScrollbar=e.inArray(t.theme,a)>-1?!1:t.autoExpandScrollbar,t.scrollButtons.enable=e.inArray(t.theme,n)>-1?!1:t.scrollButtons.enable,t.autoHideScrollbar=e.inArray(t.theme,i)>-1?!0:t.autoHideScrollbar,t.scrollbarPosition=e.inArray(t.theme,r)>-1?"outside":t.scrollbarPosition},m=function(e){l[e]&&(clearTimeout(l[e]),$(l,e))},p=function(e){return"yx"===e||"xy"===e||"auto"===e?"yx":"x"===e||"horizontal"===e?"x":"y"},g=function(e){return"stepped"===e||"pixels"===e||"step"===e||"click"===e?"stepped":"stepless"},v=function(){var t=e(this),n=t.data(a),i=n.opt,r=i.autoExpandScrollbar?" "+d[1]+"_expand":"",l=["<div id='mCSB_"+n.idx+"_scrollbar_vertical' class='mCSB_scrollTools mCSB_"+n.idx+"_scrollbar mCS-"+i.theme+" mCSB_scrollTools_vertical"+r+"'><div class='"+d[12]+"'><div id='mCSB_"+n.idx+"_dragger_vertical' class='mCSB_dragger' style='position:absolute;'><div class='mCSB_dragger_bar' /></div><div class='mCSB_draggerRail' /></div></div>","<div id='mCSB_"+n.idx+"_scrollbar_horizontal' class='mCSB_scrollTools mCSB_"+n.idx+"_scrollbar mCS-"+i.theme+" mCSB_scrollTools_horizontal"+r+"'><div class='"+d[12]+"'><div id='mCSB_"+n.idx+"_dragger_horizontal' class='mCSB_dragger' style='position:absolute;'><div class='mCSB_dragger_bar' /></div><div class='mCSB_draggerRail' /></div></div>"],s="yx"===i.axis?"mCSB_vertical_horizontal":"x"===i.axis?"mCSB_horizontal":"mCSB_vertical",c="yx"===i.axis?l[0]+l[1]:"x"===i.axis?l[1]:l[0],u="yx"===i.axis?"<div id='mCSB_"+n.idx+"_container_wrapper' class='mCSB_container_wrapper' />":"",f=i.autoHideScrollbar?" "+d[6]:"",h="x"!==i.axis&&"rtl"===n.langDir?" "+d[7]:"";i.setWidth&&t.css("width",i.setWidth),i.setHeight&&t.css("height",i.setHeight),i.setLeft="y"!==i.axis&&"rtl"===n.langDir?"989999px":i.setLeft,t.addClass(o+" _"+a+"_"+n.idx+f+h).wrapInner("<div id='mCSB_"+n.idx+"' class='mCustomScrollBox mCS-"+i.theme+" "+s+"'><div id='mCSB_"+n.idx+"_container' class='mCSB_container' style='position:relative; top:"+i.setTop+"; left:"+i.setLeft+";' dir='"+n.langDir+"' /></div>");var m=e("#mCSB_"+n.idx),p=e("#mCSB_"+n.idx+"_container");"y"===i.axis||i.advanced.autoExpandHorizontalScroll||p.css("width",x(p)),"outside"===i.scrollbarPosition?("static"===t.css("position")&&t.css("position","relative"),t.css("overflow","visible"),m.addClass("mCSB_outside").after(c)):(m.addClass("mCSB_inside").append(c),p.wrap(u)),w.call(this);var g=[e("#mCSB_"+n.idx+"_dragger_vertical"),e("#mCSB_"+n.idx+"_dragger_horizontal")];g[0].css("min-height",g[0].height()),g[1].css("min-width",g[1].width())},x=function(t){var o=[t[0].scrollWidth,Math.max.apply(Math,t.children().map(function(){return e(this).outerWidth(!0)}).get())],a=t.parent().width();return o[0]>a?o[0]:o[1]>a?o[1]:"100%"},_=function(){var t=e(this),o=t.data(a),n=o.opt,i=e("#mCSB_"+o.idx+"_container");if(n.advanced.autoExpandHorizontalScroll&&"y"!==n.axis){i.css({width:"auto","min-width":0,"overflow-x":"scroll"});var r=Math.ceil(i[0].scrollWidth);3===n.advanced.autoExpandHorizontalScroll||2!==n.advanced.autoExpandHorizontalScroll&&r>i.parent().width()?i.css({width:r,"min-width":"100%","overflow-x":"inherit"}):i.css({"overflow-x":"inherit",position:"absolute"}).wrap("<div class='mCSB_h_wrapper' style='position:relative; left:0; width:999999px;' />").css({width:Math.ceil(i[0].getBoundingClientRect().right+.4)-Math.floor(i[0].getBoundingClientRect().left),"min-width":"100%",position:"relative"}).unwrap()}},w=function(){var t=e(this),o=t.data(a),n=o.opt,i=e(".mCSB_"+o.idx+"_scrollbar:first"),r=oe(n.scrollButtons.tabindex)?"tabindex='"+n.scrollButtons.tabindex+"'":"",l=["<a href='#' class='"+d[13]+"' "+r+" />","<a href='#' class='"+d[14]+"' "+r+" />","<a href='#' class='"+d[15]+"' "+r+" />","<a href='#' class='"+d[16]+"' "+r+" />"],s=["x"===n.axis?l[2]:l[0],"x"===n.axis?l[3]:l[1],l[2],l[3]];n.scrollButtons.enable&&i.prepend(s[0]).append(s[1]).next(".mCSB_scrollTools").prepend(s[2]).append(s[3])},S=function(){var t=e(this),o=t.data(a),n=e("#mCSB_"+o.idx),i=e("#mCSB_"+o.idx+"_container"),r=[e("#mCSB_"+o.idx+"_dragger_vertical"),e("#mCSB_"+o.idx+"_dragger_horizontal")],l=[n.height()/i.outerHeight(!1),n.width()/i.outerWidth(!1)],c=[parseInt(r[0].css("min-height")),Math.round(l[0]*r[0].parent().height()),parseInt(r[1].css("min-width")),Math.round(l[1]*r[1].parent().width())],d=s&&c[1]<c[0]?c[0]:c[1],u=s&&c[3]<c[2]?c[2]:c[3];r[0].css({height:d,"max-height":r[0].parent().height()-10}).find(".mCSB_dragger_bar").css({"line-height":c[0]+"px"}),r[1].css({width:u,"max-width":r[1].parent().width()-10})},b=function(){var t=e(this),o=t.data(a),n=e("#mCSB_"+o.idx),i=e("#mCSB_"+o.idx+"_container"),r=[e("#mCSB_"+o.idx+"_dragger_vertical"),e("#mCSB_"+o.idx+"_dragger_horizontal")],l=[i.outerHeight(!1)-n.height(),i.outerWidth(!1)-n.width()],s=[l[0]/(r[0].parent().height()-r[0].height()),l[1]/(r[1].parent().width()-r[1].width())];o.scrollRatio={y:s[0],x:s[1]}},C=function(e,t,o){var a=o?d[0]+"_expanded":"",n=e.closest(".mCSB_scrollTools");"active"===t?(e.toggleClass(d[0]+" "+a),n.toggleClass(d[1]),e[0]._draggable=e[0]._draggable?0:1):e[0]._draggable||("hide"===t?(e.removeClass(d[0]),n.removeClass(d[1])):(e.addClass(d[0]),n.addClass(d[1])))},y=function(){var t=e(this),o=t.data(a),n=e("#mCSB_"+o.idx),i=e("#mCSB_"+o.idx+"_container"),r=null==o.overflowed?i.height():i.outerHeight(!1),l=null==o.overflowed?i.width():i.outerWidth(!1),s=i[0].scrollHeight,c=i[0].scrollWidth;return s>r&&(r=s),c>l&&(l=c),[r>n.height(),l>n.width()]},B=function(){var t=e(this),o=t.data(a),n=o.opt,i=e("#mCSB_"+o.idx),r=e("#mCSB_"+o.idx+"_container"),l=[e("#mCSB_"+o.idx+"_dragger_vertical"),e("#mCSB_"+o.idx+"_dragger_horizontal")];if(Q(t),("x"!==n.axis&&!o.overflowed[0]||"y"===n.axis&&o.overflowed[0])&&(l[0].add(r).css("top",0),G(t,"_resetY")),"y"!==n.axis&&!o.overflowed[1]||"x"===n.axis&&o.overflowed[1]){var s=dx=0;"rtl"===o.langDir&&(s=i.width()-r.outerWidth(!1),dx=Math.abs(s/o.scrollRatio.x)),r.css("left",s),l[1].css("left",dx),G(t,"_resetX")}},T=function(){function t(){r=setTimeout(function(){e.event.special.mousewheel?(clearTimeout(r),W.call(o[0])):t()},100)}var o=e(this),n=o.data(a),i=n.opt;if(!n.bindEvents){if(I.call(this),i.contentTouchScroll&&D.call(this),E.call(this),i.mouseWheel.enable){var r;t()}P.call(this),U.call(this),i.advanced.autoScrollOnFocus&&H.call(this),i.scrollButtons.enable&&F.call(this),i.keyboard.enable&&q.call(this),n.bindEvents=!0}},k=function(){var t=e(this),o=t.data(a),n=o.opt,i=a+"_"+o.idx,r=".mCSB_"+o.idx+"_scrollbar",l=e("#mCSB_"+o.idx+",#mCSB_"+o.idx+"_container,#mCSB_"+o.idx+"_container_wrapper,"+r+" ."+d[12]+",#mCSB_"+o.idx+"_dragger_vertical,#mCSB_"+o.idx+"_dragger_horizontal,"+r+">a"),s=e("#mCSB_"+o.idx+"_container");n.advanced.releaseDraggableSelectors&&l.add(e(n.advanced.releaseDraggableSelectors)),n.advanced.extraDraggableSelectors&&l.add(e(n.advanced.extraDraggableSelectors)),o.bindEvents&&(e(document).add(e(!A()||top.document)).unbind("."+i),l.each(function(){e(this).unbind("."+i)}),clearTimeout(t[0]._focusTimeout),$(t[0],"_focusTimeout"),clearTimeout(o.sequential.step),$(o.sequential,"step"),clearTimeout(s[0].onCompleteTimeout),$(s[0],"onCompleteTimeout"),o.bindEvents=!1)},M=function(t){var o=e(this),n=o.data(a),i=n.opt,r=e("#mCSB_"+n.idx+"_container_wrapper"),l=r.length?r:e("#mCSB_"+n.idx+"_container"),s=[e("#mCSB_"+n.idx+"_scrollbar_vertical"),e("#mCSB_"+n.idx+"_scrollbar_horizontal")],c=[s[0].find(".mCSB_dragger"),s[1].find(".mCSB_dragger")];"x"!==i.axis&&(n.overflowed[0]&&!t?(s[0].add(c[0]).add(s[0].children("a")).css("display","block"),l.removeClass(d[8]+" "+d[10])):(i.alwaysShowScrollbar?(2!==i.alwaysShowScrollbar&&c[0].css("display","none"),l.removeClass(d[10])):(s[0].css("display","none"),l.addClass(d[10])),l.addClass(d[8]))),"y"!==i.axis&&(n.overflowed[1]&&!t?(s[1].add(c[1]).add(s[1].children("a")).css("display","block"),l.removeClass(d[9]+" "+d[11])):(i.alwaysShowScrollbar?(2!==i.alwaysShowScrollbar&&c[1].css("display","none"),l.removeClass(d[11])):(s[1].css("display","none"),l.addClass(d[11])),l.addClass(d[9]))),n.overflowed[0]||n.overflowed[1]?o.removeClass(d[5]):o.addClass(d[5])},O=function(t){var o=t.type,a=t.target.ownerDocument!==document&&null!==frameElement?[e(frameElement).offset().top,e(frameElement).offset().left]:null,n=A()&&t.target.ownerDocument!==top.document&&null!==frameElement?[e(t.view.frameElement).offset().top,e(t.view.frameElement).offset().left]:[0,0];switch(o){case"pointerdown":case"MSPointerDown":case"pointermove":case"MSPointerMove":case"pointerup":case"MSPointerUp":return a?[t.originalEvent.pageY-a[0]+n[0],t.originalEvent.pageX-a[1]+n[1],!1]:[t.originalEvent.pageY,t.originalEvent.pageX,!1];case"touchstart":case"touchmove":case"touchend":var i=t.originalEvent.touches[0]||t.originalEvent.changedTouches[0],r=t.originalEvent.touches.length||t.originalEvent.changedTouches.length;return t.target.ownerDocument!==document?[i.screenY,i.screenX,r>1]:[i.pageY,i.pageX,r>1];default:return a?[t.pageY-a[0]+n[0],t.pageX-a[1]+n[1],!1]:[t.pageY,t.pageX,!1]}},I=function(){function t(e,t,a,n){if(h[0].idleTimer=d.scrollInertia<233?250:0,o.attr("id")===f[1])var i="x",s=(o[0].offsetLeft-t+n)*l.scrollRatio.x;else var i="y",s=(o[0].offsetTop-e+a)*l.scrollRatio.y;G(r,s.toString(),{dir:i,drag:!0})}var o,n,i,r=e(this),l=r.data(a),d=l.opt,u=a+"_"+l.idx,f=["mCSB_"+l.idx+"_dragger_vertical","mCSB_"+l.idx+"_dragger_horizontal"],h=e("#mCSB_"+l.idx+"_container"),m=e("#"+f[0]+",#"+f[1]),p=d.advanced.releaseDraggableSelectors?m.add(e(d.advanced.releaseDraggableSelectors)):m,g=d.advanced.extraDraggableSelectors?e(!A()||top.document).add(e(d.advanced.extraDraggableSelectors)):e(!A()||top.document);m.bind("contextmenu."+u,function(e){e.preventDefault()}).bind("mousedown."+u+" touchstart."+u+" pointerdown."+u+" MSPointerDown."+u,function(t){if(t.stopImmediatePropagation(),t.preventDefault(),ee(t)){c=!0,s&&(document.onselectstart=function(){return!1}),L.call(h,!1),Q(r),o=e(this);var a=o.offset(),l=O(t)[0]-a.top,u=O(t)[1]-a.left,f=o.height()+a.top,m=o.width()+a.left;f>l&&l>0&&m>u&&u>0&&(n=l,i=u),C(o,"active",d.autoExpandScrollbar)}}).bind("touchmove."+u,function(e){e.stopImmediatePropagation(),e.preventDefault();var a=o.offset(),r=O(e)[0]-a.top,l=O(e)[1]-a.left;t(n,i,r,l)}),e(document).add(g).bind("mousemove."+u+" pointermove."+u+" MSPointerMove."+u,function(e){if(o){var a=o.offset(),r=O(e)[0]-a.top,l=O(e)[1]-a.left;if(n===r&&i===l)return;t(n,i,r,l)}}).add(p).bind("mouseup."+u+" touchend."+u+" pointerup."+u+" MSPointerUp."+u,function(){o&&(C(o,"active",d.autoExpandScrollbar),o=null),c=!1,s&&(document.onselectstart=null),L.call(h,!0)})},D=function(){function o(e){if(!te(e)||c||O(e)[2])return void(t=0);t=1,b=0,C=0,d=1,y.removeClass("mCS_touch_action");var o=I.offset();u=O(e)[0]-o.top,f=O(e)[1]-o.left,z=[O(e)[0],O(e)[1]]}function n(e){if(te(e)&&!c&&!O(e)[2]&&(T.documentTouchScroll||e.preventDefault(),e.stopImmediatePropagation(),(!C||b)&&d)){g=K();var t=M.offset(),o=O(e)[0]-t.top,a=O(e)[1]-t.left,n="mcsLinearOut";if(E.push(o),W.push(a),z[2]=Math.abs(O(e)[0]-z[0]),z[3]=Math.abs(O(e)[1]-z[1]),B.overflowed[0])var i=D[0].parent().height()-D[0].height(),r=u-o>0&&o-u>-(i*B.scrollRatio.y)&&(2*z[3]<z[2]||"yx"===T.axis);if(B.overflowed[1])var l=D[1].parent().width()-D[1].width(),h=f-a>0&&a-f>-(l*B.scrollRatio.x)&&(2*z[2]<z[3]||"yx"===T.axis);r||h?(U||e.preventDefault(),b=1):(C=1,y.addClass("mCS_touch_action")),U&&e.preventDefault(),w="yx"===T.axis?[u-o,f-a]:"x"===T.axis?[null,f-a]:[u-o,null],I[0].idleTimer=250,B.overflowed[0]&&s(w[0],R,n,"y","all",!0),B.overflowed[1]&&s(w[1],R,n,"x",L,!0)}}function i(e){if(!te(e)||c||O(e)[2])return void(t=0);t=1,e.stopImmediatePropagation(),Q(y),p=K();var o=M.offset();h=O(e)[0]-o.top,m=O(e)[1]-o.left,E=[],W=[]}function r(e){if(te(e)&&!c&&!O(e)[2]){d=0,e.stopImmediatePropagation(),b=0,C=0,v=K();var t=M.offset(),o=O(e)[0]-t.top,a=O(e)[1]-t.left;if(!(v-g>30)){_=1e3/(v-p);var n="mcsEaseOut",i=2.5>_,r=i?[E[E.length-2],W[W.length-2]]:[0,0];x=i?[o-r[0],a-r[1]]:[o-h,a-m];var u=[Math.abs(x[0]),Math.abs(x[1])];_=i?[Math.abs(x[0]/4),Math.abs(x[1]/4)]:[_,_];var f=[Math.abs(I[0].offsetTop)-x[0]*l(u[0]/_[0],_[0]),Math.abs(I[0].offsetLeft)-x[1]*l(u[1]/_[1],_[1])];w="yx"===T.axis?[f[0],f[1]]:"x"===T.axis?[null,f[1]]:[f[0],null],S=[4*u[0]+T.scrollInertia,4*u[1]+T.scrollInertia];var y=parseInt(T.contentTouchScroll)||0;w[0]=u[0]>y?w[0]:0,w[1]=u[1]>y?w[1]:0,B.overflowed[0]&&s(w[0],S[0],n,"y",L,!1),B.overflowed[1]&&s(w[1],S[1],n,"x",L,!1)}}}function l(e,t){var o=[1.5*t,2*t,t/1.5,t/2];return e>90?t>4?o[0]:o[3]:e>60?t>3?o[3]:o[2]:e>30?t>8?o[1]:t>6?o[0]:t>4?t:o[2]:t>8?t:o[3]}function s(e,t,o,a,n,i){e&&G(y,e.toString(),{dur:t,scrollEasing:o,dir:a,overwrite:n,drag:i})}var d,u,f,h,m,p,g,v,x,_,w,S,b,C,y=e(this),B=y.data(a),T=B.opt,k=a+"_"+B.idx,M=e("#mCSB_"+B.idx),I=e("#mCSB_"+B.idx+"_container"),D=[e("#mCSB_"+B.idx+"_dragger_vertical"),e("#mCSB_"+B.idx+"_dragger_horizontal")],E=[],W=[],R=0,L="yx"===T.axis?"none":"all",z=[],P=I.find("iframe"),H=["touchstart."+k+" pointerdown."+k+" MSPointerDown."+k,"touchmove."+k+" pointermove."+k+" MSPointerMove."+k,"touchend."+k+" pointerup."+k+" MSPointerUp."+k],U=void 0!==document.body.style.touchAction&&""!==document.body.style.touchAction;I.bind(H[0],function(e){o(e)}).bind(H[1],function(e){n(e)}),M.bind(H[0],function(e){i(e)}).bind(H[2],function(e){r(e)}),P.length&&P.each(function(){e(this).bind("load",function(){A(this)&&e(this.contentDocument||this.contentWindow.document).bind(H[0],function(e){o(e),i(e)}).bind(H[1],function(e){n(e)}).bind(H[2],function(e){r(e)})})})},E=function(){function o(){return window.getSelection?window.getSelection().toString():document.selection&&"Control"!=document.selection.type?document.selection.createRange().text:0}function n(e,t,o){d.type=o&&i?"stepped":"stepless",d.scrollAmount=10,j(r,e,t,"mcsLinearOut",o?60:null)}var i,r=e(this),l=r.data(a),s=l.opt,d=l.sequential,u=a+"_"+l.idx,f=e("#mCSB_"+l.idx+"_container"),h=f.parent();f.bind("mousedown."+u,function(){t||i||(i=1,c=!0)}).add(document).bind("mousemove."+u,function(e){if(!t&&i&&o()){var a=f.offset(),r=O(e)[0]-a.top+f[0].offsetTop,c=O(e)[1]-a.left+f[0].offsetLeft;r>0&&r<h.height()&&c>0&&c<h.width()?d.step&&n("off",null,"stepped"):("x"!==s.axis&&l.overflowed[0]&&(0>r?n("on",38):r>h.height()&&n("on",40)),"y"!==s.axis&&l.overflowed[1]&&(0>c?n("on",37):c>h.width()&&n("on",39)))}}).bind("mouseup."+u+" dragend."+u,function(){t||(i&&(i=0,n("off",null)),c=!1)})},W=function(){function t(t,a){if(Q(o),!z(o,t.target)){var r="auto"!==i.mouseWheel.deltaFactor?parseInt(i.mouseWheel.deltaFactor):s&&t.deltaFactor<100?100:t.deltaFactor||100,d=i.scrollInertia;if("x"===i.axis||"x"===i.mouseWheel.axis)var u="x",f=[Math.round(r*n.scrollRatio.x),parseInt(i.mouseWheel.scrollAmount)],h="auto"!==i.mouseWheel.scrollAmount?f[1]:f[0]>=l.width()?.9*l.width():f[0],m=Math.abs(e("#mCSB_"+n.idx+"_container")[0].offsetLeft),p=c[1][0].offsetLeft,g=c[1].parent().width()-c[1].width(),v="y"===i.mouseWheel.axis?t.deltaY||a:t.deltaX;else var u="y",f=[Math.round(r*n.scrollRatio.y),parseInt(i.mouseWheel.scrollAmount)],h="auto"!==i.mouseWheel.scrollAmount?f[1]:f[0]>=l.height()?.9*l.height():f[0],m=Math.abs(e("#mCSB_"+n.idx+"_container")[0].offsetTop),p=c[0][0].offsetTop,g=c[0].parent().height()-c[0].height(),v=t.deltaY||a;"y"===u&&!n.overflowed[0]||"x"===u&&!n.overflowed[1]||((i.mouseWheel.invert||t.webkitDirectionInvertedFromDevice)&&(v=-v),i.mouseWheel.normalizeDelta&&(v=0>v?-1:1),(v>0&&0!==p||0>v&&p!==g||i.mouseWheel.preventDefault)&&(t.stopImmediatePropagation(),t.preventDefault()),t.deltaFactor<5&&!i.mouseWheel.normalizeDelta&&(h=t.deltaFactor,d=17),G(o,(m-v*h).toString(),{dir:u,dur:d}))}}if(e(this).data(a)){var o=e(this),n=o.data(a),i=n.opt,r=a+"_"+n.idx,l=e("#mCSB_"+n.idx),c=[e("#mCSB_"+n.idx+"_dragger_vertical"),e("#mCSB_"+n.idx+"_dragger_horizontal")],d=e("#mCSB_"+n.idx+"_container").find("iframe");d.length&&d.each(function(){e(this).bind("load",function(){A(this)&&e(this.contentDocument||this.contentWindow.document).bind("mousewheel."+r,function(e,o){t(e,o)})})}),l.bind("mousewheel."+r,function(e,o){t(e,o)})}},R=new Object,A=function(t){var o=!1,a=!1,n=null;if(void 0===t?a="#empty":void 0!==e(t).attr("id")&&(a=e(t).attr("id")),a!==!1&&void 0!==R[a])return R[a];if(t){try{var i=t.contentDocument||t.contentWindow.document;n=i.body.innerHTML}catch(r){}o=null!==n}else{try{var i=top.document;n=i.body.innerHTML}catch(r){}o=null!==n}return a!==!1&&(R[a]=o),o},L=function(e){var t=this.find("iframe");if(t.length){var o=e?"auto":"none";t.css("pointer-events",o)}},z=function(t,o){var n=o.nodeName.toLowerCase(),i=t.data(a).opt.mouseWheel.disableOver,r=["select","textarea"];return e.inArray(n,i)>-1&&!(e.inArray(n,r)>-1&&!e(o).is(":focus"))},P=function(){var t,o=e(this),n=o.data(a),i=a+"_"+n.idx,r=e("#mCSB_"+n.idx+"_container"),l=r.parent(),s=e(".mCSB_"+n.idx+"_scrollbar ."+d[12]);s.bind("mousedown."+i+" touchstart."+i+" pointerdown."+i+" MSPointerDown."+i,function(o){c=!0,e(o.target).hasClass("mCSB_dragger")||(t=1)}).bind("touchend."+i+" pointerup."+i+" MSPointerUp."+i,function(){c=!1}).bind("click."+i,function(a){if(t&&(t=0,e(a.target).hasClass(d[12])||e(a.target).hasClass("mCSB_draggerRail"))){Q(o);var i=e(this),s=i.find(".mCSB_dragger");if(i.parent(".mCSB_scrollTools_horizontal").length>0){if(!n.overflowed[1])return;var c="x",u=a.pageX>s.offset().left?-1:1,f=Math.abs(r[0].offsetLeft)-u*(.9*l.width())}else{if(!n.overflowed[0])return;var c="y",u=a.pageY>s.offset().top?-1:1,f=Math.abs(r[0].offsetTop)-u*(.9*l.height())}G(o,f.toString(),{dir:c,scrollEasing:"mcsEaseInOut"})}})},H=function(){var t=e(this),o=t.data(a),n=o.opt,i=a+"_"+o.idx,r=e("#mCSB_"+o.idx+"_container"),l=r.parent();r.bind("focusin."+i,function(){var o=e(document.activeElement),a=r.find(".mCustomScrollBox").length,i=0;o.is(n.advanced.autoScrollOnFocus)&&(Q(t),clearTimeout(t[0]._focusTimeout),t[0]._focusTimer=a?(i+17)*a:0,t[0]._focusTimeout=setTimeout(function(){var e=[ae(o)[0],ae(o)[1]],a=[r[0].offsetTop,r[0].offsetLeft],s=[a[0]+e[0]>=0&&a[0]+e[0]<l.height()-o.outerHeight(!1),a[1]+e[1]>=0&&a[0]+e[1]<l.width()-o.outerWidth(!1)],c="yx"!==n.axis||s[0]||s[1]?"all":"none";"x"===n.axis||s[0]||G(t,e[0].toString(),{dir:"y",scrollEasing:"mcsEaseInOut",overwrite:c,dur:i}),"y"===n.axis||s[1]||G(t,e[1].toString(),{dir:"x",scrollEasing:"mcsEaseInOut",overwrite:c,dur:i})},t[0]._focusTimer))})},U=function(){var t=e(this),o=t.data(a),n=a+"_"+o.idx,i=e("#mCSB_"+o.idx+"_container").parent();i.bind("scroll."+n,function(){0===i.scrollTop()&&0===i.scrollLeft()||e(".mCSB_"+o.idx+"_scrollbar").css("visibility","hidden")})},F=function(){var t=e(this),o=t.data(a),n=o.opt,i=o.sequential,r=a+"_"+o.idx,l=".mCSB_"+o.idx+"_scrollbar",s=e(l+">a");s.bind("contextmenu."+r,function(e){e.preventDefault()}).bind("mousedown."+r+" touchstart."+r+" pointerdown."+r+" MSPointerDown."+r+" mouseup."+r+" touchend."+r+" pointerup."+r+" MSPointerUp."+r+" mouseout."+r+" pointerout."+r+" MSPointerOut."+r+" click."+r,function(a){function r(e,o){i.scrollAmount=n.scrollButtons.scrollAmount,j(t,e,o)}if(a.preventDefault(),ee(a)){var l=e(this).attr("class");switch(i.type=n.scrollButtons.scrollType,a.type){case"mousedown":case"touchstart":case"pointerdown":case"MSPointerDown":if("stepped"===i.type)return;c=!0,o.tweenRunning=!1,r("on",l);break;case"mouseup":case"touchend":case"pointerup":case"MSPointerUp":case"mouseout":case"pointerout":case"MSPointerOut":if("stepped"===i.type)return;c=!1,i.dir&&r("off",l);break;case"click":if("stepped"!==i.type||o.tweenRunning)return;r("on",l)}}})},q=function(){function t(t){function a(e,t){r.type=i.keyboard.scrollType,r.scrollAmount=i.keyboard.scrollAmount,"stepped"===r.type&&n.tweenRunning||j(o,e,t)}switch(t.type){case"blur":n.tweenRunning&&r.dir&&a("off",null);break;case"keydown":case"keyup":var l=t.keyCode?t.keyCode:t.which,s="on";if("x"!==i.axis&&(38===l||40===l)||"y"!==i.axis&&(37===l||39===l)){if((38===l||40===l)&&!n.overflowed[0]||(37===l||39===l)&&!n.overflowed[1])return;"keyup"===t.type&&(s="off"),e(document.activeElement).is(u)||(t.preventDefault(),t.stopImmediatePropagation(),a(s,l))}else if(33===l||34===l){if((n.overflowed[0]||n.overflowed[1])&&(t.preventDefault(),t.stopImmediatePropagation()),"keyup"===t.type){Q(o);var f=34===l?-1:1;if("x"===i.axis||"yx"===i.axis&&n.overflowed[1]&&!n.overflowed[0])var h="x",m=Math.abs(c[0].offsetLeft)-f*(.9*d.width());else var h="y",m=Math.abs(c[0].offsetTop)-f*(.9*d.height());G(o,m.toString(),{dir:h,scrollEasing:"mcsEaseInOut"})}}else if((35===l||36===l)&&!e(document.activeElement).is(u)&&((n.overflowed[0]||n.overflowed[1])&&(t.preventDefault(),t.stopImmediatePropagation()),"keyup"===t.type)){if("x"===i.axis||"yx"===i.axis&&n.overflowed[1]&&!n.overflowed[0])var h="x",m=35===l?Math.abs(d.width()-c.outerWidth(!1)):0;else var h="y",m=35===l?Math.abs(d.height()-c.outerHeight(!1)):0;G(o,m.toString(),{dir:h,scrollEasing:"mcsEaseInOut"})}}}var o=e(this),n=o.data(a),i=n.opt,r=n.sequential,l=a+"_"+n.idx,s=e("#mCSB_"+n.idx),c=e("#mCSB_"+n.idx+"_container"),d=c.parent(),u="input,textarea,select,datalist,keygen,[contenteditable='true']",f=c.find("iframe"),h=["blur."+l+" keydown."+l+" keyup."+l];f.length&&f.each(function(){e(this).bind("load",function(){A(this)&&e(this.contentDocument||this.contentWindow.document).bind(h[0],function(e){t(e)})})}),s.attr("tabindex","0").bind(h[0],function(e){t(e)})},j=function(t,o,n,i,r){function l(e){u.snapAmount&&(f.scrollAmount=u.snapAmount instanceof Array?"x"===f.dir[0]?u.snapAmount[1]:u.snapAmount[0]:u.snapAmount);var o="stepped"!==f.type,a=r?r:e?o?p/1.5:g:1e3/60,n=e?o?7.5:40:2.5,s=[Math.abs(h[0].offsetTop),Math.abs(h[0].offsetLeft)],d=[c.scrollRatio.y>10?10:c.scrollRatio.y,c.scrollRatio.x>10?10:c.scrollRatio.x],m="x"===f.dir[0]?s[1]+f.dir[1]*(d[1]*n):s[0]+f.dir[1]*(d[0]*n),v="x"===f.dir[0]?s[1]+f.dir[1]*parseInt(f.scrollAmount):s[0]+f.dir[1]*parseInt(f.scrollAmount),x="auto"!==f.scrollAmount?v:m,_=i?i:e?o?"mcsLinearOut":"mcsEaseInOut":"mcsLinear",w=!!e;return e&&17>a&&(x="x"===f.dir[0]?s[1]:s[0]),G(t,x.toString(),{dir:f.dir[0],scrollEasing:_,dur:a,onComplete:w}),e?void(f.dir=!1):(clearTimeout(f.step),void(f.step=setTimeout(function(){l()},a)))}function s(){clearTimeout(f.step),$(f,"step"),Q(t)}var c=t.data(a),u=c.opt,f=c.sequential,h=e("#mCSB_"+c.idx+"_container"),m="stepped"===f.type,p=u.scrollInertia<26?26:u.scrollInertia,g=u.scrollInertia<1?17:u.scrollInertia;switch(o){case"on":if(f.dir=[n===d[16]||n===d[15]||39===n||37===n?"x":"y",n===d[13]||n===d[15]||38===n||37===n?-1:1],Q(t),oe(n)&&"stepped"===f.type)return;l(m);break;case"off":s(),(m||c.tweenRunning&&f.dir)&&l(!0)}},Y=function(t){var o=e(this).data(a).opt,n=[];return"function"==typeof t&&(t=t()),t instanceof Array?n=t.length>1?[t[0],t[1]]:"x"===o.axis?[null,t[0]]:[t[0],null]:(n[0]=t.y?t.y:t.x||"x"===o.axis?null:t,n[1]=t.x?t.x:t.y||"y"===o.axis?null:t),"function"==typeof n[0]&&(n[0]=n[0]()),"function"==typeof n[1]&&(n[1]=n[1]()),n},X=function(t,o){if(null!=t&&"undefined"!=typeof t){var n=e(this),i=n.data(a),r=i.opt,l=e("#mCSB_"+i.idx+"_container"),s=l.parent(),c=typeof t;o||(o="x"===r.axis?"x":"y");var d="x"===o?l.outerWidth(!1)-s.width():l.outerHeight(!1)-s.height(),f="x"===o?l[0].offsetLeft:l[0].offsetTop,h="x"===o?"left":"top";switch(c){case"function":return t();case"object":var m=t.jquery?t:e(t);if(!m.length)return;return"x"===o?ae(m)[1]:ae(m)[0];case"string":case"number":if(oe(t))return Math.abs(t);if(-1!==t.indexOf("%"))return Math.abs(d*parseInt(t)/100);if(-1!==t.indexOf("-="))return Math.abs(f-parseInt(t.split("-=")[1]));if(-1!==t.indexOf("+=")){var p=f+parseInt(t.split("+=")[1]);return p>=0?0:Math.abs(p)}if(-1!==t.indexOf("px")&&oe(t.split("px")[0]))return Math.abs(t.split("px")[0]);if("top"===t||"left"===t)return 0;if("bottom"===t)return Math.abs(s.height()-l.outerHeight(!1));if("right"===t)return Math.abs(s.width()-l.outerWidth(!1));if("first"===t||"last"===t){var m=l.find(":"+t);return"x"===o?ae(m)[1]:ae(m)[0]}return e(t).length?"x"===o?ae(e(t))[1]:ae(e(t))[0]:(l.css(h,t),void u.update.call(null,n[0]))}}},N=function(t){function o(){return clearTimeout(f[0].autoUpdate),0===l.parents("html").length?void(l=null):void(f[0].autoUpdate=setTimeout(function(){return c.advanced.updateOnSelectorChange&&(s.poll.change.n=i(),s.poll.change.n!==s.poll.change.o)?(s.poll.change.o=s.poll.change.n,void r(3)):c.advanced.updateOnContentResize&&(s.poll.size.n=l[0].scrollHeight+l[0].scrollWidth+f[0].offsetHeight+l[0].offsetHeight+l[0].offsetWidth,s.poll.size.n!==s.poll.size.o)?(s.poll.size.o=s.poll.size.n,void r(1)):!c.advanced.updateOnImageLoad||"auto"===c.advanced.updateOnImageLoad&&"y"===c.axis||(s.poll.img.n=f.find("img").length,s.poll.img.n===s.poll.img.o)?void((c.advanced.updateOnSelectorChange||c.advanced.updateOnContentResize||c.advanced.updateOnImageLoad)&&o()):(s.poll.img.o=s.poll.img.n,void f.find("img").each(function(){n(this)}))},c.advanced.autoUpdateTimeout))}function n(t){function o(e,t){return function(){
return t.apply(e,arguments)}}function a(){this.onload=null,e(t).addClass(d[2]),r(2)}if(e(t).hasClass(d[2]))return void r();var n=new Image;n.onload=o(n,a),n.src=t.src}function i(){c.advanced.updateOnSelectorChange===!0&&(c.advanced.updateOnSelectorChange="*");var e=0,t=f.find(c.advanced.updateOnSelectorChange);return c.advanced.updateOnSelectorChange&&t.length>0&&t.each(function(){e+=this.offsetHeight+this.offsetWidth}),e}function r(e){clearTimeout(f[0].autoUpdate),u.update.call(null,l[0],e)}var l=e(this),s=l.data(a),c=s.opt,f=e("#mCSB_"+s.idx+"_container");return t?(clearTimeout(f[0].autoUpdate),void $(f[0],"autoUpdate")):void o()},V=function(e,t,o){return Math.round(e/t)*t-o},Q=function(t){var o=t.data(a),n=e("#mCSB_"+o.idx+"_container,#mCSB_"+o.idx+"_container_wrapper,#mCSB_"+o.idx+"_dragger_vertical,#mCSB_"+o.idx+"_dragger_horizontal");n.each(function(){Z.call(this)})},G=function(t,o,n){function i(e){return s&&c.callbacks[e]&&"function"==typeof c.callbacks[e]}function r(){return[c.callbacks.alwaysTriggerOffsets||w>=S[0]+y,c.callbacks.alwaysTriggerOffsets||-B>=w]}function l(){var e=[h[0].offsetTop,h[0].offsetLeft],o=[x[0].offsetTop,x[0].offsetLeft],a=[h.outerHeight(!1),h.outerWidth(!1)],i=[f.height(),f.width()];t[0].mcs={content:h,top:e[0],left:e[1],draggerTop:o[0],draggerLeft:o[1],topPct:Math.round(100*Math.abs(e[0])/(Math.abs(a[0])-i[0])),leftPct:Math.round(100*Math.abs(e[1])/(Math.abs(a[1])-i[1])),direction:n.dir}}var s=t.data(a),c=s.opt,d={trigger:"internal",dir:"y",scrollEasing:"mcsEaseOut",drag:!1,dur:c.scrollInertia,overwrite:"all",callbacks:!0,onStart:!0,onUpdate:!0,onComplete:!0},n=e.extend(d,n),u=[n.dur,n.drag?0:n.dur],f=e("#mCSB_"+s.idx),h=e("#mCSB_"+s.idx+"_container"),m=h.parent(),p=c.callbacks.onTotalScrollOffset?Y.call(t,c.callbacks.onTotalScrollOffset):[0,0],g=c.callbacks.onTotalScrollBackOffset?Y.call(t,c.callbacks.onTotalScrollBackOffset):[0,0];if(s.trigger=n.trigger,0===m.scrollTop()&&0===m.scrollLeft()||(e(".mCSB_"+s.idx+"_scrollbar").css("visibility","visible"),m.scrollTop(0).scrollLeft(0)),"_resetY"!==o||s.contentReset.y||(i("onOverflowYNone")&&c.callbacks.onOverflowYNone.call(t[0]),s.contentReset.y=1),"_resetX"!==o||s.contentReset.x||(i("onOverflowXNone")&&c.callbacks.onOverflowXNone.call(t[0]),s.contentReset.x=1),"_resetY"!==o&&"_resetX"!==o){if(!s.contentReset.y&&t[0].mcs||!s.overflowed[0]||(i("onOverflowY")&&c.callbacks.onOverflowY.call(t[0]),s.contentReset.x=null),!s.contentReset.x&&t[0].mcs||!s.overflowed[1]||(i("onOverflowX")&&c.callbacks.onOverflowX.call(t[0]),s.contentReset.x=null),c.snapAmount){var v=c.snapAmount instanceof Array?"x"===n.dir?c.snapAmount[1]:c.snapAmount[0]:c.snapAmount;o=V(o,v,c.snapOffset)}switch(n.dir){case"x":var x=e("#mCSB_"+s.idx+"_dragger_horizontal"),_="left",w=h[0].offsetLeft,S=[f.width()-h.outerWidth(!1),x.parent().width()-x.width()],b=[o,0===o?0:o/s.scrollRatio.x],y=p[1],B=g[1],T=y>0?y/s.scrollRatio.x:0,k=B>0?B/s.scrollRatio.x:0;break;case"y":var x=e("#mCSB_"+s.idx+"_dragger_vertical"),_="top",w=h[0].offsetTop,S=[f.height()-h.outerHeight(!1),x.parent().height()-x.height()],b=[o,0===o?0:o/s.scrollRatio.y],y=p[0],B=g[0],T=y>0?y/s.scrollRatio.y:0,k=B>0?B/s.scrollRatio.y:0}b[1]<0||0===b[0]&&0===b[1]?b=[0,0]:b[1]>=S[1]?b=[S[0],S[1]]:b[0]=-b[0],t[0].mcs||(l(),i("onInit")&&c.callbacks.onInit.call(t[0])),clearTimeout(h[0].onCompleteTimeout),J(x[0],_,Math.round(b[1]),u[1],n.scrollEasing),!s.tweenRunning&&(0===w&&b[0]>=0||w===S[0]&&b[0]<=S[0])||J(h[0],_,Math.round(b[0]),u[0],n.scrollEasing,n.overwrite,{onStart:function(){n.callbacks&&n.onStart&&!s.tweenRunning&&(i("onScrollStart")&&(l(),c.callbacks.onScrollStart.call(t[0])),s.tweenRunning=!0,C(x),s.cbOffsets=r())},onUpdate:function(){n.callbacks&&n.onUpdate&&i("whileScrolling")&&(l(),c.callbacks.whileScrolling.call(t[0]))},onComplete:function(){if(n.callbacks&&n.onComplete){"yx"===c.axis&&clearTimeout(h[0].onCompleteTimeout);var e=h[0].idleTimer||0;h[0].onCompleteTimeout=setTimeout(function(){i("onScroll")&&(l(),c.callbacks.onScroll.call(t[0])),i("onTotalScroll")&&b[1]>=S[1]-T&&s.cbOffsets[0]&&(l(),c.callbacks.onTotalScroll.call(t[0])),i("onTotalScrollBack")&&b[1]<=k&&s.cbOffsets[1]&&(l(),c.callbacks.onTotalScrollBack.call(t[0])),s.tweenRunning=!1,h[0].idleTimer=0,C(x,"hide")},e)}}})}},J=function(e,t,o,a,n,i,r){function l(){S.stop||(x||m.call(),x=K()-v,s(),x>=S.time&&(S.time=x>S.time?x+f-(x-S.time):x+f-1,S.time<x+1&&(S.time=x+1)),S.time<a?S.id=h(l):g.call())}function s(){a>0?(S.currVal=u(S.time,_,b,a,n),w[t]=Math.round(S.currVal)+"px"):w[t]=o+"px",p.call()}function c(){f=1e3/60,S.time=x+f,h=window.requestAnimationFrame?window.requestAnimationFrame:function(e){return s(),setTimeout(e,.01)},S.id=h(l)}function d(){null!=S.id&&(window.requestAnimationFrame?window.cancelAnimationFrame(S.id):clearTimeout(S.id),S.id=null)}function u(e,t,o,a,n){switch(n){case"linear":case"mcsLinear":return o*e/a+t;case"mcsLinearOut":return e/=a,e--,o*Math.sqrt(1-e*e)+t;case"easeInOutSmooth":return e/=a/2,1>e?o/2*e*e+t:(e--,-o/2*(e*(e-2)-1)+t);case"easeInOutStrong":return e/=a/2,1>e?o/2*Math.pow(2,10*(e-1))+t:(e--,o/2*(-Math.pow(2,-10*e)+2)+t);case"easeInOut":case"mcsEaseInOut":return e/=a/2,1>e?o/2*e*e*e+t:(e-=2,o/2*(e*e*e+2)+t);case"easeOutSmooth":return e/=a,e--,-o*(e*e*e*e-1)+t;case"easeOutStrong":return o*(-Math.pow(2,-10*e/a)+1)+t;case"easeOut":case"mcsEaseOut":default:var i=(e/=a)*e,r=i*e;return t+o*(.499999999999997*r*i+-2.5*i*i+5.5*r+-6.5*i+4*e)}}e._mTween||(e._mTween={top:{},left:{}});var f,h,r=r||{},m=r.onStart||function(){},p=r.onUpdate||function(){},g=r.onComplete||function(){},v=K(),x=0,_=e.offsetTop,w=e.style,S=e._mTween[t];"left"===t&&(_=e.offsetLeft);var b=o-_;S.stop=0,"none"!==i&&d(),c()},K=function(){return window.performance&&window.performance.now?window.performance.now():window.performance&&window.performance.webkitNow?window.performance.webkitNow():Date.now?Date.now():(new Date).getTime()},Z=function(){var e=this;e._mTween||(e._mTween={top:{},left:{}});for(var t=["top","left"],o=0;o<t.length;o++){var a=t[o];e._mTween[a].id&&(window.requestAnimationFrame?window.cancelAnimationFrame(e._mTween[a].id):clearTimeout(e._mTween[a].id),e._mTween[a].id=null,e._mTween[a].stop=1)}},$=function(e,t){try{delete e[t]}catch(o){e[t]=null}},ee=function(e){return!(e.which&&1!==e.which)},te=function(e){var t=e.originalEvent.pointerType;return!(t&&"touch"!==t&&2!==t)},oe=function(e){return!isNaN(parseFloat(e))&&isFinite(e)},ae=function(e){var t=e.parents(".mCSB_container");return[e.offset().top-t.offset().top,e.offset().left-t.offset().left]},ne=function(){function e(){var e=["webkit","moz","ms","o"];if("hidden"in document)return"hidden";for(var t=0;t<e.length;t++)if(e[t]+"Hidden"in document)return e[t]+"Hidden";return null}var t=e();return t?document[t]:!1};e.fn[o]=function(t){return u[t]?u[t].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof t&&t?void e.error("Method "+t+" does not exist"):u.init.apply(this,arguments)},e[o]=function(t){return u[t]?u[t].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof t&&t?void e.error("Method "+t+" does not exist"):u.init.apply(this,arguments)},e[o].defaults=i,window[o]=!0,e(window).bind("load",function(){e(n)[o](),e.extend(e.expr[":"],{mcsInView:e.expr[":"].mcsInView||function(t){var o,a,n=e(t),i=n.parents(".mCSB_container");if(i.length)return o=i.parent(),a=[i[0].offsetTop,i[0].offsetLeft],a[0]+ae(n)[0]>=0&&a[0]+ae(n)[0]<o.height()-n.outerHeight(!1)&&a[1]+ae(n)[1]>=0&&a[1]+ae(n)[1]<o.width()-n.outerWidth(!1)},mcsInSight:e.expr[":"].mcsInSight||function(t,o,a){var n,i,r,l,s=e(t),c=s.parents(".mCSB_container"),d="exact"===a[3]?[[1,0],[1,0]]:[[.9,.1],[.6,.4]];if(c.length)return n=[s.outerHeight(!1),s.outerWidth(!1)],r=[c[0].offsetTop+ae(s)[0],c[0].offsetLeft+ae(s)[1]],i=[c.parent()[0].offsetHeight,c.parent()[0].offsetWidth],l=[n[0]<i[0]?d[0]:d[1],n[1]<i[1]?d[0]:d[1]],r[0]-i[0]*l[0][0]<0&&r[0]+n[0]-i[0]*l[0][1]>=0&&r[1]-i[1]*l[1][0]<0&&r[1]+n[1]-i[1]*l[1][1]>=0},mcsOverflow:e.expr[":"].mcsOverflow||function(t){var o=e(t).data(a);if(o)return o.overflowed[0]||o.overflowed[1]}})})})});

/*!
 * cleave.js - 1.5.0
 * https://github.com/nosir/cleave.js
 * Apache License Version 2.0
 *
 * Copyright (C) 2012-2019 Max Huang https://github.com/nosir/
 */
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.Cleave=t():e.Cleave=t()}(this,function(){return function(e){function t(i){if(r[i])return r[i].exports;var n=r[i]={exports:{},id:i,loaded:!1};return e[i].call(n.exports,n,n.exports,t),n.loaded=!0,n.exports}var r={};return t.m=e,t.c=r,t.p="",t(0)}([function(e,t,r){(function(t){"use strict";var i=function(e,t){var r=this,n=!1;if("string"==typeof e?(r.element=document.querySelector(e),n=document.querySelectorAll(e).length>1):"undefined"!=typeof e.length&&e.length>0?(r.element=e[0],n=e.length>1):r.element=e,!r.element)throw new Error("[cleave.js] Please check the element");if(n)try{console.warn("[cleave.js] Multiple input fields matched, cleave.js will only take the first one.")}catch(a){}t.initValue=r.element.value,r.properties=i.DefaultProperties.assign({},t),r.init()};i.prototype={init:function(){var e=this,t=e.properties;return t.numeral||t.phone||t.creditCard||t.time||t.date||0!==t.blocksLength||t.prefix?(t.maxLength=i.Util.getMaxLength(t.blocks),e.isAndroid=i.Util.isAndroid(),e.lastInputValue="",e.onChangeListener=e.onChange.bind(e),e.onKeyDownListener=e.onKeyDown.bind(e),e.onFocusListener=e.onFocus.bind(e),e.onCutListener=e.onCut.bind(e),e.onCopyListener=e.onCopy.bind(e),e.element.addEventListener("input",e.onChangeListener),e.element.addEventListener("keydown",e.onKeyDownListener),e.element.addEventListener("focus",e.onFocusListener),e.element.addEventListener("cut",e.onCutListener),e.element.addEventListener("copy",e.onCopyListener),e.initPhoneFormatter(),e.initDateFormatter(),e.initTimeFormatter(),e.initNumeralFormatter(),void((t.initValue||t.prefix&&!t.noImmediatePrefix)&&e.onInput(t.initValue))):void e.onInput(t.initValue)},initNumeralFormatter:function(){var e=this,t=e.properties;t.numeral&&(t.numeralFormatter=new i.NumeralFormatter(t.numeralDecimalMark,t.numeralIntegerScale,t.numeralDecimalScale,t.numeralThousandsGroupStyle,t.numeralPositiveOnly,t.stripLeadingZeroes,t.prefix,t.signBeforePrefix,t.delimiter))},initTimeFormatter:function(){var e=this,t=e.properties;t.time&&(t.timeFormatter=new i.TimeFormatter(t.timePattern,t.timeFormat),t.blocks=t.timeFormatter.getBlocks(),t.blocksLength=t.blocks.length,t.maxLength=i.Util.getMaxLength(t.blocks))},initDateFormatter:function(){var e=this,t=e.properties;t.date&&(t.dateFormatter=new i.DateFormatter(t.datePattern,t.dateMin,t.dateMax),t.blocks=t.dateFormatter.getBlocks(),t.blocksLength=t.blocks.length,t.maxLength=i.Util.getMaxLength(t.blocks))},initPhoneFormatter:function(){var e=this,t=e.properties;if(t.phone)try{t.phoneFormatter=new i.PhoneFormatter(new t.root.Cleave.AsYouTypeFormatter(t.phoneRegionCode),t.delimiter)}catch(r){throw new Error("[cleave.js] Please include phone-type-formatter.{country}.js lib")}},onKeyDown:function(e){var t=this,r=t.properties,n=e.which||e.keyCode,a=i.Util,o=t.element.value;t.hasBackspaceSupport=t.hasBackspaceSupport||8===n,!t.hasBackspaceSupport&&a.isAndroidBackspaceKeydown(t.lastInputValue,o)&&(n=8),t.lastInputValue=o;var l=a.getPostDelimiter(o,r.delimiter,r.delimiters);8===n&&l?r.postDelimiterBackspace=l:r.postDelimiterBackspace=!1},onChange:function(){this.onInput(this.element.value)},onFocus:function(){var e=this,t=e.properties;i.Util.fixPrefixCursor(e.element,t.prefix,t.delimiter,t.delimiters)},onCut:function(e){i.Util.checkFullSelection(this.element.value)&&(this.copyClipboardData(e),this.onInput(""))},onCopy:function(e){i.Util.checkFullSelection(this.element.value)&&this.copyClipboardData(e)},copyClipboardData:function(e){var t=this,r=t.properties,n=i.Util,a=t.element.value,o="";o=r.copyDelimiter?a:n.stripDelimiters(a,r.delimiter,r.delimiters);try{e.clipboardData?e.clipboardData.setData("Text",o):window.clipboardData.setData("Text",o),e.preventDefault()}catch(l){}},onInput:function(e){var t=this,r=t.properties,n=i.Util,a=n.getPostDelimiter(e,r.delimiter,r.delimiters);return r.numeral||!r.postDelimiterBackspace||a||(e=n.headStr(e,e.length-r.postDelimiterBackspace.length)),r.phone?(!r.prefix||r.noImmediatePrefix&&!e.length?r.result=r.phoneFormatter.format(e):r.result=r.prefix+r.phoneFormatter.format(e).slice(r.prefix.length),void t.updateValueState()):r.numeral?(r.prefix&&r.noImmediatePrefix&&0===e.length?r.result="":r.result=r.numeralFormatter.format(e),void t.updateValueState()):(r.date&&(e=r.dateFormatter.getValidatedDate(e)),r.time&&(e=r.timeFormatter.getValidatedTime(e)),e=n.stripDelimiters(e,r.delimiter,r.delimiters),e=n.getPrefixStrippedValue(e,r.prefix,r.prefixLength,r.result,r.delimiter,r.delimiters),e=r.numericOnly?n.strip(e,/[^\d]/g):e,e=r.uppercase?e.toUpperCase():e,e=r.lowercase?e.toLowerCase():e,!r.prefix||r.noImmediatePrefix&&!e.length||(e=r.prefix+e,0!==r.blocksLength)?(r.creditCard&&t.updateCreditCardPropsByValue(e),e=n.headStr(e,r.maxLength),r.result=n.getFormattedValue(e,r.blocks,r.blocksLength,r.delimiter,r.delimiters,r.delimiterLazyShow),void t.updateValueState()):(r.result=e,void t.updateValueState()))},updateCreditCardPropsByValue:function(e){var t,r=this,n=r.properties,a=i.Util;a.headStr(n.result,4)!==a.headStr(e,4)&&(t=i.CreditCardDetector.getInfo(e,n.creditCardStrictMode),n.blocks=t.blocks,n.blocksLength=n.blocks.length,n.maxLength=a.getMaxLength(n.blocks),n.creditCardType!==t.type&&(n.creditCardType=t.type,n.onCreditCardTypeChanged.call(r,n.creditCardType)))},updateValueState:function(){var e=this,t=i.Util,r=e.properties;if(e.element){var n=e.element.selectionEnd,a=e.element.value,o=r.result;if(n=t.getNextCursorPosition(n,a,o,r.delimiter,r.delimiters),e.isAndroid)return void window.setTimeout(function(){e.element.value=o,t.setSelection(e.element,n,r.document,!1),e.callOnValueChanged()},1);e.element.value=o,t.setSelection(e.element,n,r.document,!1),e.callOnValueChanged()}},callOnValueChanged:function(){var e=this,t=e.properties;t.onValueChanged.call(e,{target:{value:t.result,rawValue:e.getRawValue()}})},setPhoneRegionCode:function(e){var t=this,r=t.properties;r.phoneRegionCode=e,t.initPhoneFormatter(),t.onChange()},setRawValue:function(e){var t=this,r=t.properties;e=void 0!==e&&null!==e?e.toString():"",r.numeral&&(e=e.replace(".",r.numeralDecimalMark)),r.postDelimiterBackspace=!1,t.element.value=e,t.onInput(e)},getRawValue:function(){var e=this,t=e.properties,r=i.Util,n=e.element.value;return t.rawValueTrimPrefix&&(n=r.getPrefixStrippedValue(n,t.prefix,t.prefixLength,t.result,t.delimiter,t.delimiters)),n=t.numeral?t.numeralFormatter.getRawValue(n):r.stripDelimiters(n,t.delimiter,t.delimiters)},getISOFormatDate:function(){var e=this,t=e.properties;return t.date?t.dateFormatter.getISOFormatDate():""},getISOFormatTime:function(){var e=this,t=e.properties;return t.time?t.timeFormatter.getISOFormatTime():""},getFormattedValue:function(){return this.element.value},destroy:function(){var e=this;e.element.removeEventListener("input",e.onChangeListener),e.element.removeEventListener("keydown",e.onKeyDownListener),e.element.removeEventListener("focus",e.onFocusListener),e.element.removeEventListener("cut",e.onCutListener),e.element.removeEventListener("copy",e.onCopyListener)},toString:function(){return"[Cleave Object]"}},i.NumeralFormatter=r(1),i.DateFormatter=r(2),i.TimeFormatter=r(3),i.PhoneFormatter=r(4),i.CreditCardDetector=r(5),i.Util=r(6),i.DefaultProperties=r(7),("object"==typeof t&&t?t:window).Cleave=i,e.exports=i}).call(t,function(){return this}())},function(e,t){"use strict";var r=function(e,t,i,n,a,o,l,s,c){var u=this;u.numeralDecimalMark=e||".",u.numeralIntegerScale=t>0?t:0,u.numeralDecimalScale=i>=0?i:2,u.numeralThousandsGroupStyle=n||r.groupStyle.thousand,u.numeralPositiveOnly=!!a,u.stripLeadingZeroes=o!==!1,u.prefix=l||""===l?l:"",u.signBeforePrefix=!!s,u.delimiter=c||""===c?c:",",u.delimiterRE=c?new RegExp("\\"+c,"g"):""};r.groupStyle={thousand:"thousand",lakh:"lakh",wan:"wan",none:"none"},r.prototype={getRawValue:function(e){return e.replace(this.delimiterRE,"").replace(this.numeralDecimalMark,".")},format:function(e){var t,i,n,a,o=this,l="";switch(e=e.replace(/[A-Za-z]/g,"").replace(o.numeralDecimalMark,"M").replace(/[^\dM-]/g,"").replace(/^\-/,"N").replace(/\-/g,"").replace("N",o.numeralPositiveOnly?"":"-").replace("M",o.numeralDecimalMark),o.stripLeadingZeroes&&(e=e.replace(/^(-)?0+(?=\d)/,"$1")),i="-"===e.slice(0,1)?"-":"",n="undefined"!=typeof o.prefix?o.signBeforePrefix?i+o.prefix:o.prefix+i:i,a=e,e.indexOf(o.numeralDecimalMark)>=0&&(t=e.split(o.numeralDecimalMark),a=t[0],l=o.numeralDecimalMark+t[1].slice(0,o.numeralDecimalScale)),"-"===i&&(a=a.slice(1)),o.numeralIntegerScale>0&&(a=a.slice(0,o.numeralIntegerScale)),o.numeralThousandsGroupStyle){case r.groupStyle.lakh:a=a.replace(/(\d)(?=(\d\d)+\d$)/g,"$1"+o.delimiter);break;case r.groupStyle.wan:a=a.replace(/(\d)(?=(\d{4})+$)/g,"$1"+o.delimiter);break;case r.groupStyle.thousand:a=a.replace(/(\d)(?=(\d{3})+$)/g,"$1"+o.delimiter)}return n+a.toString()+(o.numeralDecimalScale>0?l.toString():"")}},e.exports=r},function(e,t){"use strict";var r=function(e,t,r){var i=this;i.date=[],i.blocks=[],i.datePattern=e,i.dateMin=t.split("-").reverse().map(function(e){return parseInt(e,10)}),2===i.dateMin.length&&i.dateMin.unshift(0),i.dateMax=r.split("-").reverse().map(function(e){return parseInt(e,10)}),2===i.dateMax.length&&i.dateMax.unshift(0),i.initBlocks()};r.prototype={initBlocks:function(){var e=this;e.datePattern.forEach(function(t){"Y"===t?e.blocks.push(4):e.blocks.push(2)})},getISOFormatDate:function(){var e=this,t=e.date;return t[2]?t[2]+"-"+e.addLeadingZero(t[1])+"-"+e.addLeadingZero(t[0]):""},getBlocks:function(){return this.blocks},getValidatedDate:function(e){var t=this,r="";return e=e.replace(/[^\d]/g,""),t.blocks.forEach(function(i,n){if(e.length>0){var a=e.slice(0,i),o=a.slice(0,1),l=e.slice(i);switch(t.datePattern[n]){case"d":"00"===a?a="01":parseInt(o,10)>3?a="0"+o:parseInt(a,10)>31&&(a="31");break;case"m":"00"===a?a="01":parseInt(o,10)>1?a="0"+o:parseInt(a,10)>12&&(a="12")}r+=a,e=l}}),this.getFixedDateString(r)},getFixedDateString:function(e){var t,r,i,n=this,a=n.datePattern,o=[],l=0,s=0,c=0,u=0,d=0,m=0,p=!1;4===e.length&&"y"!==a[0].toLowerCase()&&"y"!==a[1].toLowerCase()&&(u="d"===a[0]?0:2,d=2-u,t=parseInt(e.slice(u,u+2),10),r=parseInt(e.slice(d,d+2),10),o=this.getFixedDate(t,r,0)),8===e.length&&(a.forEach(function(e,t){switch(e){case"d":l=t;break;case"m":s=t;break;default:c=t}}),m=2*c,u=l<=c?2*l:2*l+2,d=s<=c?2*s:2*s+2,t=parseInt(e.slice(u,u+2),10),r=parseInt(e.slice(d,d+2),10),i=parseInt(e.slice(m,m+4),10),p=4===e.slice(m,m+4).length,o=this.getFixedDate(t,r,i)),4!==e.length||"y"!==a[0]&&"y"!==a[1]||(d="m"===a[0]?0:2,m=2-d,r=parseInt(e.slice(d,d+2),10),i=parseInt(e.slice(m,m+2),10),p=2===e.slice(m,m+2).length,o=[0,r,i]),6!==e.length||"Y"!==a[0]&&"Y"!==a[1]||(d="m"===a[0]?0:4,m=2-.5*d,r=parseInt(e.slice(d,d+2),10),i=parseInt(e.slice(m,m+4),10),p=4===e.slice(m,m+4).length,o=[0,r,i]),o=n.getRangeFixedDate(o),n.date=o;var h=0===o.length?e:a.reduce(function(e,t){switch(t){case"d":return e+(0===o[0]?"":n.addLeadingZero(o[0]));case"m":return e+(0===o[1]?"":n.addLeadingZero(o[1]));case"y":return e+(p?n.addLeadingZeroForYear(o[2],!1):"");case"Y":return e+(p?n.addLeadingZeroForYear(o[2],!0):"")}},"");return h},getRangeFixedDate:function(e){var t=this,r=t.datePattern,i=t.dateMin||[],n=t.dateMax||[];return!e.length||i.length<3&&n.length<3?e:r.find(function(e){return"y"===e.toLowerCase()})&&0===e[2]?e:n.length&&(n[2]<e[2]||n[2]===e[2]&&(n[1]<e[1]||n[1]===e[1]&&n[0]<e[0]))?n:i.length&&(i[2]>e[2]||i[2]===e[2]&&(i[1]>e[1]||i[1]===e[1]&&i[0]>e[0]))?i:e},getFixedDate:function(e,t,r){return e=Math.min(e,31),t=Math.min(t,12),r=parseInt(r||0,10),(t<7&&t%2===0||t>8&&t%2===1)&&(e=Math.min(e,2===t?this.isLeapYear(r)?29:28:30)),[e,t,r]},isLeapYear:function(e){return e%4===0&&e%100!==0||e%400===0},addLeadingZero:function(e){return(e<10?"0":"")+e},addLeadingZeroForYear:function(e,t){return t?(e<10?"000":e<100?"00":e<1e3?"0":"")+e:(e<10?"0":"")+e}},e.exports=r},function(e,t){"use strict";var r=function(e,t){var r=this;r.time=[],r.blocks=[],r.timePattern=e,r.timeFormat=t,r.initBlocks()};r.prototype={initBlocks:function(){var e=this;e.timePattern.forEach(function(){e.blocks.push(2)})},getISOFormatTime:function(){var e=this,t=e.time;return t[2]?e.addLeadingZero(t[0])+":"+e.addLeadingZero(t[1])+":"+e.addLeadingZero(t[2]):""},getBlocks:function(){return this.blocks},getTimeFormatOptions:function(){var e=this;return"12"===String(e.timeFormat)?{maxHourFirstDigit:1,maxHours:12,maxMinutesFirstDigit:5,maxMinutes:60}:{maxHourFirstDigit:2,maxHours:23,maxMinutesFirstDigit:5,maxMinutes:60}},getValidatedTime:function(e){var t=this,r="";e=e.replace(/[^\d]/g,"");var i=t.getTimeFormatOptions();return t.blocks.forEach(function(n,a){if(e.length>0){var o=e.slice(0,n),l=o.slice(0,1),s=e.slice(n);switch(t.timePattern[a]){case"h":parseInt(l,10)>i.maxHourFirstDigit?o="0"+l:parseInt(o,10)>i.maxHours&&(o=i.maxHours+"");break;case"m":case"s":parseInt(l,10)>i.maxMinutesFirstDigit?o="0"+l:parseInt(o,10)>i.maxMinutes&&(o=i.maxMinutes+"")}r+=o,e=s}}),this.getFixedTimeString(r)},getFixedTimeString:function(e){var t,r,i,n=this,a=n.timePattern,o=[],l=0,s=0,c=0,u=0,d=0,m=0;return 6===e.length&&(a.forEach(function(e,t){switch(e){case"s":l=2*t;break;case"m":s=2*t;break;case"h":c=2*t}}),m=c,d=s,u=l,t=parseInt(e.slice(u,u+2),10),r=parseInt(e.slice(d,d+2),10),i=parseInt(e.slice(m,m+2),10),o=this.getFixedTime(i,r,t)),4===e.length&&n.timePattern.indexOf("s")<0&&(a.forEach(function(e,t){switch(e){case"m":s=2*t;break;case"h":c=2*t}}),m=c,d=s,t=0,r=parseInt(e.slice(d,d+2),10),i=parseInt(e.slice(m,m+2),10),o=this.getFixedTime(i,r,t)),n.time=o,0===o.length?e:a.reduce(function(e,t){switch(t){case"s":return e+n.addLeadingZero(o[2]);case"m":return e+n.addLeadingZero(o[1]);case"h":return e+n.addLeadingZero(o[0])}},"")},getFixedTime:function(e,t,r){return r=Math.min(parseInt(r||0,10),60),t=Math.min(t,60),e=Math.min(e,60),[e,t,r]},addLeadingZero:function(e){return(e<10?"0":"")+e}},e.exports=r},function(e,t){"use strict";var r=function(e,t){var r=this;r.delimiter=t||""===t?t:" ",r.delimiterRE=t?new RegExp("\\"+t,"g"):"",r.formatter=e};r.prototype={setFormatter:function(e){this.formatter=e},format:function(e){var t=this;t.formatter.clear(),e=e.replace(/[^\d+]/g,""),e=e.replace(/^\+/,"B").replace(/\+/g,"").replace("B","+"),e=e.replace(t.delimiterRE,"");for(var r,i="",n=!1,a=0,o=e.length;a<o;a++)r=t.formatter.inputDigit(e.charAt(a)),/[\s()-]/g.test(r)?(i=r,n=!0):n||(i=r);return i=i.replace(/[()]/g,""),i=i.replace(/[\s-]/g,t.delimiter)}},e.exports=r},function(e,t){"use strict";var r={blocks:{uatp:[4,5,6],amex:[4,6,5],diners:[4,6,4],discover:[4,4,4,4],mastercard:[4,4,4,4],dankort:[4,4,4,4],instapayment:[4,4,4,4],jcb15:[4,6,5],jcb:[4,4,4,4],maestro:[4,4,4,4],visa:[4,4,4,4],mir:[4,4,4,4],unionPay:[4,4,4,4],general:[4,4,4,4]},re:{uatp:/^(?!1800)1\d{0,14}/,amex:/^3[47]\d{0,13}/,discover:/^(?:6011|65\d{0,2}|64[4-9]\d?)\d{0,12}/,diners:/^3(?:0([0-5]|9)|[689]\d?)\d{0,11}/,mastercard:/^(5[1-5]\d{0,2}|22[2-9]\d{0,1}|2[3-7]\d{0,2})\d{0,12}/,dankort:/^(5019|4175|4571)\d{0,12}/,instapayment:/^63[7-9]\d{0,13}/,jcb15:/^(?:2131|1800)\d{0,11}/,jcb:/^(?:35\d{0,2})\d{0,12}/,maestro:/^(?:5[0678]\d{0,2}|6304|67\d{0,2})\d{0,12}/,mir:/^220[0-4]\d{0,12}/,visa:/^4\d{0,15}/,unionPay:/^62\d{0,14}/},getStrictBlocks:function(e){var t=e.reduce(function(e,t){return e+t},0);return e.concat(19-t)},getInfo:function(e,t){var i=r.blocks,n=r.re;t=!!t;for(var a in n)if(n[a].test(e)){var o=i[a];return{type:a,blocks:t?this.getStrictBlocks(o):o}}return{type:"unknown",blocks:t?this.getStrictBlocks(i.general):i.general}}};e.exports=r},function(e,t){"use strict";var r={noop:function(){},strip:function(e,t){return e.replace(t,"")},getPostDelimiter:function(e,t,r){if(0===r.length)return e.slice(-t.length)===t?t:"";var i="";return r.forEach(function(t){e.slice(-t.length)===t&&(i=t)}),i},getDelimiterREByDelimiter:function(e){return new RegExp(e.replace(/([.?*+^$[\]\\(){}|-])/g,"\\$1"),"g")},getNextCursorPosition:function(e,t,r,i,n){return t.length===e?r.length:e+this.getPositionOffset(e,t,r,i,n)},getPositionOffset:function(e,t,r,i,n){var a,o,l;return a=this.stripDelimiters(t.slice(0,e),i,n),o=this.stripDelimiters(r.slice(0,e),i,n),l=a.length-o.length,0!==l?l/Math.abs(l):0},stripDelimiters:function(e,t,r){var i=this;if(0===r.length){var n=t?i.getDelimiterREByDelimiter(t):"";return e.replace(n,"")}return r.forEach(function(t){t.split("").forEach(function(t){e=e.replace(i.getDelimiterREByDelimiter(t),"")})}),e},headStr:function(e,t){return e.slice(0,t)},getMaxLength:function(e){return e.reduce(function(e,t){return e+t},0)},getPrefixStrippedValue:function(e,t,r,i,n,a){if(0===r)return e;if(i.slice(0,r)!==t)return"";var o=this.stripDelimiters(i,n,a);return e.slice(0,r)!==t?o.slice(r):e.slice(r)},getFirstDiffIndex:function(e,t){for(var r=0;e.charAt(r)===t.charAt(r);)if(""===e.charAt(r++))return-1;return r},getFormattedValue:function(e,t,r,i,n,a){var o,l="",s=n.length>0;return 0===r?e:(t.forEach(function(t,c){if(e.length>0){var u=e.slice(0,t),d=e.slice(t);o=s?n[a?c-1:c]||o:i,a?(c>0&&(l+=o),l+=u):(l+=u,u.length===t&&c<r-1&&(l+=o)),e=d}}),l)},fixPrefixCursor:function(e,t,r,i){if(e){var n=e.value,a=r||i[0]||" ";if(e.setSelectionRange&&t&&!(t.length+a.length<n.length)){var o=2*n.length;setTimeout(function(){e.setSelectionRange(o,o)},1)}}},checkFullSelection:function(e){try{var t=window.getSelection()||document.getSelection()||{};return t.toString().length===e.length}catch(r){}return!1},setSelection:function(e,t,r){if(e===this.getActiveElement(r)&&!(e&&e.value.length<=t))if(e.createTextRange){var i=e.createTextRange();i.move("character",t),i.select()}else try{e.setSelectionRange(t,t)}catch(n){console.warn("The input element type does not support selection")}},getActiveElement:function(e){var t=e.activeElement;return t&&t.shadowRoot?this.getActiveElement(t.shadowRoot):t},isAndroid:function(){return navigator&&/android/i.test(navigator.userAgent)},isAndroidBackspaceKeydown:function(e,t){return!!(this.isAndroid()&&e&&t)&&t===e.slice(0,-1)}};e.exports=r},function(e,t){(function(t){"use strict";var r={assign:function(e,r){return e=e||{},r=r||{},e.creditCard=!!r.creditCard,e.creditCardStrictMode=!!r.creditCardStrictMode,e.creditCardType="",e.onCreditCardTypeChanged=r.onCreditCardTypeChanged||function(){},e.phone=!!r.phone,e.phoneRegionCode=r.phoneRegionCode||"AU",e.phoneFormatter={},e.time=!!r.time,e.timePattern=r.timePattern||["h","m","s"],e.timeFormat=r.timeFormat||"24",e.timeFormatter={},e.date=!!r.date,e.datePattern=r.datePattern||["d","m","Y"],e.dateMin=r.dateMin||"",e.dateMax=r.dateMax||"",e.dateFormatter={},e.numeral=!!r.numeral,e.numeralIntegerScale=r.numeralIntegerScale>0?r.numeralIntegerScale:0,e.numeralDecimalScale=r.numeralDecimalScale>=0?r.numeralDecimalScale:2,e.numeralDecimalMark=r.numeralDecimalMark||".",e.numeralThousandsGroupStyle=r.numeralThousandsGroupStyle||"thousand",e.numeralPositiveOnly=!!r.numeralPositiveOnly,e.stripLeadingZeroes=r.stripLeadingZeroes!==!1,e.signBeforePrefix=!!r.signBeforePrefix,e.numericOnly=e.creditCard||e.date||!!r.numericOnly,e.uppercase=!!r.uppercase,e.lowercase=!!r.lowercase,e.prefix=e.creditCard||e.date?"":r.prefix||"",e.noImmediatePrefix=!!r.noImmediatePrefix,e.prefixLength=e.prefix.length,e.rawValueTrimPrefix=!!r.rawValueTrimPrefix,e.copyDelimiter=!!r.copyDelimiter,e.initValue=void 0!==r.initValue&&null!==r.initValue?r.initValue.toString():"",e.delimiter=r.delimiter||""===r.delimiter?r.delimiter:r.date?"/":r.time?":":r.numeral?",":(r.phone," "),e.delimiterLength=e.delimiter.length,e.delimiterLazyShow=!!r.delimiterLazyShow,e.delimiters=r.delimiters||[],e.blocks=r.blocks||[],e.blocksLength=e.blocks.length,e.root="object"==typeof t&&t?t:window,e.document=r.document||e.root.document,e.maxLength=0,e.backspace=!1,e.result="",e.onValueChanged=r.onValueChanged||function(){},e}};e.exports=r}).call(t,function(){return this}())}])});

/**
 * Various formatting of objects.
 *
 * @requires
 *     jquery
 *
 */

var Format = (function ()
{
    /** Public functions and state. */
    var pub = {};



    /**
     * Formats the address of a property.
     *
     * @param property
     *        Property to format.
     *
     * @return An string in the form "AddressLine1 AddressLine2, City, Zip".
     */

    pub.Address = function (property)
    {
        return (property.AddressLine1 + " " + property.AddressLine2).trim() + ", " + property.City + ", " + property.Zip;
    }



    /**
     * Formats an adjustment item name.
     *
     * @param name
     *        Identifies the adjustment.
     *
     * @return The display name of the adjustment.
     */

    pub.AdjustmentName = function (name)
    {
        var text = name;

        $.each(haModel.Adjustments, function (key, adjustment)
        {
            if (adjustment.Name == name)
                text = adjustment.DisplayText;
        });

        return text;
    }



    /**
     * Formats the address of a property.
     *
     * @param property
     *        Property to format.
     *
     * @return A string in the form "BedroomCount/FullBathCount/HalfBathCount".
     */

    pub.BedBath = function (property)
    {
        var halfBath = property.HalfBathCount;

        if (halfBath == null || halfBath == "")
            halfBath = 0;

        return property.BedroomCount + " / " + property.FullBathCount + " / " + halfBath;
    }



    /**
     * Formats the address of a property.
     *
     * @param property
     *        Property to format.
     *
     * @return A string in the form "BedroomCount/FullBathCount/HalfBathCount".
     */

    pub.BedBathJS = function (property)
    {
        var halfBath = property.HalfBathCount;

        if (halfBath == null || halfBath == "")
            halfBath = 0;

        return property.BedroomCount + " / " + property.FullBathCount + " / " + halfBath;
    }



    /**
     * Replaces a DDE code with the corresponding display text.
     */

    pub.dde = function (dde, code)
    {
        for (var i = 0; i < dde.length; i++)
            if (dde[i].Code == code)
                return dde[i].Name;

        return '[' + code + ']';
    }



    /**
     * shows "N/A" if it's null or empty
     */

    pub.ShowNAIfEmpty = function (val) {
        if (val == null || val == "")
        {
            return "N/A";
        }
        else
        {
            return val;
        }
    }

    /**
         * Formats the date/time to display mm/dd/yyyy
         *
         * @param date
         *        String representation of a date or dateTime.  May be null or 1900-01-01T00:00:00
         *
         * @return A string in the form "mm/dd/yyyy" or empty string if null or 1900-01-01T00:00:00
         */

    pub.ShortDate = function (date) {
        try {
            var text = "";

            if (date != null && date != "1900-01-01T00:00:00") {
                var d = new Date(date);
                text = [
                  ('0' + (d.getUTCMonth() + 1)).slice(-2),
                  ('0' + d.getUTCDate()).slice(-2),
                  d.getUTCFullYear()
                ].join('/');
            }
            return text;
        }
        catch (ex) {
            go8Error.handleException(ex);
        }
    }

    /**
     * Formats decimal into percentage
     *
     * @param date
     *        decimal number
     *
     * @return A string in the form 95%
     */

    pub.Percentage = function (number) {
        try {
            var text = Math.floor(number * 100) + "%";
            return text;
        }
        catch (ex) {
            go8Error.handleException(ex);
        }
    }


    /**
     * Formats the date/time for use in serialization across the network.
     *
     * @param dateAsMsSinceEpoch
     *        Date to format.  May be null.
     *
     * @return A string in the form "M/D/YYYY h:mm:ss am/pm" or null if dateAsMsSinceEpoch is null.
     */

    pub.DateTimeForSerialization = function (dateAsMsSinceEpoch)
    {
        var text = null;

        if (dateAsMsSinceEpoch != null)
        {
            var date = new Date(dateAsMsSinceEpoch);
            text = date.toLocaleDateString() + " " + date.toLocaleTimeString();
        }

        return text;
    }

    /**
    * Formats dollars with currency with cents displayed.
    *
    * @param value
    *        Value to format.
    */

    pub.FormatDollarsWithCents = function (value, minimumFractionDigits) {
        var rounded = pub.RoundToDigit(value, minimumFractionDigits);
        var fixed = rounded.toFixed(minimumFractionDigits);
        var sign = fixed < 0 ? "-" : "";
        var text = sign + "$" + pub.Number(Math.abs(fixed), 1, minimumFractionDigits, true);
        return text;
    }

    /**
     * Formats dollars with currency and rounded to the dollar.  No cents are displayed.
     *
     * @param value
     *        Value to format.
     */

    pub.FormatDollars = function (value)
    {
        var rounded = Math.round(value);
        var fixed = rounded.toFixed(0);
        var sign = fixed < 0 ? "-" : "";
        var text = sign + "$" + pub.Number(Math.abs(fixed), 1, 0, true);
        return text;
    }



    /**
     * Formats a number with leading and trailing zeros.
     *
     * @param value
     *        Some number.
     * @param minimumIntegerDigits
     *        Fills in leading zeros to satisfy.  For example, 005 has three integer digits.
     * @param minimumFractionDigits
     *        Fills in trailing zeros to satisfy.  For example, 5.00 has two fraction zeros.
     * @param useGrouping
     *        If true, use digit grouping.  This means commas for every three integer digits.
     */

    pub.Number = function (value, minimumIntegerDigits, minimumFractionDigits, useGrouping)
    {
        var text = value.toLocaleString('en-US',
        {
            style: 'decimal',
            minimumIntegerDigits: minimumIntegerDigits,
            minimumFractionDigits: minimumFractionDigits,
            useGrouping: useGrouping
        });

        return text;
    }



    /**
     * Formats the property type enumaration.
     *
     * @param enumValue
     *        A property type.
     */

    pub.PropertyType = function (enumValue)
    {
        var text = enumValue ;

        $.each(haModel.PropertyTypes, function (key, propertyType)
        {
            if (propertyType.Name == enumValue || propertyType.Value == enumValue)
                text = propertyType.DisplayText;
        });

        return text;
    }



    /**
     * Rounds a decimal to a given number of digits.
     *
     * @param value
     *        Value being rounded.
     * @param numDigit
     *        Number of digits to keep.
     *
     * @return The rounded number.
     */

    pub.RoundToDigit = function (value, numDigit)
    {
        var factor = Math.pow(10, numDigit);
        value = Math.round(factor * value) / factor;
        return value;
    }



    /**
     * Formats the similarity and credibility fields of a property.
     *
     * @param property
     *        Property to format.
     *
     * @return A string in the form "90%".
     */

    pub.SimCred = function (value)
    {
        return pub.RoundToDigit(100 * value, 0) + "%";
    }



    // TODO: Remove this function.  Replace all calls to this with calls to format currency.
    /**
     * Formats a number with more than 2 0's.
     *
     * @param string.
     *        String to format.
     *
     * @return A string in the form "1,000".
     */

    pub.AddCommas = function (str)
    {
        str += '';
        x = str.split('.');
        x1 = x[0];
        x2 = x.length > 1 ? '.' + x[1] : '';
        var rgx = /(\d+)(\d{3})/;
        while (rgx.test(x1))
        {
            x1 = x1.replace(rgx, '$1' + ',' + '$2');
        }
        return x1 + x2;
    }


    /**
     * Formats a decimal to condition/quality rating text
     *
     * @param decimal.
     *        decimal to format.
     *
     * @return A string in the form "Average", "Above Average", etc.
     */

    pub.Rating = function (dec) {
        var text = dec;

        $.each(haModel.QualityRatings, function (key, rating) {
            if (rating.Name == dec || rating.Value == dec)
                text = rating.DisplayText;
        });

        return text;
    }

    /**
     * implements String.Format({0}, x)
     *
     */
    pub.StringFormat = function () {
        // The string containing the format items (e.g. "{0}")
        // will and always has to be the first argument.
        var theString = arguments[0];

        // start with the second argument (i = 1)
        for (var i = 1; i < arguments.length; i++) {
            // "gm" = RegEx options for Global search (more than one instance)
            // and for Multiline search
            var regEx = new RegExp("\\{" + (i - 1) + "\\}", "gm");
            theString = theString.replace(regEx, arguments[i]);
        }

        return theString;
    }

    /**
     * format date to mm/dd/yyyy
     *
     */
    pub.formatDate = function(d)
    {
        try
        {
            return (d.getMonth() + 1) + '/' + d.getDate() + '/' + d.getFullYear();
        } catch (ex)
        {
            go8Error.handleException(ex);
        }
    }


    /**
     * format phone number to (999) 999-9999
     *
     */
    pub.formatPhone = function(text)
    {
        try
        {
            return text.replace(/(\d{3})(\d{3})(\d{4})/, "($1) $2-$3");
        }
        catch (ex)
        {
            go8Error.handleException(ex);
        }
    }

    /**
     * format rating: null -> null; "0.050" -> 0.05
     *
     */
    pub.formatRating = function (rating)
    {
        try
        {
            if (rating == null || rating == undefined)
            {
                return null;
            }
            return parseFloat(rating);
        }
        catch (ex)
        {
            go8Error.handleException(ex);
        }
    }

    return pub;
}
());


var tenant = (function () {
    var pub = {};

    /**
     * Make an AJAX call.  All AJAX calls should go through this function.
     *
     * @param messageName
     *        Message to send to server.  For example, CorrectAddress.
     * @param message
     *        This parameter is translated into JSON and sent in the HTTP body.  Default: emptyString.
     * @param onSuccess
     *        Callback on success.
     * @param onFailure
     *        Callback on failure.
     * @param isRW5
     *        Type of data expected back.  Default: json.
     * @param dataType
     *        Type of data expected back.  Default: json.
     *
     */

    pub.ajax = ajax;
    function ajax(messageName, message, onSuccess, onFailure, dataType) {
        if (dataType === undefined || dataType === null)
            dataType = "json";

        var data = message === undefined || message === null ? "" : JSON.stringify(message);

        var path = "/v4/AjaxHandler";

        if (data.indexOf('<') >= 0 || data.indexOf('>') >= 0 || data.indexOf('&lt;') >= 0 || data.indexOf('&gt;') >= 0) {
            console.log("Cross-site script exploit attempt detected.  Ignoring request.");
        }
        else {
            $.ajax
            ({
                type: "post",
                url: path + "?message=" + messageName,
                contentType: "application/json; charset=utf-8",
                dataType: dataType,
                data: data,
                success: onSuccess,
                error: onFailure
            });
        }
    }

    pub.isTenantLoggedIn = function (isTenantLoggedInOnSuccess, isTenantLoggedInOnFailure) {
        var message = {};
        ajax("IsTenantLoggedIn", message, isTenantLoggedInOnSuccess, isTenantLoggedInOnFailure);
    }

    pub.haveTenantPhone = function(haveTenantPhoneOnSuccess, haveTenantPhoneOnFailure)
    {
        var message = {};
        ajax("HaveTenantPhone", message, haveTenantPhoneOnSuccess, haveTenantPhoneOnFailure);
    }
    pub.savePhoneNumber = function (phoneNumber, savePhoneNumberOnSuccess, savePhoneNumberOnFailure) {
        var message =
        {
            PhoneNumber : phoneNumber
        };
        ajax("SaveTenantPhone", message, savePhoneNumberOnSuccess, savePhoneNumberOnFailure);
    }

    pub.isPhoneUnsubscribedAtProviderLevel = function (isPhoneUnsubscribedAtProviderLevelOnSuccess, isPhoneUnsubscribedAtProviderLevelOnFailure) {
        var message = {};
        ajax("IsPhoneUnsubscribedAtProviderLevel", message, isPhoneUnsubscribedAtProviderLevelOnSuccess, isPhoneUnsubscribedAtProviderLevelOnFailure);
    }

    pub.sendConfirmationCodeForPhoneVarification = function (sendConfirmationCodeForPhoneVarificationOnSuccess, sendConfirmationCodeForPhoneVarificationOnFailure) {
        var message = {};
        ajax("SendConfirmationCodeForPhoneVarification", message, sendConfirmationCodeForPhoneVarificationOnSuccess, sendConfirmationCodeForPhoneVarificationOnFailure);
    }

    pub.verifyConfirmationCodeForPhoneVarification = function (confirmationCode, verifyConfirmationCodeForPhoneVarificationOnSuccess, verifyConfirmationCodeForPhoneVarificationOnFailure) {
        var message =
        {
            ConfirmationCode: confirmationCode
        }
        ajax("VerifyConfirmationCodeForPhoneVarification", message, verifyConfirmationCodeForPhoneVarificationOnSuccess, verifyConfirmationCodeForPhoneVarificationOnFailure);
    }

    pub.getTenant = function (GetTenantOnSuccess, GetTenantOnFailure) {
        var message = {}
        ajax("GetTenant", message, GetTenantOnSuccess, GetTenantOnFailure);
    }
    pub.saveSearchFilter = function (city, county, state, zip, minRent, maxRent, propertyTypeValues, bedroomValues, numberOfBathroom,
        minSquareFeet, maxSquareFeet, keyword, isAccessible, isAgeRestricted, isPicOnly, isSmockingAllowed, isPetsAllowed,
        hasCoveredParking, hasAirConditioning,
        SaveSearchFilterOnSuccess, SaveSearchFilterOnFailure)
    {
        var message = 
        {
            City: city,
            County: county,
            State: state,
            Zip: zip,
            MinRent: minRent,
            MaxRent: maxRent,
            PropertyTypeValues: propertyTypeValues,
            BedroomValues: bedroomValues,
            NumberOfBathroom: numberOfBathroom,
            MinSquareFeet: minSquareFeet,
            MaxSquareFeet: maxSquareFeet,
            Keyword: keyword,
            IsAccessible: isAccessible,
            IsAgeRestricted: isAgeRestricted,
            IsPicOnly: isPicOnly,
            IsSmockingAllowed: isSmockingAllowed,
            IsPetsAllowed: isPetsAllowed,
            HasCoveredParking: hasCoveredParking,
            HasAirconditioning: hasAirConditioning

        }
        ajax("SaveSearchFilter", message, SaveSearchFilterOnSuccess, SaveSearchFilterOnFailure);
    }

    pub.getTextOptedPhone = function (GetTextOptedPhoneOnSuccess, GetTextOptedPhoneOnFailure) {
        var message = {}
        ajax("GetTextOptedPhone", message, GetTextOptedPhoneOnSuccess, GetTextOptedPhoneOnFailure);
    }
    return pub;
}
());

/**
 * Script: locationHelper.js
 *
 * @requires
 *     jquery
 */

var locationHelper = (function () {
    try {

        var pub = {};

        var appendedCountyText = ' County';
        var appendedParishText = ' Parish';
        var maxSuggestionsToSave = 10;

        /**
        * Convert from Abbreviation to Full Area Name
        */
        pub.convertFromAbbreviationAreaName = function (areaName) {
            // Adding space for 'Mt.' => 'Mount ' to avoid Mountain records.
            // Adding space for 'Mt. ' => 'Mount ' No extra space if user already inserted space while searching.

            // Find a whole word pattern for an abbreviation anywhere in the input name. (Saint, Mount, Fort)
            if (/\b[smf]t[. ]/i.test(areaName)) {
                var aname = areaName.replace(/\bst[.]?\s/i, 'Saint '); // Replace any full word Saint abbreviation (st, st., St., etc) with Saint
                aname = aname.replace(/\bmt[.]?\s/i, 'Mount '); // Repeat with Mount and Fort
                return aname.replace(/\bft[.]?\s/i, 'Fort ');
            }
            else {
                return areaName;
            }
        }

        /**
        * Convert to Abbreviation to Full Area Name
        */
        pub.convertToAbbreviationAreaName = function (areaName) {
            return areaName.replace('Saint', 'St.').replace('Fort', 'Ft.').replace(/\bMount\b/, 'Mt.');
        }

        /**
        * Convert to Abbreviation to Full Area Name with Space
        */
        pub.convertToAbbreviationAreaNameWithSpace = function (areaName) {
            return areaName.replace('Saint', 'St').replace('Fort', 'Ft').replace(/\bMount\b/, 'Mt');
        }

        /**
        * Remove all white space as well as ignore comma(,) and dash(-) to match with Free form text.
        */
        pub.matchWithFreeFormText = function (searchText) {
            if (helper.isUndefinedOrNullOrEmpty(searchText))
                return '';

            return searchText.replace(/,|-/g, ' ').replace(/\s+/g, ' ');
        }

        /**
        * replace StateCode with StateName for Address to match with Free form text.
        */
        pub.replaceStateCodeWithStateNameForAddress = function (areaName, stateCode, stateName) {
            return areaName.replace(', ' + stateCode + ',', ', ' + stateName + ',');
        }

        /**
        * replace StateCode with StateName for Community to match with Free form text.
        */
        pub.replaceStateCodeWithStateNameForCommunity = function (areaName, stateCode, stateName) {
            return areaName.replace(', ' + stateCode + ' (', ', ' + stateName + ' (');
        }

        /**
        * Add county keyword in area name
        */
        pub.addCountyText = function (areanName, statecode) {

            if (!helper.isUndefinedOrNullOrEmpty(areanName) && !helper.isUndefinedOrNullOrEmpty(statecode)) {
                if (statecode.toLowerCase() == 'la' || statecode.toLowerCase() == 'louisiana') {
                    return !(areanName.indexOf(appendedParishText) !== -1) ? areanName + appendedParishText : areanName;
                }
                else {
                    return !(areanName.indexOf(appendedCountyText) !== -1) ? areanName + appendedCountyText : areanName;
                }
            }
            else {
                return areanName;
            }
        }

        /**
        * Remove county keyword from area name
        */
        pub.removeCountyText = function (areaName) {
            if (areaName != null) {
                return areaName.replace(appendedCountyText, '').replace(appendedParishText, '');
            }
        };

        /**
        * Check if passed location exists in passed array
        */
        pub.checkLocationExistsInArray = function (citem, itemArray) {
            var isexists = false;
            for (var i = 0; i < itemArray.length; i++) {
                if (itemArray[i].isCommunity !== true && itemArray[i].areaName == citem.areaName && itemArray[i].stateCode == citem.stateCode) {
                    isexists = true;
                    break;
                }

                if (itemArray[i].isCommunity === true && itemArray[i].communityId > 0 && citem.communityId == itemArray[i].communityId) {
                    isexists = true;
                    break;
                }
            }

            return isexists;
        }

        function applyStateString(inputString) {
            var stateString = inputString.toLowerCase().replace("</em>", "").replace("(community)", "").trim();
            return (stateString.length < 3 || /\s*[a-zA-Z]{2} [0-9]{5}$/.test(inputString)) ? inputString.toUpperCase() : helper.toTitleCase(inputString);
        }

        pub.applyLocationCapitalization = function (location) {

            var fullText = location.split(',');
            var result = location;

            if (fullText.length > 0) {

                var zipcodePattern = /^[0-9]{5}$/;
                var addressPattern = /^[0-9]+.*/;
                var part1 = fullText[0];

                var isZip = false;
                var isAddress = false;
                var isCommunity = false;

                if (!helper.isUndefinedOrNullOrEmpty(part1)) {
                    isZip = (part1.match(zipcodePattern) != null);
                    isAddress = (part1.match(addressPattern) != null);
                }

                if (!helper.isUndefinedOrNullOrEmpty(fullText[fullText.length - 1])) {
                    isCommunity = helper.strContainsNoCase(fullText[fullText.length - 1], 'Community');
                }

                if (fullText.length == 1) {
                    // Only City or County or Zip
                    result = helper.toTitleCase(location);
                }
                else if (isZip && fullText.length == 2) {
                    // Zip + City or County
                    result = fullText[0] + "," + helper.toTitleCase(fullText[1]);
                }
                else if (isAddress && fullText.length == 2) {
                    result = helper.toTitleCase(fullText[0]) + "," + helper.toTitleCase(fullText[1]);
                }
                else if (fullText.length == 2) {
                    // City or County + StateCode
                    result = helper.toTitleCase(fullText[0]) + "," + applyStateString(fullText[1]);
                }
                else if (isZip && fullText.length == 3) {
                    // Zip, City, StateCode
                    result = helper.toTitleCase(fullText[0]) + "," + helper.toTitleCase(fullText[1]) + "," + applyStateString(fullText[2]);
                }
                else if (isCommunity && fullText.length == 3) {
                    // Community
                    result = helper.toTitleCase(fullText[0]) + "," + helper.toTitleCase(fullText[1]) + "," + applyStateString(fullText[2]).replace("COMMUNITY", "Community");
                }
                else if (fullText.length == 3) {
                    result = helper.toTitleCase(fullText[0]) + "," + helper.toTitleCase(fullText[1]) + "," + applyStateString(fullText[2]);
                }
                else {
                    // Street, City, State, ZIP [(Community Name)] and Community name in title case
                    result = helper.toTitleCase(fullText[0]) + "," + helper.toTitleCase(fullText[1]) + "," + applyStateString(fullText[2]) + "," + helper.toTitleCase(fullText[3]).replace(new RegExp("([(][A-Z,a-z])", "g"), function ($1) {
                        return $1.toUpperCase();
                    });
                }
            }
            return result;
        }

        /**
        * get detailed address for current address item.
        */
        pub.getDetailedAddressItem = function (itemObject)
        {
            let zipRegEx = /([0-9]+)/;

            var arrAddress = itemObject.areaName.split(',');
            if (arrAddress.length > 3) {
                var zipCode = null;

                if (zipRegEx.exec(arrAddress[3]) != null) {
                    zipCode = zipRegEx.exec(arrAddress[3])[0];
                } else if (zipRegEx.exec(arrAddress[0]) != null) {
                    zipCode = zipRegEx.exec(arrAddress[0])[0];
                }

                var addressItem = {
                    addressLine: arrAddress[0] + ',' + arrAddress[1].trim(),
                    cityName: arrAddress[2].trim(),
                    stateCode: itemObject.stateCode,
                    stateName: itemObject.stateName,
                    zipCode: zipCode
                };
                return addressItem;
            }
            else if (arrAddress.length > 2) {
                var zipCode = zipRegEx.exec(arrAddress[2]);
                if (zipCode != null) {
                    zipCode = zipCode[0];
                }

                var addressItem = {
                    addressLine: arrAddress[0].trim(),
                    cityName: arrAddress[1].trim(),
                    stateCode: itemObject.stateCode,
                    stateName: itemObject.stateName,
                    zipCode: zipCode
                };
                return addressItem;
            }

            return null;
        }
        
        /**
        * add current location item in Recent search cookie.
        */
        pub.addRecentSearchItem = function (baseAreaName, areaName, areaType, stateCode, stateName, communityId) {
            var recentSearchItem = {
                stateCode: stateCode,
                stateName: stateName,
                areaType: areaType,
                areaTitle: areaType,
                baseAreaName: baseAreaName,
                areaName: areaName,
                isExactMatch: false,
                matchCount: 0,
                communityId: communityId,
                isCommunity: areaType == 'neighborhood',
                isLoggedUserCookie: !helper.isUndefinedOrNullOrEmpty(headerModel.domain.user()) ? true : false
            };

            /* Get existing items from cookie */
            var suggestionsRecent = JSON.parse($.cookie(recentSearchCookieName));
            if (suggestionsRecent == null || suggestionsRecent == undefined) {
                suggestionsRecent = [];
            }

            /* Remove if this recentSearchItem already exists in recent suggestion. */
            if (suggestionsRecent.length > 0)
            {
                suggestionsRecent.forEach(function (item, index, array)
                {
                    if (typeof item.isLoggedUserCookie == "undefined")
                    {
                        item.isLoggedUserCookie = false;
                    }

                    /* remove if this recentSearchItem already exists in recent suggestion. */
                    if (item.isCommunity !== true && item.areaName == recentSearchItem.areaName && item.stateCode == recentSearchItem.stateCode) {
                        array.splice(index, 1);
                    }

                    if (item.isCommunity === true && item.communityId > 0 && recentSearchItem.communityId == item.communityId) {
                        array.splice(index, 1);
                    }
                });
            }

            /* Add recent search item in cookie at index 0 */
            suggestionsRecent.splice(0, 0, recentSearchItem);

            /* Remove extra suggestions if exceeds max limit of maxSuggestionsToSave */
            suggestionsRecent = suggestionsRecent.slice(0, maxSuggestionsToSave);

            suggestionsRecent = _.uniqBy(suggestionsRecent, 'areaName');
            suggestionsRecent = _.orderBy(suggestionsRecent, ['isLoggedUserCookie'], ['desc']);
            if (suggestionsRecent.length > 10)
            {
                suggestionsRecent = _.take(suggestionsRecent, 10);
            }

            /* Update cookie value */
           
            if (suggestionsRecent.length > 0)
                $.cookie(recentSearchCookieName, JSON.stringify(suggestionsRecent), { expires: 30, path: '/', secure: true });
            else
                $.cookie(recentSearchCookieName, "", { expires: -1, path: '/', secure: true });
            /* If Tenant user is logged in then save recent search in Database as well.  */
            if (headerModel.domain.user())
            {
                try {
                    //// Firefox browser does not send requests due to the redirection just after this API call.
                    //// navigator.sendBeacon handling this situation in all browsers except IE internet explorer.
                    ////https://developer.mozilla.org/en-US/docs/Web/API/Navigator/sendBeacon
                    //// If internet explored browser will detect then in the catch section the traditional code will fire.
                    var message = { searchedLocation: recentSearchItem.areaName, searchedLocationText: JSON.stringify(recentSearchItem) };
                    navigator.sendBeacon('/v4/AjaxHandler?message=SaveRecentSearchLocations', JSON.stringify(message));
                } catch (e) {
                    listing.saveUserRecentSearchLocations(recentSearchItem.areaName, JSON.stringify(recentSearchItem));
                }
            }
        }

        return pub;
    }
    catch (ex) {
        go8Error.handleException(ex);
    }
}());

/**
 * Common error handling code.
 *
 * @requires
 *     jquery
 *     MessageDialog
 *
 * @author Daniel E. Barbalace
 */

var go8Error = (function ()
{
    /** Public functions and state. */
    var pub = {};



    /**
     * Formats the property type enumaration.
     *
     * @param exception
     *        An exception
     */

    /**
     * Throws an exception.
     */

    pub.throwException = function (message)
    {
        throw {
            message: message,
            toString: function () { this.message; }
        };
    }



    /**
     * Handles exceptions.  Just reports in a new window for now.
     */

    pub.handleException = function (ex)
    {
        var html =
            "<div>" +
            "<div style='font-weight: bold'>Error</div><br />" +
            "<div>" + ex.message + "</div><br />";

        if (ex.stack)
        {
            html +=
                "<table><tr style='background-color: #C1D4FF'>" +
                "<td style='padding-left: 1em'><b>Function</b></td>" +
                "<td><b>Line</b></td>" +
                "<td><b>Col</b></td>" +
                "<td style='padding-right: 1em'><b>Script</b></td>" +
                "</tr>";

            var lines = ex.stack.replace(new RegExp("</", 'g'), ".").split("\n");

            $.each(lines, function (index, line)
            {
                var token1 = line.indexOf('@');
                var token3 = line.lastIndexOf(':');
                var token2 = line.lastIndexOf(':', token3 - 1);
                var color = index % 2 == 0 ? "#E1EAFF" : "#D7E3FF";

                html +=
                    "<tr style='background-color: " + color + "'>" +
                    "<td style='padding-left: 1em; padding-right: 1em; white-space: nowrap'>" + line.substring(0, token1) + "</td>" +
                    "<td style='padding-right: 1em; text-align: right'>" + line.substring(token2 + 1, token3) + "</td>" +
                    "<td style='padding-right: 1em; text-align: right'>" + line.substring(token3 + 1) + "</td>" +
                    "<td style='padding-right: 1em; white-space: nowrap'>" + line.substring(token1 + 1, token2) + "</td>" +
                    "</tr>";
            });

            html += "</table></div>";
        }
        else
            html += "No stack trace available.";

        pub.showError(html);

        // Report error to https://sentry.io
        if (window.Sentry && window.Sentry.captureException) {
            window.Sentry.captureException(ex);
        }
    }



    /**
     * Handles AJAX errors.  Just reports in alert message for now.
     *
     * @param xhr
     *        AJAX HTTP request handle
     * @param status
     *        HTTP status
     * @param error
     *        Technical error message.  This is typically a stack trace web page.
     * @param userFriendlyErrorMessage
     *        Optional user friendly message to display to the user instead of the technical error message.
     */

    pub.handleAjaxError = function (xhr, status, error, userFriendlyErrorMessage, showErrorYN)
    {
        if (showErrorYN)
        {
            if (error == "Unauthorized")
            {
                window.location.replace("/");
            }
            else
            {
                if (userFriendlyErrorMessage)
                    pub.showError(userFriendlyErrorMessage);
                else
                    pub.showError(xhr.responseText);
            }
        }        
    }



    /**
     * Displays an error message in a new tab/window.
     *
     * @param html
     *        Text to display.
     */

    pub.showError = function (html)
    {
        var document = window.open().document;
        document.write(html);
        document.close();
    }


    return pub;
}
());


/*
   Script: uiModel.js
   Purpose: The domain and view model of ui components
*/

var uiModel = (function () {
    try {
        // Public functions and state.
        var pub = {
            // The view model contains state only of interest to the view.
            view: {
                topNavAccountVisible: ko.observable(false),
                topNavMainLinksVisible: ko.observable(false),
                fullScreenLoaderVisible: ko.observable(false),
                windowWidth: ko.observable($(window).width())
            }
        };

        // Here's a custom Knockout binding that makes elements shown/hidden via jQuery's fadeIn()/fadeOut() methods
        ko.bindingHandlers.fadeVisible = {
            init: function (element, valueAccessor) {
                // Initially set the element to be instantly visible/hidden depending on the value
                var value = valueAccessor();
                $(element).toggle(ko.unwrap(value)); // Use "unwrapObservable" so we can handle values that may or may not be observable
            },
            update: function (element, valueAccessor) {
                // Whenever the value subsequently changes, slowly fade the element in or out
                var value = valueAccessor();
                ko.unwrap(value) ? $(element).fadeIn() : $(element).fadeOut();
            }
        };

        return pub;
    }
    catch (ex) {
        G8Error.HandleException(ex);
    }
}
());

var smsOptInControl = (function ()
{
    try
    {

        var pub = {};
        var smsOptInViewlModel;

        pub.init = function (vm)
        {
            smsOptInViewlModel = vm;
        };

        pub.switchView = function (view)
        {
            //expected values phoneInput, codeInput, phoneInputPage, codeInputPage, phoneVerified, phoneVerifiedPage
            if (view === 'phoneInput')
            {
                pub.onPhoneInput();
            } else if (view === 'codeInput')
            {
                pub.onCodeInput('modal');
            } else if (view === 'phoneVerified')
            {
                pub.onPhoneVerified('modal');
            } else if (view === 'phoneInputPage')
            {
                pub.onPhoneInputOnPage();
            } else if (view === 'codeInputPage')
            {
                pub.onCodeInput('page');
            } else if (view === 'phoneVerifiedPage')
            {
                pub.onPhoneVerified('page');
            } else
            {
                pub.onClose();
            }
        };

        pub.onPhoneInputOnModal = function ()
        {
            try
            {
                listing.createContactPoint(1, 0, '', function (result) // Success
                {
                    manageModal('phoneInput');
                }, function (xhr, status, error) // Failure
                    {
                        pub.onOpenErrorHandler();
                    });
            }
            catch (ex)
            {
                go8Error.handleException(ex);
            }
        };

        pub.onPhoneInputOnPage = function ()
        {
            try
            {
                loader.showLoading(true);
                listing.createContactPoint(1, 0, '', function (result) // Success
                {
                    listing.hasRespondedToNotification(function (result) // Success
                    {
                        loader.showLoading(false);
                        if (result.hasResponded)
                        {
                            headerModel.view.showSMSNotification(false);
                        }
                        manageModal('phoneInputPage');
                        smsOptInViewlModel.domain.phone.phoneSelected(true);
                    }, function (xhr, status, error) // Failure
                        {
                            loader.showLoading(false);
                            pub.onOpenErrorHandler();
                        });
                }, function (xhr, status, error) // Failure
                    {
                        loader.showLoading(false);
                        pub.onOpenErrorHandler();
                    });
            }
            catch (ex)
            {
                go8Error.handleException(ex);
            }
        };

        pub.onPhoneInput = function ()
        {
            manageModal('phoneInput');
        };

        pub.onPhoneInputWithParms = function (phone)
        {
            manageModal('phoneInput');
            smsOptInViewlModel.domain.phone.number(helper.formatPhone(phone));
        };

        pub.onCodeInput = function (type)
        {
            var phoneNumber = smsOptInViewlModel.domain.phone.number();
            if (type === 'modal')
            {
                manageModal('codeInput');
            } else
            {
                manageModal('codeInputPage');
            }
            smsOptInViewlModel.domain.phone.number(phoneNumber);
        };

        pub.onPhoneVerified = function (type)
        {
            if (type === 'modal')
            {
                manageModal('phoneVerified');
            } else
            {
                manageModal('phoneVerifiedPage');
            }
        };

        pub.onClose = function ()
        {
            try
            {
                let previousActiveModal = smsOptInViewlModel.view.activeModal();
                smsOptInViewlModel.view.activeAction('');
                smsOptInViewlModel.view.activeModal('');
                if (typeof (propertyDetails) !== "undefined")
                {
                    propertyDetailsModel.view.qmSignedUp(false);
                    if (propertyDetailsModel.domain.directInquiry.shouldShowSuccess()) {
                        showModal('inquiry-success-popup');
                    }
                }
                //Create the contactpoint with allowmarketing false and not verified
                listing.createContactPoint(1, 0, '', function (result) // Success
                {
                    if (previousActiveModal === smsOptInViewlModel.view.modalState.phoneVerified
                        && window.location.pathname.indexOf('alertPreferences') > 0)
                    {
                        smsOptInViewlModel.domain.params.onModalAction = alertPreferences.onModalActionCallback;
                        initiatedModalActionCallBack({ status: 'success', phone: smsOptInViewlModel.domain.phone.number() });
                    } else
                    {
                        initiatedModalActionCallBack({ status: 'close', phone: null });
                    }

                    if ($('.subscribe--floating').length) {
                        $(".subscribe--floating").remove();
                    }
                    if ((typeof (haResults) !== "undefined" || typeof (index) !== "undefined") && housingAssistantModal.domain.sourceFunctionality() === housingAssistantModal.view.sourceFunctionality.propertyFavorite)
                    {
                        window.location.reload();
                    }
                }, function (xhr, status, error) // Failure
                    {
                        pub.onOpenErrorHandler();
                    });
            }
            catch (ex)
            {
                go8Error.handleException(ex);
            }
        };

        pub.onOpenErrorHandler = function ()
        {
            try
            {
                pub.onClose();
                errorHandler.onOpenErrorHandler();
            }
            catch (ex)
            {
                go8Error.handleException(ex);
            }
        };

        pub.phoneSubmit = function ()
        {
            try
            {
                $(".smsoptin--loading--toggle").attr('disabled', true);
                loader.showLoading(true);
                if (smsOptInViewlModel.phoneValidation.errors().length === 0)
                {
                    var cleanPhone = smsOptInViewlModel.domain.phone.number().replace(/[\(\)\s\-]/g, "");
                    var phone = [cleanPhone];
                    listing.verifyPhones(phone, 0, 0,
                        function (result) // Success
                        {   
                            $(".smsoptin--loading--toggle").attr('disabled', false);
                            var carrierType = result ? result.phoneResponse[0].carrierType : "";
                            if (result && !result.phoneResponse[0].hasErrors && carrierType == "mobile")
                            {
                                sendSms("sent");
                            }
                            else
                            {
                                loader.showLoading(false);
                                var errorMessage = " ";
                                if (carrierType != "" && carrierType != "mobile")
                                {
                                    errorMessage = "This is a landline phone number that cannot receive Text alerts. Please enter in a different phone number.";
                                }
                                else
                                {
                                    errorMessage = "Invalid phone number.";
                                }
                                smsOptInViewlModel.domain.phone.number.setError(errorMessage);
                            }
                        },
                        function (xhr, status, error) // Failure
                        {
                            $(".smsoptin--loading--toggle").attr('disabled', false);
                            loader.showLoading(false);
                            pub.onOpenErrorHandler();
                        });
                }
                else
                {
                    $(".smsoptin--loading--toggle").attr('disabled', false);
                    loader.showLoading(false);
                    smsOptInViewlModel.phoneValidation.errors.showAllMessages();
                }
            }
            catch (ex)
            {
                $(".smsoptin--loading--toggle").attr('disabled', false);
                go8Error.handleException(ex);
            }
        };

        pub.verifySecureCode = function ()
        {
            try
            {
                loader.showLoading(true);
                var confirmationData =
                {
                    confirmationCode: smsOptInViewlModel.domain.phone.securecode(),
                    contactValue: smsOptInViewlModel.domain.phone.number()
                };
                listing.verifySmsConfirmationCode(confirmationData,
                    function (result) // Success
                    {
                        if (!result.isExists)
                        {
                            loader.showLoading(false);
                            //smsOptInViewlModel.domain.phone.securecode.setError("Invalid security code..");
                            smsOptInViewlModel.view.activeMessage(smsOptInViewlModel.view.secureCodeState.invalid);
                        }
                        else if (result.isExpired)
                        {
                            loader.showLoading(false);
                            //smsOptInViewlModel.domain.phone.securecode.setError("security code is expired.");
                            smsOptInViewlModel.view.activeMessage(smsOptInViewlModel.view.secureCodeState.expired);
                        }
                        else if (result.isConfirmed)
                        {
                            //Create the contactpoint after the code verification is success
                            listing.createContactPoint(2, 1, smsOptInViewlModel.domain.phone.number(), function (result) // Success
                            {
                                loader.showLoading(false);
                                smsOptInViewlModel.domain.phone.verified(true);
                                smsOptInViewlModel.view.activeMessage(smsOptInViewlModel.view.secureCodeState.verified);
                                if (smsOptInViewlModel.view.activeModal() === smsOptInViewlModel.view.modalState.codeInputPage)
                                {
                                    initiatedModalActionCallBack({ status: 'success', phone: smsOptInViewlModel.domain.phone.number() });
                                } else
                                {
                                    pub.switchView('phoneVerified');
                                }
                                if ((typeof (haResults) !== "undefined" || typeof (index) !== "undefined") && housingAssistantModal.domain.sourceFunctionality() === housingAssistantModal.view.sourceFunctionality.propertyFavorite)
                                {
                                    window.location.reload();
                                }
                            }, function (xhr, status, error) // Failure
                                {
                                    loader.showLoading(false);
                                    pub.onOpenErrorHandler();
                                });
                        }
                    },
                    function () // Failure
                    {
                        loader.showLoading(false);
                        pub.onOpenErrorHandler();
                    });
            }
            catch (ex)
            {
                go8Error.handleException(ex);
            }
        };

        pub.reSendSms = function ()
        {
            try
            {
                loader.showLoading(true);
                smsOptInViewlModel.domain.phone.securecode(null);
                smsOptInViewlModel.secureCodeValidation.errors.showAllMessages(false);
                sendSms("resent");
            }
            catch (ex)
            {
                go8Error.handleException(ex);
            }

        };

        pub.changePhone = function ()
        {
            if (smsOptInViewlModel.view.activeModal() === smsOptInViewlModel.view.modalState.codeInputPage)
            {
                pub.switchView('phoneInputPage');
            } else
            {
                pub.switchView('phoneInput');
            }
        };

        pub.resetValidation = function ()
        {
            smsOptInViewlModel.phoneValidation.errors.showAllMessages(false);
            smsOptInViewlModel.secureCodeValidation.errors.showAllMessages(false);
        };

        function initiatedModalActionCallBack(res)
        {
            if (!helper.isUndefinedOrNullOrEmpty(smsOptInViewlModel.domain.params.onModalAction))
            {
                smsOptInViewlModel.domain.params.onModalAction(res);
            }
        }

        function manageModal(type)
        {
            resetModal();
            pub.resetValidation();
            smsOptInViewlModel.view.activeAction(type);
            smsOptInViewlModel.view.activeModal(smsOptInViewlModel.view.modalState[type]);
        }

        function resetModal()
        {
            resetObservables(smsOptInViewlModel.domain.phone);
            if ($("#smsOptIn")[0])
                $("#smsOptIn")[0].reset();
        }

        function resetObservables(model, ignoreList)
        {
            if (!ignoreList) ignoreList = [];
            for (var key in model)
            {
                if (model.hasOwnProperty(key) && ko.isObservable(model[key]) && ignoreList.indexOf(key) === -1)
                {
                    model[key](null);
                }
            }
        }

        function sendSms(type)
        {
            listing.sendSmsConfirmationCodeToOptIn(
                smsOptInViewlModel.domain.phone.number(),
                function (sendresult) // Success
                {
                    loader.showLoading(false);
                    if (sendresult && sendresult.isSuccess)
                    {
                        smsOptInViewlModel.domain.phone.readyToVerify(true);
                        smsOptInViewlModel.view.activeMessage(smsOptInViewlModel.view.secureCodeState[type]);
                        if (smsOptInViewlModel.view.activeModal() === smsOptInViewlModel.view.modalState.phoneInputPage ||
                            (smsOptInViewlModel.view.activeModal() === smsOptInViewlModel.view.modalState.codeInputPage && type == "resent"))
                        {
                            pub.switchView('codeInputPage');
                        } else
                        {
                            pub.switchView('codeInput');
                        }
                    }
                    else
                    {
                        alert(sendresult.errorMessage);
                    }
                },
                function () // Failure
                {
                    loader.showLoading(false);
                    pub.onOpenErrorHandler();
                });
        }

        return pub;

    } catch (ex)
    {
        go8Error.handleException(ex);
    }
}());

var smsOptInControlModel = function (params) {
    try {
        // Public functions and state.
        var pub = {};

        pub =
        {
            // The domain model contains all information relevant to server calls.
            domain:
            {
                params:
                {
                    onModalAction: null
                },
                phone: {
                    number: ko.observable("").extend(
                        {
                            required: true,
                            phoneUS: {
                                onlyIf: function () {
                                    return !pub.domain.phone.phoneSelected();
                                }
                            }
                            //validation:
                            //{
                            //    async: true,
                            //    validator: checkIfValidMobileNumber,
                            //    message: '',
                            //    params: 'smsSignUpPhone',
                            //    onlyIf: function () {
                            //        return !pub.domain.phone.phoneSelected();
                            //    }
                            //}
                        }),
                    phoneSelected: ko.observable(false),
                    readyToVerify: ko.observable(false),
                    verified: ko.observable(),
                    expireInMins: ko.observable(),
                    securecode: ko.observable().extend({
                        required: true,
                        validation: {
                            validator: function (val, requiredLength) {
                                if (val && val.length > 0) {
                                    return val.length === requiredLength;
                                }
                                else {
                                    return true;
                                }
                            },
                            message: '',
                            params: 6
                        }
                    })
                }
            },

            // Any necessary public operations should be exposed here.  Functions here should just call private
            // functions.  This may be ommitted if you have no such requirements.
            operations:
            {

            },

            // The pojo model contains state information that cannot be observable because of constaints imposed by
            // third party software like Google maps.  This may be ommitted if you have no such requirements.
            pojo:
            {

            },

            // The view model contains state only of interest to the view.
            view:
            {
                activeAction: ko.observable(''),
                activeModal: ko.observable(''),
                activeMessage: ko.observable(''),
                modalState: {
                    phoneInput: 1,
                    codeInput: 2,
                    phoneVerified: 3,
                    phoneInputPage: 4,
                    codeInputPage: 5,
                    phoneVerifiedPage: 6,
                    error: 7
                },
                secureCodeState: {
                    sent: 1,
                    resent: 2,
                    invalid: 3,
                    expired: 4,
                    verified: 5
                }
            }
        };

        pub.phoneValidation = ko.validatedObservable([
            pub.domain.phone.number
        ]);

        pub.secureCodeValidation = ko.validatedObservable([
            pub.domain.phone.securecode
        ]);

        function checkIfValidMobileNumber(val, params, callback) {
            if (val) {
                val = val.replace(/[\(\)\s\-]/g, "");
                if (val.length == 10) {
                    listing.verifyPhones([val], 0, 0,
                        checkIfValidMobileNumberOnSuccess,
                        checkIfValidMobileNumberOnFailure);
                }
            }
        }

        function checkIfValidMobileNumberOnSuccess(result) {
            try {
                var carrierType = result ? result.phoneResponse[0].carrierType : "";
                if (result && !result.phoneResponse[0].hasErrors && carrierType == "mobile") {
                }
                else {
                    var errorMessage = "";
                    if (carrierType != "" && carrierType != "mobile") {
                        errorMessage = "This is a landline phone number that cannot receive Text alerts. Please enter in a different phone number.";
                    }
                    else {
                        errorMessage = "Invalid phone number.";
                    }
                    pub.domain.phone.number.setError(errorMessage);
                }
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        };

        function checkIfValidMobileNumberOnFailure(xhr, status, error) {
            try {
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        };

        if (params) {
            if (!helper.isUndefinedOrNullOrEmpty(params.onModalAction)) {
                pub.domain.params.onModalAction = params.onModalAction;
            }
        }

        smsOptInControl.init(pub);

        return pub;
    }
    catch (ex) {
        go8Error.handleException(ex);
    }
};


ko.components.register('SMS-OptIn-Modal', {
    template: { element: 'smsOptInModalHtml' },
    viewModel: smsOptInControlModel
});

ko.components.register('SMS-OptIn-Page', {
    template: { element: 'smsOptInPageHtml' },
    viewModel: smsOptInControlModel
});

ko.components.register('PhoneInput', {
    template: { element: 'phoneInputHtml' },
    viewModel: function (params) {
        return params.model;
    }
});

ko.components.register('CodeInput', {
    template: { element: 'codeInputHtml' },
    viewModel: function (params) {
        return params.model;
    }
});

ko.components.register('PhoneVerified', {
    template: { element: 'phoneVerifiedHtml' },
    viewModel: function (params) {
        return params.model;
    }
});




var ahPropFavIcon = function (parameters) {
    var self = this;
    init();
    function init() {
        self.CommunityId = parameters.CommunityId;
        self.IsTenantFavourite = parameters.IsTenantFavourite;
    }
    function loading(action) {
        if (action == "show" || !action) {
            $(".loading--overlay").show();
        }
        else {
            $(".loading--overlay").hide();
        }
    }
    onClickFavIcon = function (data) {
        $(".favourite--dropdownmenu").hide();
        headerModel.domain.faviconCommunityId(data.CommunityId());
        if (!headerModel.domain.user()) {
            loginControl.onSignUpClick(headerModel.view.signUpParams);
        }
        else {
            if (headerModel.domain.user().UserType() == "Tenant") {
                loading('show');
                listing.saveFavourites
                    (parseInt(data.CommunityId()), headerModel.domain.user().UserId(), data.IsTenantFavourite(), favouriteSavedSuccess, favouriteSavedFailure, 'propertyFavIcon.onClickFavIcon');
            }
            else if (headerModel.domain.user().UserType() !== "Tenant") {
                headerModel.domain.showModalForOwnerFavorites(true);
                if (typeof (tnResult) != "undefined") {
                    $(".tnresult--listing--card").animate({ scrollTop: "0" });
                    $("body, html").animate({ scrollTop: 0 }, 1000);
                }
            }
        }
    }

    function favouriteSavedSuccess(result) {
        try {
            if (typeof (index) !== "undefined") {
                for (var i = 0; i < indexModel.domain.rentalPanelList().length; i++) {
                    var communityId = indexModel.domain.rentalPanelList()[i].CommunityId();
                    if (communityId == result.CommunityId) {
                        indexModel.domain.rentalPanelList()[i].IsTenantFavourite(result.IsTenantFavorite);
                    }
                }
            }
            if (typeof (tnResult) !== "undefined") {
                for (var i = 0; i < tnResultModel.domain.propertyList().length; i++) {
                    var communityId = tnResultModel.domain.propertyList()[i].CommunityId();
                    if (communityId == result.CommunityId) {
                        tnResultModel.domain.propertyList()[i].IsTenantFavourite(result.IsTenantFavorite);
                    }
                }
                tnResultModel.domain.isFavoriteClicked(true);
            }
            if (typeof (propertyDetails) !== "undefined") {
                var communityId = propertyDetailsModel.domain.communityId();
                    if (communityId == result.CommunityId) {
                        propertyDetailsModel.domain.IsTenantsFavorite(result.IsTenantFavorite);
                }
            }

            if (headerModel.view.isQuickMatch2On() && headerModel.domain.user().UserType() == "Tenant" && result.IsTenantFavorite)
                housingAssistant.initiateHousingAssistant(housingAssistantModal.view.sourceFunctionality.propertyFavorite);

            headerModel.domain.faviconCommunityId(0);
            headerModel.domain.tenant.favoriteCount(result.TotalFavoritesCount);
            loading('hide');
        }
        catch (ex) {
            go8Error.handleException(ex);
        }
    }
    function favouriteSavedFailure(xhr, status, error) {
        try {
            headerModel.domain.faviconCommunityId(0);
            user.handleOperationException(xhr, status, error);
            loading('hide');
        }
        catch (ex) {
            go8Error.handleException(ex);
        }
    }
};

ko.components.register('ah-property-fav-icon',
    {
        template: "<div class=\"property--fav--share\"><a data-bind=\"click: onClickFavIcon , clickBubble: false, css: {'selected': IsTenantFavourite() == true}\"></a></div>",
        viewModel: ahPropFavIcon
    });

//$.ajax
//({
//    url: '/v4/controls/propertyFavIcon/propertyFavIcon.html',
//    async: false,
//    success: function (templateString) {
//        ko.components.register('ah-property-fav-icon',
//            {
//                template: templateString,
//                viewModel: ahPropFavIcon
//            });
//    }
//});


var ahPropSection8Tag = function (parameters) {

    var self = this;
    init();

    function init() {
        self.ShowBadge = parameters.ShowBadge;
        self.Section8Image = parameters.Section8Image;
    }

    section8TagClick = function () {
        // section8Tag Click event
        // to prevent listing item(parent) click event
    }
};

ko.components.register('ah-property-section8-tag',
    {
        template: '<div class="voucher--cnt" data-bind="visible: ShowBadge(), click: section8TagClick, clickBubble: false"><i class="ic--go8--badge" data-bind="tooltipster: { content: \'This owner has experience with the Section 8 / HCV Program.\', contentAsHTML: true, trigger: helper.isMobileAndTablet() ? \'click\' : \'hover\' }"></i ></div>',
        viewModel: ahPropSection8Tag
    });

//$.ajax
//    ({
//        url: '/v4/controls/section8Tag/section8Tag.html',
//        async: false,
//        success: function (templateString) {
//            ko.components.register('ah-property-section8-tag',
//                {
//                    template: templateString,
//                    viewModel: ahPropSection8Tag
//                });
//        }
//    });


var ahPropTrustedOwnerTag = function (parameters) {

    var self = this;
    init();

    function init() {
        self.ShowBadge = ((ko.isObservable(parameters.HasTrustedOwnerBadge) ? parameters.HasTrustedOwnerBadge() : (parameters.HasTrustedOwnerBadge=='True')) && (ko.isObservable(parameters.IsPremiumListing) ? parameters.IsPremiumListing() : (parameters.IsPremiumListing=='True')));
        self.TrustedOwnerImage = parameters.TrustedOwnerImage;
    }

    trustedOwnerClick = function () {
        // trustedOwnerClick Click event
        // to prevent listing item(parent) click event
    }
};

ko.components.register('ah-property-trustedowner-tag',
    {
        template: '<div class="trusted--cnt" data-bind="visible: ShowBadge, click: trustedOwnerClick, clickBubble: false"><i class="ic--trusted--badge" data-bind="tooltipster: { content: \'Trusted Owners have verified identities and contact information, and  a record of compliance with our policies.\', contentAsHTML: true, trigger: helper.isMobileAndTablet() ? \'click\' : \'hover\' }"><img src="/images/AffordableHousing/trusted-owner-icon.svg"></i></div>',
        viewModel: ahPropTrustedOwnerTag
    });


var ahPropAddress = function (parameters) {

    var self = this;
    init();

    function init() {

        var fullAddress = '';
        if (parameters.AddressLine1()) {
            fullAddress = parameters.AddressLine1();
        }

        if (parameters.AddressLine2()) {
            fullAddress = fullAddress + ", " + parameters.AddressLine2();
        }

        if (parameters.City()) {
            fullAddress = fullAddress + ", " + parameters.City();
        }

        if (parameters.State()) {
            fullAddress = fullAddress + ", " + parameters.State();
        }

        if (parameters.Zip()) {
            fullAddress = fullAddress + " " + parameters.Zip();
        }

        self.Address = fullAddress;
    }
};

ko.components.register('ah-property-address',
    {
        template: '<!-- ko if: Address --><div class="tnresult--propertyaddress" data-bind="text: Address"></div><!-- /ko -->',
        viewModel: ahPropAddress
    });

//$.ajax
//    ({
//        url: '/v4/controls/searchResultPropertyAddress/searchResultPropertyAddress.html',
//        async: false,
//        success: function (templateString) {
//            ko.components.register('ah-property-address',
//                {
//                    template: templateString,
//                    viewModel: ahPropAddress
//                });
//        }
//    });


var ahPropRent = function (parameters) {

    var self = this;
    init();

    function init() {
        self.MinRent = parameters.MinRent;
        self.MaxRent = parameters.MaxRent;
    }
};

ko.components.register('ah-property-rent',
    {
        template: '<div class="tnresult--price"><!-- ko money: MinRent --><!-- /ko --><!-- ko if: MinRent() != MaxRent() -->-<!-- ko money: MaxRent --><!-- /ko --><!-- /ko --></div>',
        viewModel: ahPropRent
    });

//$.ajax
//    ({
//        url: '/v4/controls/searchResultPropertyRent/searchResultPropertyRent.html',
//        async: false,
//        success: function (templateString) {
//            ko.components.register('ah-property-rent',
//                {
//                    template: templateString,
//                    viewModel: ahPropRent
//                });
//        }
//    });


var ahPropAvailability = function (parameters) {

    var self = this;
    init();

    function init() {
        self.AvailabilityText = ko.observable(parameters.AvailabilityText);
        self.IsPremiumListing = ko.observable(parameters.IsPremiumListing);
    }
};

ko.components.register('ah-property-availability',
    {
        template: '<div class="available--txt"><span class="green--text"><!-- ko if: IsPremiumListing() --><em></em><!-- /ko --><!-- ko text: AvailabilityText() --><!-- /ko --></span></div>',
        viewModel: ahPropAvailability
    });

ko.components.register('ah-property-availability-new',
    {
        template: '<div class="available--txt"><span class="green--text"><em></em><!-- ko text: AvailabilityText() --><!-- /ko --></span></div>',
        viewModel: ahPropAvailability
    });

//$.ajax
//    ({
//        url: '/v4/controls/searchResultPropertyAvailability/searchResultPropertyAvailability.html',
//        async: false,
//        success: function (templateString) {
//            ko.components.register('ah-property-availability',
//                {
//                    template: templateString,
//                    viewModel: ahPropAvailability
//                });
//        }
//    });


var ahPropBedBath = function (parameters) {

    var self = this;
    init();

    function init() {
        self.MinBed = parameters.MinBed;
        self.MaxBed = parameters.MaxBed;
        self.MaxBath = parameters.MaxBath;
        self.MinBath = parameters.MinBath;
        self.MaxHalfBath = parameters.MaxHalfBath;
        self.MinHalfBath = parameters.MinHalfBath;
        self.MinSqFt = parameters.MinSqFt;
        self.MaxSqFt = parameters.MaxSqFt;

        var bedDisplay = '';
        var bathDisplay = '';
        var halfBathDisplay = '';
        var sqftDisplay = '';

        if (self.MinBed() == 0) {
            bedDisplay = 'Stud';
        }
        else if (self.MinBed() > 0) {
            bedDisplay = self.MinBed();
        }

        if (self.MinBed() == self.MaxBed()) {
            if (self.MaxBed() > 1) {
                bedDisplay += ' <span class="card--value">Bds</span>';
            }
            else if (self.MaxBed() > 0) {
                bedDisplay += ' <span class="card--value">Bd</span>';
            }
        }
        else {
            if (self.MaxBed() > 1) {
                bedDisplay += '-' + self.MaxBed() + ' <span class="card--value">Bds</span>';
            }
            else if (self.MaxBed() > 0) {
                bedDisplay += '-' + self.MaxBed() + ' <span class="card--value">Bd</span>';
            }
            
        }

        if (self.MinBath() == self.MaxBath() && self.MinHalfBath() == self.MaxHalfBath()) {
            if (self.MinHalfBath() > 1) {
                halfBathDisplay = '.5+';
            }
            else if (self.MinHalfBath() > 0) {
                halfBathDisplay = '.5';
            }
            else {
                halfBathDisplay = '';
            }

            if (self.MinBath() > 1 || (self.MinBath() > 0 && self.MinHalfBath() > 0)) {
                bathDisplay = self.MinBath() + halfBathDisplay + ' <span class="card--value">Ba</span> ';
            }
            else if (self.MinBath() > 0) {
                bathDisplay = self.MinBath() + halfBathDisplay + ' <span class="card--value">Ba</span> ';
            }
        } else {
            if (self.MinHalfBath() > 1) {
                halfBathDisplay = '.5+';
            }
            else if (self.MinHalfBath() > 0) {
                halfBathDisplay = '.5';
            }
            else {
                halfBathDisplay = '';
            }

            if (self.MinBath() > 1 || (self.MinBath() > 0 && self.MinHalfBath() > 0)) {
                bathDisplay = self.MinBath() + halfBathDisplay + '-';
            }
            else if (self.MinBath() > 0) {
                bathDisplay = self.MinBath() + halfBathDisplay + '-';
            }

            if (self.MaxHalfBath() > 1) {
                halfBathDisplay = '.5+';
            }
            else if (self.MaxHalfBath() > 0) {
                halfBathDisplay = '.5';
            }
            else {
                halfBathDisplay = '';
            }

            if (self.MaxBath() > 1 || (self.MaxBath() > 0 && self.MaxHalfBath() > 0)) {
                bathDisplay += self.MaxBath() + halfBathDisplay + ' <span class="card--value">Ba</span> ';
            }
            else if (self.MaxBath() > 0) {
                bathDisplay += self.MaxBath() + halfBathDisplay + ' <span class="card--value">Ba</span> ';
            }
        }

        self.BedDisplayText = ko.observable(bedDisplay);
        self.BathDisplayText = ko.observable(bathDisplay);
        self.BedDisplayTextFull = ko.observable(bedDisplay.replace(">Bd", ">bed"));
        self.BathDisplayTextFull = ko.observable();
        if (self.MaxBath() > 1 || (self.MaxBath() > 0 && self.MaxHalfBath() > 0)) {
            self.BathDisplayTextFull(bathDisplay.replace(">Ba", ">baths"));
        } else {
            self.BathDisplayTextFull(bathDisplay.replace(">Ba", ">bath"));
        }
        self.BedBathHasValue = ko.observable(!helper.isUndefinedOrNullOrEmpty(bedDisplay) && !helper.isUndefinedOrNullOrEmpty(bathDisplay));

        self.SqFtHasValue = ko.observable(!helper.isUndefinedOrNullOrEmpty(self.MinSqFt()));

        if (self.SqFtHasValue()) {
            if (self.MinSqFt() == self.MaxSqFt())
                sqftDisplay = self.MinSqFt().toLocaleString() + ' <span class="card--value">Sqft</span>';
            else
                sqftDisplay = self.MinSqFt().toLocaleString() + '-' + self.MaxSqFt().toLocaleString() + ' <span class="card--value">Sqft</span>';
        }

        self.SqFtDisplayText = ko.observable(sqftDisplay);
        self.SqFtDisplayTextNew = ko.observable(sqftDisplay.replace("Sqft", "sqft"));
    }
};
ko.components.register('ah-property-bedbath',
    {
        template: '<div class="tnresult--bedbath"><span data-bind="html: BedDisplayText()"></span><!-- ko if: BedBathHasValue() --> <em>|</em><!-- /ko --><span data-bind="html: BathDisplayText()"></span><!-- ko if: SqFtHasValue() --><em>|</em><span class="tnresult--sqft" data-bind="html: SqFtDisplayText()"></span><!-- /ko --></div>',
        viewModel: ahPropBedBath
    });

ko.components.register('ah-property-bedbath-new',
    {
        template: '<span data-bind="html: BedDisplayTextFull()"></span><!-- ko if: BedBathHasValue() --> <span class="value--separator">|</span> <!-- /ko --><span data-bind="html: BathDisplayTextFull()"></span><!-- ko if: SqFtHasValue() --> <span class="value--separator">|</span> <span data-bind="html: SqFtDisplayTextNew()"></span><!-- /ko -->',
        viewModel: ahPropBedBath
    });

//$.ajax
//    ({
//        url: '/v4/controls/searchResultPropertyBedBath/searchResultPropertyBedBath.html',
//        async: false,
//        success: function (templateString) {
//            ko.components.register('ah-property-bedbath',
//                {
//                    template: templateString,
//                    viewModel: ahPropBedBath
//                });
//        }
//    });


var ahPropType = function (parameters) {

    var self = this;
    init();

    function init() {
        self.PropertyType = parameters.PropertyType;

        self.PropertyTypeHasValue = ko.observable(!helper.isUndefinedOrNullOrEmpty(self.PropertyType()));
    }
};

ko.components.register('ah-property-type',
    {
        template: '<!-- ko if: PropertyTypeHasValue --><span class="tnresult--propertytype" data-bind="text: PropertyType()"></span><!-- /ko -->',
        viewModel: ahPropType
    });

//$.ajax
//    ({
//        url: '/v4/controls/searchResultPropertyType/searchResultPropertyType.html',
//        async: false,
//        success: function (templateString) {
//            ko.components.register('ah-property-type',
//                {
//                    template: templateString,
//                    viewModel: ahPropType
//                });
//        }
//    });


var ahPropPhoto = function (parameters) {

    var self = this;
    init();

    function init() {
        self.Photo = ko.observable(parameters.Photo());
        self.DefaultPhotoURL = ko.observable(parameters.DefaultPhotoURL);
        self.PhotoCount = ko.observable(parameters.PhotoCount());
        self.ComingSoonPhotoURL = ko.observable(parameters.ComingSoonPhotoURL);

        self.ImageUrl = self.DefaultPhotoURL();
        //check for default photo
        if (helper.isUndefinedOrNullOrEmpty(self.Photo()) && self.PhotoCount() > 0) 
            self.ImageUrl = self.ComingSoonPhotoURL();

        if (!helper.isUndefinedOrNullOrEmpty(self.Photo()))
            self.ImageUrl = self.Photo();

        let altText = '';
        if (!helper.isUndefinedOrNullOrEmpty(parameters.CommunityName())) {
            altText = parameters.CommunityName();
        }
        else {
            altText = parameters.AddressLine1();
        }

        self.altText = ko.observable(altText);
    }
};

//$.ajax
//    ({
//        url: '/v4/controls/searchResultPropertyPhoto/searchResultPropertyPhoto.html',
//        async: false,
//        success: function (templateString) {
//            ko.components.register('ah-property-photo',
//                {
//                    template: templateString,
//                    viewModel: ahPropPhoto
//                });
//        }
//    });

 $(function () {
    ko.components.register('ah-property-photo',
        {
            template: '<div class="tnresult--img"><img data-bind="attr: { src: ImageUrl, alt: altText }" class="lazy"></div>',
            viewModel: ahPropPhoto
        });
});



var ahPropPhotoCount = function (parameters) {

    var self = this;
    init();

    function init() {
        self.PhotoCount = ko.observable(parameters.PhotoCount);
        self.Photo = ko.observable(parameters.Photo());
        self.IsComingSoonPhoto = ko.observable(helper.isUndefinedOrNullOrEmpty(self.Photo()) && parameters.PhotoCount() > 0);
        IsPhotoAvailable = ko.observable(!self.IsComingSoonPhoto() && parameters.PhotoCount() > 0);
    }
};


ko.components.register('ah-property-photocount',
    {
        template: '<div class="property--photo--count" data-bind="visible: IsPhotoAvailable()"><i class="property--photo--icon"></i><!-- ko text: PhotoCount() --><!-- /ko --></div>',
        viewModel: ahPropPhotoCount
    });

//$.ajax
//    ({
//        url: '/v4/controls/searchResultPropertyPhotoCount/searchResultPropertyPhotoCount.html',
//        async: false,
//        success: function (templateString) {
//            ko.components.register('ah-property-photocount',
//                {
//                    template: templateString,
//                    viewModel: ahPropPhotoCount
//                });
//        }
//    });

ko.components.register('info-icon', {
    viewModel: function (params)
    {
        this.onClick = params && params.onClick ? params.onClick : null;
    },
    template:
        '<i\
            class="info-icon fas fa-info-circle"\
            data-bind="\
                click: onClick\
            "\
        ></i>'
});

ko.components.register('info-icon-tooltip', {
    viewModel: function (params)
    {
        this.html = params && params.html;
        this.position = params && params.position ? params.position : 'top';
        this.onClick = params && params.onClick ? params.onClick : null;
    },
    template:
        '<i\
            class="info-icon fas fa-info-circle"\
            data-bind="\
                tooltipster: {\
                    content: html,\
                    contentAsHTML: true,\
                    position: position,\
                    theme: \'info-icon-tooltip\',\
                    trigger: helper.isMobileAndTablet() ?\'click\' : \'hover\'\
                },\
                click: onClick\
            "\
        ></i>'
});

var searchName = (function () {
	try {

		var pub = {};
		var searchNameViewlModel;


		pub.init = function (vm) {
			searchNameViewlModel = vm;
		};


		pub.onOpenSearchName = function () {
			try {

				searchNameViewlModel.view.activeModal(true);
				this.bindData();
			}
			catch (ex) {
				go8Error.handleException(ex);
			}
		};

		pub.bindData = function () {
			var SEOsearchParameters = helper.getSEOSearchParametersCookieData();
			var drawingMapData = sessionStorage.getItem("userdrawings")
			var prefix = go8SearchBoxForListings.displayText();

			if (prefix.trim().length == 0 && !helper.isUndefinedOrNullOrEmpty(SEOsearchParameters.state) ) {
				prefix = SEOsearchParameters.state;
			}
			if (!helper.isUndefinedOrNullOrEmpty(SEOsearchParameters.center) && !helper.isUndefinedOrNullOrEmpty(SEOsearchParameters.pos) && (SEOsearchParameters.pos != "0,0,0,0") && SEOsearchParameters.center!="0,0") {
				prefix = "Map Area";
			}
			if (drawingMapData !== null) {
				prefix = "Drawn";
			}
			if (!helper.isUndefinedOrNullOrEmpty(SEOsearchParameters.NCESSchoolID) && !helper.isUndefinedOrNullOrEmpty(SEOsearchParameters.schoolId) && !helper.isUndefinedOrNullOrEmpty(SEOsearchParameters.education) ) {
				prefix = "School Area";
			}
            var defaultName = prefix + " Search - " + helper.dateformat((new Date()).toUTCString(), 'US/Eastern', 'MM/DD/YYYY');

			var JsonStringValue = JSON.parse(sessionStorage.getItem("favouritesearches"));
			var nameCount = 1;

			if (JsonStringValue != undefined && JsonStringValue != null && JsonStringValue.length > 0) {
				for (var i = 0; i < JsonStringValue.length; i++) {
					var SearchLabel = JsonStringValue[i].SearchLabel;
					if (SearchLabel != null) {
						var searchName = SearchLabel.split(" (");
						if (!helper.isNullOrEmpty(SearchLabel) && !helper.isNullOrEmpty(searchName[0])) {
							if (defaultName.toLowerCase() === searchName[0].toLowerCase()) {
								nameCount++;
							}
						}
					}
				}
			}

			searchNameModel.domain.uniqueName(defaultName + " (" + nameCount + ")");
		}
		pub.onCloseSearchName = function () {
			try {
				searchNameModel.view.activeModal(false);
			}
			catch (ex) {
				go8Error.handleException(ex);
			}
		};

		pub.onSaveSearch = function () {
			try {
				if (!helper.isNullOrEmpty(searchNameModel.domain.uniqueName())) {
					if (typeof (tnResult) != "undefined") {
						loading('show');
						tnResult.doSaveRemoveSearch();
					}
				}
			}
			catch (ex) {
				go8Error.handleException(ex);
			}
		};

		pub.keyEventTriggered = function (data, event) {
			if (event.keyCode == 13)
				pub.onSaveSearch();
		}

		return pub;
	}
	catch (ex) {
		go8Error.handleException(ex);
	}
}());



var searchNameModel = (function () {
	try {
		// Public functions and state.
		var pub = {};

		pub =
		{
			// The domain model contains all information relevant to server calls.
			domain:
			{
				uniqueName: ko.observable().extend({ required: true, maxLength: 100 })
			},
			// Any necessary public operations should be exposed here.  Functions here should just call private
			// functions.  This may be ommitted if you have no such requirements.
			operations:
			{
			},

			// The pojo model contains state information that cannot be observable because of constaints imposed by
			// third party software like Google maps.  This may be ommitted if you have no such requirements.
			pojo:
			{
			},

			// The view model contains state only of interest to the view.
			view:
			{
				activeModal: ko.observable(false),
				
			}
		};

		pub.searchValidation = ko.validatedObservable([
			pub.domain.uniqueName
		]);

 	searchName.init(pub);

		return pub;
	}
	catch (ex) {
		go8Error.handleException(ex);
	}
}());


ko.components.register('searchName-Model', {
	template: { element: 'searchNameHtml' },

});



var featureBanner = (function () {
    try {
        var pub = {};

        registerComponents();

        function registerComponents() {
            $.ajax
                ({
                    url: '/v4/controls/featureBanner/renterScoreBanner.html',
                    async: true,
                    success: function (templateString) {
                        ko.components.register('renter-score-banner',
                            {
                                template: templateString,
                                viewModel: function (parameters) {
                                    featureBannerModel.renterScore.bannerName(parameters.BannerName);
                                    featureBannerModel.renterScore.isActive(parameters.IsActive);
                                    featureBannerModel.renterScore.frequencyInHours(parameters.FrequencyInHours);

                                    if (parameters && parameters.IsToggleNewApplicantsPageEnabled === 'True')
                                        featureBannerModel.renterScore.IsToggleNewApplicantsPageEnabled(true);
                                }
                            });
                    }
                });

            $.ajax
                ({
                    url: '/v4/controls/featureBanner/ownerInboxBanner.html',
                    async: true,
                    success: function (templateString) {
                        ko.components.register('owner-inbox-banner',
                            {
                                template: templateString,
                                viewModel: function (parameters) {
                                    featureBannerModel.renterScore.bannerName(parameters.BannerName),
                                    featureBannerModel.renterScore.isActive(parameters.IsActive),
                                    featureBannerModel.renterScore.frequencyInHours(parameters.FrequencyInHours)
                                }
                            });
                    }
                });
        }        

        pub.goToListings = function (value) {
            try {
                //hide banner after interaction
                featureBannerModel.renterScore.isBannerShow(false);
                featureBannerModel.isGoToListings(value);

                // Call Save API
                saveMarketingFeatureBanner();
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }
            
        pub.saveOwnerInboxFeatureBanner=function() {
            try {
                listing.saveMarketingFeatureBannerByUser(
                    featureBannerModel.ownerInbox.bannerName(),
                    featureBannerModel.ownerInbox.frequencyInHours(),
                    saveOwnerInboxFeatureBannerOnSuccess,
                    saveMarketingFeatureBannerOnFailure);
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }
        function saveOwnerInboxFeatureBannerOnSuccess(result) {
            try {
                if (result.Success === true) {
                    localStorage.removeItem("OIB");                    
                    if (featureBannerModel.ownerInbox.frequencyInHours() != 0) { //No need to store "OIB" one time visibility
                        let lastAckTime = new Date();
                        let nextAckTime = new Date();
                        var frequency = lastAckTime.getUTCHours() + featureBannerModel.ownerInbox.frequencyInHours();
                        nextAckTime.setUTCHours(frequency);

                        var value = {
                            bannerName: featureBannerModel.ownerInbox.bannerName(),
                            frequencyInHours: featureBannerModel.ownerInbox.frequencyInHours(),
                            lastAckTime: lastAckTime,
                            nextAckTime: nextAckTime
                        };

                        //Limit the banner name to 10 characters to control LS memory
                        //OWNERINBOX abbreviated as OIB
                        localStorage.setItem("OIB", JSON.stringify(value));

                    }
                    else {
                        getMarketingFeatureBanner();
                    }
                }
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        pub.goToApplicants = function (value) {
            try {
                //hide banner after interaction
                featureBannerModel.renterScore.isBannerShow(false);
                featureBannerModel.isGoToApplicants(value);

                // Call Save API
                saveMarketingFeatureBanner();
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        function saveMarketingFeatureBanner() {
            try {
                listing.saveMarketingFeatureBannerByUser(
                    featureBannerModel.renterScore.bannerName(),
                    featureBannerModel.renterScore.frequencyInHours(),
                    saveMarketingFeatureBannerOnSuccess,
                    saveMarketingFeatureBannerOnFailure);
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        function saveMarketingFeatureBannerOnSuccess(result) {
            try {
                if (result.Success === true) {
                    localStorage.removeItem("RSOD");

                    if (featureBannerModel.renterScore.frequencyInHours() != 0) { //No need to store "RSOD" one time visibility
                        let lastAckTime = new Date();
                        let nextAckTime = new Date();
                        var frequency = lastAckTime.getUTCHours() + featureBannerModel.renterScore.frequencyInHours();
                        nextAckTime.setUTCHours(frequency);

                        var value = {
                            bannerName: featureBannerModel.renterScore.bannerName(),
                            frequencyInHours: featureBannerModel.renterScore.frequencyInHours(),
                            lastAckTime: lastAckTime,
                            nextAckTime: nextAckTime
                        };

                        //Limit the banner name to 10 characters to control LS memory
                        //RenterScoreOwnerDashboard abbreviated as RSOD
                        localStorage.setItem("RSOD", JSON.stringify(value));

                    }

                    //Go to Listings
                    if (featureBannerModel.isGoToListings() == true)
                        window.location = '/v4/pages/Listing/Listing.aspx?tab=active';

                    //Go to applicants
                    if (featureBannerModel.isGoToApplicants() == true)
                        window.location = headerModel.view.lastUpdatedApplicantPage();
                }                
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }

        function saveMarketingFeatureBannerOnFailure(xhr, status, error) {
            try {
                user.handleOperationException(xhr, status, error);
            } catch (ex) {
                go8Error.handleException(ex);
            }
        }

        return pub;        
    }
    catch (ex) {
        go8Error.handleException(ex);
    }
}());

var featureBannerModel = (function () {
    try {
        var pub = {};

        pub = {
            renterScore: {
                bannerName: ko.observable(null),
                isActive: ko.observable(false),
                frequencyInHours: ko.observable(0),
                isBannerShow: ko.observable(false),
                IsToggleNewApplicantsPageEnabled: ko.observable(false)
            },
            isGoToListings: ko.observable(false),
            isGoToApplicants: ko.observable(false),
            ownerInbox: {
                bannerName: ko.observable('OwnerInbox'),
                isActive: ko.observable(true),
                frequencyInHours: ko.observable(0),
                isBannerShow: ko.observable(false)
            },
            isGoListings: ko.observable(false)
        };

        pub.ownerInbox.isBannerShow.subscribe(function (value) {
            if (!helper.isUndefinedOrNullOrEmpty(value) && value === true) {
                showModal("new-features-modal");
            } else {
                closeModalById('new-features-modal');
            }
        });
        return pub;
    }
    catch (ex) {
        go8Error.handleException(ex);
    }
}());

var housingAssistant = (function () {
    try {
        var pub = {};

        pub.initiateHousingAssistant = (sourceFunctionality, callBackFunction = null) => {
            try {
                loader.showLoading(true);
                listing.signUpForHAOfferShouldShow((resultForSignupOpen) => { signUpForHAOfferShouldShowSuccess(resultForSignupOpen, sourceFunctionality, callBackFunction) }, signUpForHAOfferShouldShowFailure)
            }
            catch (ex) {
                pub.handleError();
            }
        }
        const signUpForHAOfferShouldShowSuccess = (result, sourceFunctionality, callBackFunction) => {
            try {
                if (result && result.Success){
                    if (result.OfferShouldShow && sourceFunctionality !== housingAssistantModal.view.sourceFunctionality.signIn) {
                        loader.showLoading(false);
                        housingAssistantModal.domain.housingAssistantOfferShowTimes(result.OfferShowTimes);
                        housingAssistantModal.domain.sourceFunctionality(sourceFunctionality);
                        housingAssistantModal.domain.isModalWindowOpen(true);
                        housingAssistantModal.domain.showPreferencesChanged(0);
                    }
                    else if (result.ShowPreferencesChanged > 0 && sourceFunctionality === housingAssistantModal.view.sourceFunctionality.signIn) {
                        housingAssistantModal.domain.housingAssistantOfferShowTimes(result.OfferShowTimes);
                        housingAssistantModal.domain.sourceFunctionality(sourceFunctionality);
                        housingAssistantModal.domain.modalLayout(housingAssistantModal.layouts.step2);
                        housingAssistantModal.domain.isModalWindowOpen(true);
                        setTimeout(() => {
                            loader.showLoading(false);
                        }, 2000)
                        housingAssistantModal.domain.showPreferencesChanged(result.ShowPreferencesChanged);
                    }
                    else {
                        loader.showLoading(false);
                        if (callBackFunction) {
                            callBackFunction();
                        }
                    }
                }
                else {
                    pub.handleError();
                }
            }
            catch (ex) {
                pub.handleError();
            }
        }

        const signUpForHAOfferShouldShowFailure = (xhr, status, error) => {
            try {
                pub.closeModalAndHandleError();
            }
            catch (ex) {
                pub.handleError(ex);
            }
        }

        pub.handleError = (ex) => {
            try {
                loader.showLoading(false);
                $('#error-message-popup').fadeIn();
                go8Error.handleException(ex);
            }
            catch (ex) {
                go8Error.handleException(ex);
            }
        }
        pub.closeModalAndHandleError = () => {
            try {
                loader.showLoading(false);
                pub.closeModal();
                $('#error-message-popup').fadeIn();
            }
            catch (ex) {
                pub.handleError(ex);
            }
        }
        pub.onPageLoad = () => {
            try {
                loader.showLoading(true);
                listing.getTenantAccountPreferencesPreFilledData(onGetTenantDataSuccess, OnGetTenantDataFailure);
            }
            catch (ex) {
                pub.handleError(ex);
            }
        }

        pub.callSignUpForHAAPI = () => {
            try {
                listing.signUpForHAOfferShown(signUpForHAOfferShownOnSuccess, signUpForHAOfferShownOnFailure);
            }
            catch (ex) {
                pub.handleError(ex);
            }
        }

        const signUpForHAOfferShownOnSuccess = (result) => {
            try {
                loader.showLoading(false);
                if (result && result.Success) {
                    pub.onPageLoad();
                }
            }
            catch (ex) {
                pub.handleError(ex);
            }
        }
        const signUpForHAOfferShownOnFailure = (xhr, status, error) => {
            try {
                pub.closeModalAndHandleError();
            }
            catch (ex) {
                pub.handleError(ex);
            }
        }
        const onGetTenantDataSuccess = (result) => {
            try {
                if (result) {
                    housingAssistantModal.domain.housingAssistantUserData(result);
                    pub.resetData();
                }
            }
            catch (ex) {

            }
        }
        const OnGetTenantDataFailure = (xhr, status, error) => {
            try {
                loader.showLoading(false);
            }
            catch (ex) {
                pub.handleError(ex);
            }
        }
        pub.resetSteps = () => {
            try {
                housingAssistantModal.domain.modalLayout(housingAssistantModal.layouts.step1);
                housingAssistantModal.domain.cancelAndExitModalLayout(housingAssistantModal.layouts.step1);
            }
            catch (ex) {
                pub.handleError(ex);
            }
        }
        pub.resetData = () => {
            try {
                const PreferredData = { ...housingAssistantModal.domain.housingAssistantUserData() };
                if (!helper.isUndefinedOrNullOrEmpty(PreferredData) && !_.isEmpty(PreferredData)) {
                    housingAssistantModal.domain.hasVoucher(PreferredData.HasVoucher !== null ? PreferredData.HasVoucher.toString() : null);
                    housingAssistantModal.domain.pets(PreferredData.HasPets !== null ? PreferredData.HasPets.toString() : null);
                    housingAssistantModal.domain.accessibility(PreferredData.AccessibilityNeeds !== null ? PreferredData.AccessibilityNeeds.toString() : null);
                    if (!helper.isUndefinedOrNullOrEmpty(PreferredData.PreferredCity) && !helper.isUndefinedOrNullOrEmpty(PreferredData.PreferredStateCode)) {
                        housingAssistantModal.domain.preferredCityAndState(`${PreferredData.PreferredCity}, ${PreferredData.PreferredStateCode}`);
                    }
                    else {
                        housingAssistantModal.domain.preferredCityAndState(null);
                    }
                    housingAssistantModal.domain.preferredBedCount(helper.numberFormat(PreferredData.PreferredBedCount));
                    housingAssistantModal.domain.maxMonthlyRentPrice(helper.numberFormat(PreferredData.MaxMonthlyRentPrice));
                    if (PreferredData.MoveBy !== null) {
                        const moveByDays = moment(PreferredData.MoveBy).startOf("day").diff(moment(Date.now()).startOf("day"), 'days');
                        const moveByValue = moveByDays < 1 ? housingAssistantModal.view.moveByFlag.asSoonAsPossible : housingAssistantModal.view.moveByFlag.chooseDate;
                        housingAssistantModal.domain.moveBy(moveByValue);
                        if (moveByValue === housingAssistantModal.view.moveByFlag.asSoonAsPossible){
                            housingAssistantModal.domain.moveInDate(moment(new Date()).format("YYYY-MM-DD"));
                        } else{
                            housingAssistantModal.domain.moveInDate(moment(PreferredData.MoveBy).format("YYYY-MM-DD"));
                        }

                    } else {
                        housingAssistantModal.domain.moveBy(null);
                        housingAssistantModal.domain.moveInDate(null);
                    }
                }
                housingAssistantModal.housingAssistanceMoreInfoValidation.errors.showAllMessages(false);
                housingAssistantModal.housingAssistanceOtherInfoValidation.errors.showAllMessages(false);
            }
            catch (ex) {
                pub.handleError(ex);
            }
        }

        pub.OnCloseSaveSuccess = (result) => {
            try {
                if (result && result.Success) {
                    pub.handleAfterClose();
                }
                else {
                    pub.closeModalAndHandleError();
                }
            }
            catch (ex) {
                pub.handleError(ex);
            }
        }

        pub.handleAfterClose = () => {
            try {
                let prevModalLayout = housingAssistantModal.domain.modalLayout();
                housingAssistantModal.domain.isModalWindowOpen(false);

                setTimeout(() => {
                    pub.resetSteps();
                    pub.resetData();
                    if (typeof (propertyDetailsModel) != "undefined") {
                        propertyDetailsModel.domain.directInquiry.shouldShowSuccess(false);
                    }
                    if (housingAssistantModal.domain.sourceFunctionality() === housingAssistantModal.view.sourceFunctionality.directInquiry && typeof (directInquiry) != "undefined") {
                        directInquiry.addTenantInfoCookie();
                    }
                    if ((typeof (haResults) !== "undefined" || typeof (index) !== "undefined") && prevModalLayout !== housingAssistantModal.layouts.step4B &&
                        housingAssistantModal.domain.sourceFunctionality() === housingAssistantModal.view.sourceFunctionality.propertyFavorite) {
                        window.location.reload();
                    }
                }, 1000)
            }
            catch (ex) {
                pub.handleError(ex);
            }
        }

        pub.closeModal = (shouldCallAnAPI = false) => {
            try {

                if (shouldCallAnAPI && housingAssistantModal.domain.modalLayout() !== housingAssistantModal.layouts.step3A && housingAssistantModal.domain.modalLayout() !== housingAssistantModal.layouts.step3B) {
                    housingAssistantModal.domain.cancelAndExitModalLayout(housingAssistantModal.domain.modalLayout());
                    pub.onCancelCallAPI(pub.OnCloseSaveSuccess);
                }
                else {
                    pub.handleAfterClose();
                }
                housingAssistantModal.domain.housingAssistantUserData(null);
            }
            catch (ex) {
                pub.handleError(ex);
            }
        }

        pub.haveTenantPhone = function () {
            tenant.haveTenantPhone(haveTenantPhoneOnSuccess, haveTenantPhoneOnFailure);
        }

        function haveTenantPhoneOnSuccess(result) {
            const hasOptInText = result.HasOptInForSMS ? true : false;
            housingAssistantModal.domain.housingAssistantOptInText(hasOptInText)

        }

        function haveTenantPhoneOnFailure(xhr, status, error) {
            try {
                pub.closeModalAndHandleError();
            }
            catch (ex) {
                pub.handleError(ex);
            }
        }

        pub.updateContactInfo = function () {

            listing.updateContactInfo(1, 1, false, "", function () { }, function (xhr, status, error) // Failure
            {
                loader.showLoading(false);
                pub.onOpenErrorHandler();
            });
        }


        pub.saveTenantAccountPreferences = () => {
            const cityAndStateName = GetCityAndStateName();
            const messasge = {
                hasPets: housingAssistantModal.domain.hasPets(),
                accessibilityNeeds: housingAssistantModal.domain.hasAccessibility(),
                hasVoucher: housingAssistantModal.domain.hasVoucherOption(),
                moveBy: GetMoveInDate(),
                preferredCity: cityAndStateName ? cityAndStateName[0] : null,
                preferredStateCode: cityAndStateName ? cityAndStateName[1].trim() : null,
                preferredBedCount: housingAssistantModal.domain.preferredBedCount() ? Number(housingAssistantModal.domain.preferredBedCount()) : null,
                maxMonthlyRentPrice: housingAssistantModal.domain.maxMonthlyRentPrice() ? Number(housingAssistantModal.domain.maxMonthlyRentPrice().replaceAll(",", "")) : null
            };
            loader.showLoading(true);
            listing.saveTenantAccountPreferences(messasge, onSaveTenantAccountPreferencesSuccess, onSaveTenantAccountPreferencesFailure)
        }
        pub.setNextStep = (stepToSet) => {
            try {
                housingAssistantModal.domain.isModalWindowOpen(false);
                setTimeout(() => {
                    housingAssistantModal.domain.modalLayout(stepToSet);
                    housingAssistantModal.domain.isModalWindowOpen(true);
                }, 1000)
            } catch (ex) {
                pub.handleError(ex);
            }
        }
        pub.OnStepsSave = () => {
            try
            {
                switch (housingAssistantModal.domain.modalLayout()) {
                    case housingAssistantModal.layouts.step1:
                        housingAssistantModal.view.isMoveByValidationActive(true);
                        if (housingAssistantModal.housingAssistanceMoreInfoValidation.errors().length === 0){
                            pub.saveTenantAccountPreferences();
                        } else{
                            housingAssistantModal.housingAssistanceMoreInfoValidation.errors.showAllMessages();
                        }
                        break;
                    case housingAssistantModal.layouts.step2:
                        if (housingAssistantModal.housingAssistanceOtherInfoValidation.errors().length === 0){
                            pub.saveTenantAccountPreferences();
                        }
                        else{
                            housingAssistantModal.housingAssistanceOtherInfoValidation.errors.showAllMessages();
                        }
                        break;
                    case housingAssistantModal.layouts.step3:
                        if (housingAssistantModal.housingAssistanceOtherInfoValidation.errors().length === 0) {
                            pub.saveTenantAccountPreferences();
                        }
                        else {
                            housingAssistantModal.housingAssistanceOtherInfoValidation.errors.showAllMessages();
                        }
                        break;
                    case housingAssistantModal.layouts.step3A:
                        pub.closeModal();
                        break;
                    case housingAssistantModal.layouts.step3B:
                        pub.closeModal();
                        smsOptInControl.onPhoneInput('phoneInput');
                        pub.updateContactInfo();
                        break;
                    default:
                        break;
                }
            }
            catch (ex) {
                pub.handleError(ex);
            }
        }

        pub.onCancelCallAPI = (callbackSuccess) => {
            try {
                const message = {
                    CancelSignUpForHAWizardAtStep: housingAssistantModal.domain.cancelAndExitModalLayout()
                }
                listing.cancelSignUpForHAWizard(message, callbackSuccess, cancelSignUpForHAWizardOnFailure);
            }
            catch (ex) {
                pub.handleError(ex);
            }
        }

        pub.onCancelAndExitClick = () => {
            try {
                housingAssistantModal.domain.cancelAndExitModalLayout(housingAssistantModal.domain.modalLayout());
                pub.resetData();
            }
            catch (ex) {
                pub.handleError(ex);
            }
        }

        const cancelSignUpForHAWizardOnFailure = (xhr, status, error) => {
            try {
                pub.closeModalAndHandleError();
            }
            catch (ex) {
                pub.handleError(ex);
            }
        }

        const onSaveTenantAccountPreferencesSuccess = (result) => {
            try {
                if (result && result.Success) {
                    if (typeof (propertyDetailsModel) != "undefined") {
                        propertyDetailsModel.domain.directInquiry.signUpForHA(true);
                    }

                    if (housingAssistantModal.domain.modalLayout() === housingAssistantModal.layouts.step1){
                        pub.setNextStep(housingAssistantModal.layouts.step2);
                    }

                    if (housingAssistantModal.domain.modalLayout() === housingAssistantModal.layouts.step2){
                        if (housingAssistantModal.domain.housingAssistantOptInText()){
                            pub.setNextStep(housingAssistantModal.layouts.step3A);
                        } else{
                            pub.setNextStep(housingAssistantModal.layouts.step3B);
                        }
                    }
                }
                else {
                    pub.closeModalAndHandleError();
                }
                loader.showLoading(false);
            }
            catch (ex) {
                pub.handleError(ex);
            }
        }

        const onSaveTenantAccountPreferencesFailure = () => {
            try {
                pub.closeModalAndHandleError();
                loader.showLoading(false);
            }
            catch (ex) {
                pub.handleError(ex);
            }
        }

        const GetMoveInDate = () => {
            try {
                if (housingAssistantModal.domain.moveBy() === housingAssistantModal.view.moveByFlag.asSoonAsPossible){
                    return moment(new Date()).format("YYYY-MM-DD");
                }
                return housingAssistantModal.domain.moveInDate();
            }
            catch (ex) {
                pub.handleError(ex);
            }
        }

        const GetCityAndStateName = () => {
            try {
                return housingAssistantModal.domain.preferredCityAndState() ? housingAssistantModal.domain.preferredCityAndState().split(',') : null;
            }
            catch (ex) {
                pub.handleError(ex);
            }
        }

        return pub;
    }
    catch (ex) {
        pub.handleError(ex);
    }
}());

var housingAssistantModal = (function () {
    try {
        var pub = {};
        pub.layouts = {
            step1: "step1",
            step2: "step2",
            step3A: "step3A",
            step3B: "step3B",
            step4: "step4",
            step4B: "step4B",
        }
        pub.domain = {
            housingAssistantOfferShowTimes: ko.observable(0),
            housingAssistantUserData: ko.observable(null),
            modalLayout: ko.observable(pub.layouts.step1),
            cancelAndExitModalLayout: ko.observable(pub.layouts.step1),
            isModalWindowOpen: ko.observable(false),
            sourceFunctionality: ko.observable(""),
            hasVoucher: ko.observable(null).extend({ required: true }),
            pets: ko.observable(null).extend({ required: true }),
            accessibility: ko.observable(null).extend({ required: true }),
            showPreferencesChanged: ko.observable(0),
            preferredCityAndState: ko.observable(null).extend(
                {
                    required: true,
                    maxLength: 100,
                    profanity: true,
                }),
            preferredBedCount: ko.observable(null).extend(
                {
                    required: true,
                    min: 0,
                    max: 9
                }),
            maxMonthlyRentPrice: ko.observable(null).extend(
                {
                    required: true,
                    maxLength: 6,
                    //min: 100,
                    //max: 99999
                }),
            moveBy: ko.observable(null).extend({
                required: true
            }),

            preferredCityAndStateView: ko.observable(""),
            housingAssistantOptInText: ko.observable(false)
        }
        pub.view = {
            async: {
                loading: ko.observable(false)
            },
            moveByFlag: {
                asSoonAsPossible: "1",
                chooseDate: "2"
            },
            isMoveByValidationActive: ko.observable(false),
            modalHeader: ko.observable(""),
            modalDescription: ko.observable("I can help you find what you're looking for in two quick steps. Ready?"),
            sourceFunctionality: {
                directInquiry: "DIRECT_INQUIRY",
                saveSearch: "SAVE_SEARCH",
                landlordFavorites: "LANDLORD_FAVORITE",
                submittedWLAppForm: "WL_APP_FORM",
                signIn: "SIGN_IN",
                propertyFavorite: "PROPERTY_FAVORITE",
                propertyApplication: "PROPERTY_APP_FORM",
            },
            ownerName: ko.observable(''),
        }
        pub.domain.moveInDate = ko.observable("").extend({
            required: {
                onlyIf: () => {
                    return pub.domain.moveBy() === pub.view.moveByFlag.chooseDate && pub.view.isMoveByValidationActive();
                }
            },
        });
        pub.domain.hasVoucherOption = ko.computed({
            read: () => {
                return pub.domain.hasVoucher() !== null ? pub.domain.hasVoucher().toString() : null;
            },
            write: (newValue) => {
                pub.domain.hasVoucher(newValue === "true");
            },
        });
        pub.domain.hasPets = ko.computed({
            read: () => {
                return pub.domain.pets() !== null ? pub.domain.pets().toString() : null;
            },
            write: (newValue) => {
                pub.domain.pets(newValue === "true");
            }
        });
        pub.domain.hasAccessibility = ko.computed({
            read: () => {
                return pub.domain.accessibility() !== null ? pub.domain.accessibility().toString() : null;
            },
            write: (newValue) => {
                pub.domain.accessibility(newValue === "true");
            }
        });
        pub.housingAssistanceMoreInfoValidation = ko.validatedObservable([
            pub.domain.hasVoucher,
            pub.domain.pets,
            pub.domain.accessibility,
            pub.domain.moveBy,
            pub.domain.moveInDate
        ]);
        pub.housingAssistanceOtherInfoValidation = ko.validatedObservable([
            pub.domain.preferredCityAndState,
            pub.domain.preferredBedCount,
            pub.domain.maxMonthlyRentPrice
        ]);
        pub.domain.isModalWindowOpen.subscribe((newVal) => {
            if (newVal && helper.isUndefinedOrNullOrEmpty(pub.domain.housingAssistantUserData())) {
                housingAssistant.callSignUpForHAAPI();
                housingAssistant.haveTenantPhone();
            }
        });



        pub.domain.housingAssistantOfferShowTimes.subscribe((newVal) => {
            if (newVal > 1) {
                pub.view.modalDescription("Welcome back! If you are still looking, I can help you find homes that match your needs in just two quick steps. Ready? ");
            }
            else {
                pub.view.modalDescription("I can help you find what you're looking for in two quick steps. Ready?");
            }
        });

        pub.domain.sourceFunctionality.subscribe((newVal) => {
            switch (newVal) {
                case pub.view.sourceFunctionality.directInquiry:
                    pub.view.modalHeader("Your message has been sent.");
                    break;
                case pub.view.sourceFunctionality.saveSearch:
                    pub.view.modalHeader("Your search is saved.");
                    break;
                case pub.view.sourceFunctionality.landlordFavorites:
                    pub.view.modalHeader(`Owner ${pub.view.ownerName()} was added to your favorites list.`);
                    break;
                case pub.view.sourceFunctionality.submittedWLAppForm:
                    pub.view.modalHeader('Your application is submitted.');
                    break;
                case pub.view.sourceFunctionality.signIn:
                    pub.view.modalHeader('TODO : Change this later when PBI is for signin');
                    break;
                case pub.view.sourceFunctionality.propertyFavorite:
                    pub.view.modalHeader("This property was added to your favorites list.");
                    break;
                case pub.view.sourceFunctionality.propertyApplication:
                    pub.view.modalHeader("Your application is submitted.");
                    break;
                default:
                    pub.view.modalHeader("");
                    pub.view.modalDescription("");
                    break;
            }
        });

        pub.domain.moveBy.subscribe((newVal) => {
            pub.view.isMoveByValidationActive(false);
        });
        return pub;
    }
    catch (ex) {
        go8Error.handleException(ex);
    }
}());

var searchCityStateModal = function (parameters) {
    var self = this;

    if (!parameters) {
        parameters = {};
    }

    self.className = parameters.className;
    self.preferredCityAndState = parameters.preferredCityAndState;
    self.InputClassName = parameters.InputClassName;
    self.preferredCityStateId = parameters.preferredCityStateId;
    self.viewInputClass = parameters.viewInputClass;
    self.preferredCityAndStateView = parameters.preferredCityAndStateView;
    self.isSelectedFromDropDown = ko.observable(false);
    /*searchEvent.onLoad();*/

    var isAbbreviationSearched = false;
    var isAbbreviationWithSpaceSearched = false;


    self.preferredCityAndState.extend(
        {
            profanity: true,
        });


    self.preferredCityAndState.subscribe((newVal) => {
        const validInputRegex = /^[A-Za-z\s]*,?[A-Za-z\s]*$/;
        if (!validInputRegex.test(newVal)) {
            newVal = newVal.replace(/[^A-Za-z\s,]/g, '').replace(/,+/g, ',').replace(/^,+|,+$/g, '');
            self.preferredCityAndState(newVal);
        }
        if (helper.isUndefinedOrNullOrEmpty(newVal) || newVal.length < 3) {
            self.preferredCityAndStateView('');
        }
    });

    $(document).on({
        ajaxStart: function () {
            if (headerModel.view.async.loading() == undefined || headerModel.view.async.loading() === false) {
                loader.showLoading(true);
            }
        },
        ajaxStop: function () {
            loader.showLoading(false);
        },
        ajaxError: function () {
            loader.showLoading(false);
        }
    });
    $(document).ready(function () {
        var results = new Array();

        $('#' + self.preferredCityStateId).focusout(function () {
            if (!helper.isUndefinedOrNullOrEmpty(self.preferredCityAndStateView())) {
                self.isSelectedFromDropDown(true);
                self.preferredCityAndState(self.preferredCityAndStateView());
            }

            if (!helper.isUndefinedOrNullOrEmpty(self.preferredCityAndState())) {
                if (self.isSelectedFromDropDown() === false) {
                    self.preferredCityAndState.setError('Please enter a valid city.');
                }
            }
        });

        $("[id$='" + self.preferredCityStateId + "']").autocomplete({
            source: function (req, res) {
                self.isSelectedFromDropDown(false);
                var prefix = req.term;
                var getNewSuggestions = true;
                isAbbreviationSearched = false;
                isAbbreviationWithSpaceSearched = false;
                if (prefix.length >= 3 && results != null && results.length > 0) {
                    isAbbreviationSearched = /\b[smf]t[.]/i.test(prefix);
                    isAbbreviationWithSpaceSearched = /\b[smf]t\s/i.test(prefix);
                    var filteredResults = filterSuggestions(prefix, results);
                    if (filteredResults.length > 0)
                        getNewSuggestions = false;
                    if (!getNewSuggestions) {
                        res($.map(filteredResults, function (result) {
                            return {
                                value: result.searchTextToDisplay
                            }
                        }));
                    }

                }
                if (getNewSuggestions) {
                    listing.getLocationAutocompleteSuggestions(prefix.substring(0, 3), function (resp) {
                        results = new Array();
                        self.preferredCityAndStateView('');
                        isAbbreviationSearched = /\b[smf]t[.]/i.test(prefix);
                        isAbbreviationWithSpaceSearched = /\b[smf]t\s/i.test(prefix);
                        if (resp.suggestionList.length > 0)
                            results = resp.suggestionList;
                        res($.map(filterSuggestions(prefix, resp.suggestionList), function (result) {
                            return {
                                value: result.searchTextToDisplay
                            }
                        }))
                    }, function (resp) {
                    });
                }
            },
            appendTo: $("[id$='" + self.preferredCityStateId + "']").closest(".autocomplete"),
            select: function (event, ui) {
                self.preferredCityAndStateView('');
                self.preferredCityAndState(ui.item.value);

                self.isSelectedFromDropDown(true);
            },
            focus: function (event, ui) {
                var inputCode = (event.keyCode ? event.keyCode : event.which);
                if (inputCode === 40 || inputCode === 38) // 'Arrow Down and Arrow up'
                {
                    self.preferredCityAndStateView(ui.item.value);
                }
            },
            minLength: 3,
            open: function (event, ui) {
                if ($(this).data("uiAutocomplete") !== undefined) {
                    var firstSuggestionId = $(this).data("uiAutocomplete").menu.element[0].children[0];
                    var firstSuggestion = $(firstSuggestionId).text();
                    self.preferredCityAndStateView(firstSuggestion);
                }
            }
        });

        function resolvePreviewText(areaName) {
            if (helper.isUndefinedOrNullOrEmpty(areaName))
                return null;

            var result = areaName;
            if (isAbbreviationSearched) {
                result = locationHelper.convertToAbbreviationAreaName(areaName);
            }
            else if (isAbbreviationWithSpaceSearched) {
                result = locationHelper.convertToAbbreviationAreaNameWithSpace(areaName);
            }
            else {
                result = locationHelper.convertFromAbbreviationAreaName(areaName);
            }

            return locationHelper.applyLocationCapitalization(result);
        }


        function displayAutoCompleteSuggestions(suggestionItems, prefix) {
            var suggestionsBest = [];
            suggestionItems.forEach(function (item) {
                if (helper.strStartWithNoCase(locationHelper.matchWithFreeFormText(resolvePreviewText(item.searchTextToDisplay)), locationHelper.matchWithFreeFormText(prefix)
                )) {
                    item.searchTextToDisplay = resolvePreviewText(item.searchTextToDisplay);
                    suggestionsBest.push(item);
                }
            });
            return suggestionsBest;
        }

        function filterSuggestions(prefix, sourceresults) {
            return displayAutoCompleteSuggestions(sourceresults, prefix);
        }
    });
};



$.ajax
    ({
        url: '/v4/controls/SearchCityStateName/searchCityStateName.html',
        async: false,
        success: function (templateString) {
            ko.components.register('search-field',
                {
                    template: templateString,
                    viewModel: searchCityStateModal
                });
        }
    });

