/* NUGET: BEGIN LICENSE TEXT
 *
 * Microsoft grants you the right to use these script files for the sole
 * purpose of either: (i) interacting through your browser with the Microsoft
 * website or online service, subject to the applicable licensing or use
 * terms; or (ii) using the files as included with a Microsoft product subject
 * to that product's license terms. Microsoft reserves all other rights to the
 * files not expressly granted by Microsoft, whether by implication, estoppel
 * or otherwise. Insofar as a script file is dual licensed under GPL,
 * Microsoft neither took the code under GPL nor distributes it thereunder but
 * under the terms set out in this paragraph. All notices and licenses
 * below are for informational purposes only.
 *
 * NUGET: END LICENSE TEXT */
/*! jQuery Validation Plugin - v1.11.1 - 3/22/2013\n* https://github.com/jzaefferer/jquery-validation
* Copyright (c) 2013 Jörn Zaefferer; Licensed MIT */(function(t){t.extend(t.fn,{validate:function(e){if(!this.length)return e&&e.debug&&window.console&&console.warn("Nothing selected, can't validate, returning nothing."),void 0;var i=t.data(this[0],"validator");return i?i:(this.attr("novalidate","novalidate"),i=new t.validator(e,this[0]),t.data(this[0],"validator",i),i.settings.onsubmit&&(this.validateDelegate(":submit","click",function(e){i.settings.submitHandler&&(i.submitButton=e.target),t(e.target).hasClass("cancel")&&(i.cancelSubmit=!0),void 0!==t(e.target).attr("formnovalidate")&&(i.cancelSubmit=!0)}),this.submit(function(e){function s(){var s;return i.settings.submitHandler?(i.submitButton&&(s=t("<input type='hidden'/>").attr("name",i.submitButton.name).val(t(i.submitButton).val()).appendTo(i.currentForm)),i.settings.submitHandler.call(i,i.currentForm,e),i.submitButton&&s.remove(),!1):!0}return i.settings.debug&&e.preventDefault(),i.cancelSubmit?(i.cancelSubmit=!1,s()):i.form()?i.pendingRequest?(i.formSubmitted=!0,!1):s():(i.focusInvalid(),!1)})),i)},valid:function(){if(t(this[0]).is("form"))return this.validate().form();var e=!0,i=t(this[0].form).validate();return this.each(function(){e=e&&i.element(this)}),e},removeAttrs:function(e){var i={},s=this;return t.each(e.split(/\s/),function(t,e){i[e]=s.attr(e),s.removeAttr(e)}),i},rules:function(e,i){var s=this[0];if(e){var r=t.data(s.form,"validator").settings,n=r.rules,a=t.validator.staticRules(s);switch(e){case"add":t.extend(a,t.validator.normalizeRule(i)),delete a.messages,n[s.name]=a,i.messages&&(r.messages[s.name]=t.extend(r.messages[s.name],i.messages));break;case"remove":if(!i)return delete n[s.name],a;var u={};return t.each(i.split(/\s/),function(t,e){u[e]=a[e],delete a[e]}),u}}var o=t.validator.normalizeRules(t.extend({},t.validator.classRules(s),t.validator.attributeRules(s),t.validator.dataRules(s),t.validator.staticRules(s)),s);if(o.required){var l=o.required;delete o.required,o=t.extend({required:l},o)}return o}}),t.extend(t.expr[":"],{blank:function(e){return!t.trim(""+t(e).val())},filled:function(e){return!!t.trim(""+t(e).val())},unchecked:function(e){return!t(e).prop("checked")}}),t.validator=function(e,i){this.settings=t.extend(!0,{},t.validator.defaults,e),this.currentForm=i,this.init()},t.validator.format=function(e,i){return 1===arguments.length?function(){var i=t.makeArray(arguments);return i.unshift(e),t.validator.format.apply(this,i)}:(arguments.length>2&&i.constructor!==Array&&(i=t.makeArray(arguments).slice(1)),i.constructor!==Array&&(i=[i]),t.each(i,function(t,i){e=e.replace(RegExp("\\{"+t+"\\}","g"),function(){return i})}),e)},t.extend(t.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",validClass:"valid",errorElement:"label",focusInvalid:!0,errorContainer:t([]),errorLabelContainer:t([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,onfocusin:function(t){this.lastActive=t,this.settings.focusCleanup&&!this.blockFocusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,t,this.settings.errorClass,this.settings.validClass),this.addWrapper(this.errorsFor(t)).hide())},onfocusout:function(t){this.checkable(t)||!(t.name in this.submitted)&&this.optional(t)||this.element(t)},onkeyup:function(t,e){(9!==e.which||""!==this.elementValue(t))&&(t.name in this.submitted||t===this.lastElement)&&this.element(t)},onclick:function(t){t.name in this.submitted?this.element(t):t.parentNode.name in this.submitted&&this.element(t.parentNode)},highlight:function(e,i,s){"radio"===e.type?this.findByName(e.name).addClass(i).removeClass(s):t(e).addClass(i).removeClass(s)},unhighlight:function(e,i,s){"radio"===e.type?this.findByName(e.name).removeClass(i).addClass(s):t(e).removeClass(i).addClass(s)}},setDefaults:function(e){t.extend(t.validator.defaults,e)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",creditcard:"Please enter a valid credit card number.",equalTo:"Please enter the same value again.",maxlength:t.validator.format("Please enter no more than {0} characters."),minlength:t.validator.format("Please enter at least {0} characters."),rangelength:t.validator.format("Please enter a value between {0} and {1} characters long."),range:t.validator.format("Please enter a value between {0} and {1}."),max:t.validator.format("Please enter a value less than or equal to {0}."),min:t.validator.format("Please enter a value greater than or equal to {0}.")},autoCreateRanges:!1,prototype:{init:function(){function e(e){var i=t.data(this[0].form,"validator"),s="on"+e.type.replace(/^validate/,"");i.settings[s]&&i.settings[s].call(i,this[0],e)}this.labelContainer=t(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||t(this.currentForm),this.containers=t(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var i=this.groups={};t.each(this.settings.groups,function(e,s){"string"==typeof s&&(s=s.split(/\s/)),t.each(s,function(t,s){i[s]=e})});var s=this.settings.rules;t.each(s,function(e,i){s[e]=t.validator.normalizeRule(i)}),t(this.currentForm).validateDelegate(":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'] ,[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'] ","focusin focusout keyup",e).validateDelegate("[type='radio'], [type='checkbox'], select, option","click",e),this.settings.invalidHandler&&t(this.currentForm).bind("invalid-form.validate",this.settings.invalidHandler)},form:function(){return this.checkForm(),t.extend(this.submitted,this.errorMap),this.invalid=t.extend({},this.errorMap),this.valid()||t(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var t=0,e=this.currentElements=this.elements();e[t];t++)this.check(e[t]);return this.valid()},element:function(e){e=this.validationTargetFor(this.clean(e)),this.lastElement=e,this.prepareElement(e),this.currentElements=t(e);var i=this.check(e)!==!1;return i?delete this.invalid[e.name]:this.invalid[e.name]=!0,this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),i},showErrors:function(e){if(e){t.extend(this.errorMap,e),this.errorList=[];for(var i in e)this.errorList.push({message:e[i],element:this.findByName(i)[0]});this.successList=t.grep(this.successList,function(t){return!(t.name in e)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){t.fn.resetForm&&t(this.currentForm).resetForm(),this.submitted={},this.lastElement=null,this.prepareForm(),this.hideErrors(),this.elements().removeClass(this.settings.errorClass).removeData("previousValue")},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(t){var e=0;for(var i in t)e++;return e},hideErrors:function(){this.addWrapper(this.toHide).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{t(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").focus().trigger("focusin")}catch(e){}},findLastActive:function(){var e=this.lastActive;return e&&1===t.grep(this.errorList,function(t){return t.element.name===e.name}).length&&e},elements:function(){var e=this,i={};return t(this.currentForm).find("input, select, textarea").not(":submit, :reset, :image, [disabled]").not(this.settings.ignore).filter(function(){return!this.name&&e.settings.debug&&window.console&&console.error("%o has no name assigned",this),this.name in i||!e.objectLength(t(this).rules())?!1:(i[this.name]=!0,!0)})},clean:function(e){return t(e)[0]},errors:function(){var e=this.settings.errorClass.replace(" ",".");return t(this.settings.errorElement+"."+e,this.errorContext)},reset:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=t([]),this.toHide=t([]),this.currentElements=t([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(t){this.reset(),this.toHide=this.errorsFor(t)},elementValue:function(e){var i=t(e).attr("type"),s=t(e).val();return"radio"===i||"checkbox"===i?t("input[name='"+t(e).attr("name")+"']:checked").val():"string"==typeof s?s.replace(/\r/g,""):s},check:function(e){e=this.validationTargetFor(this.clean(e));var i,s=t(e).rules(),r=!1,n=this.elementValue(e);for(var a in s){var u={method:a,parameters:s[a]};try{if(i=t.validator.methods[a].call(this,n,e,u.parameters),"dependency-mismatch"===i){r=!0;continue}if(r=!1,"pending"===i)return this.toHide=this.toHide.not(this.errorsFor(e)),void 0;if(!i)return this.formatAndAdd(e,u),!1}catch(o){throw this.settings.debug&&window.console&&console.log("Exception occurred when checking element "+e.id+", check the '"+u.method+"' method.",o),o}}return r?void 0:(this.objectLength(s)&&this.successList.push(e),!0)},customDataMessage:function(e,i){return t(e).data("msg-"+i.toLowerCase())||e.attributes&&t(e).attr("data-msg-"+i.toLowerCase())},customMessage:function(t,e){var i=this.settings.messages[t];return i&&(i.constructor===String?i:i[e])},findDefined:function(){for(var t=0;arguments.length>t;t++)if(void 0!==arguments[t])return arguments[t];return void 0},defaultMessage:function(e,i){return this.findDefined(this.customMessage(e.name,i),this.customDataMessage(e,i),!this.settings.ignoreTitle&&e.title||void 0,t.validator.messages[i],"<strong>Warning: No message defined for "+e.name+"</strong>")},formatAndAdd:function(e,i){var s=this.defaultMessage(e,i.method),r=/\$?\{(\d+)\}/g;"function"==typeof s?s=s.call(this,i.parameters,e):r.test(s)&&(s=t.validator.format(s.replace(r,"{$1}"),i.parameters)),this.errorList.push({message:s,element:e}),this.errorMap[e.name]=s,this.submitted[e.name]=s},addWrapper:function(t){return this.settings.wrapper&&(t=t.add(t.parent(this.settings.wrapper))),t},defaultShowErrors:function(){var t,e;for(t=0;this.errorList[t];t++){var i=this.errorList[t];this.settings.highlight&&this.settings.highlight.call(this,i.element,this.settings.errorClass,this.settings.validClass),this.showLabel(i.element,i.message)}if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(t=0;this.successList[t];t++)this.showLabel(this.successList[t]);if(this.settings.unhighlight)for(t=0,e=this.validElements();e[t];t++)this.settings.unhighlight.call(this,e[t],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return t(this.errorList).map(function(){return this.element})},showLabel:function(e,i){var s=this.errorsFor(e);s.length?(s.removeClass(this.settings.validClass).addClass(this.settings.errorClass),s.html(i)):(s=t("<"+this.settings.errorElement+">").attr("for",this.idOrName(e)).addClass(this.settings.errorClass).html(i||""),this.settings.wrapper&&(s=s.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.append(s).length||(this.settings.errorPlacement?this.settings.errorPlacement(s,t(e)):s.insertAfter(e))),!i&&this.settings.success&&(s.text(""),"string"==typeof this.settings.success?s.addClass(this.settings.success):this.settings.success(s,e)),this.toShow=this.toShow.add(s)},errorsFor:function(e){var i=this.idOrName(e);return this.errors().filter(function(){return t(this).attr("for")===i})},idOrName:function(t){return this.groups[t.name]||(this.checkable(t)?t.name:t.id||t.name)},validationTargetFor:function(t){return this.checkable(t)&&(t=this.findByName(t.name).not(this.settings.ignore)[0]),t},checkable:function(t){return/radio|checkbox/i.test(t.type)},findByName:function(e){return t(this.currentForm).find("[name='"+e+"']")},getLength:function(e,i){switch(i.nodeName.toLowerCase()){case"select":return t("option:selected",i).length;case"input":if(this.checkable(i))return this.findByName(i.name).filter(":checked").length}return e.length},depend:function(t,e){return this.dependTypes[typeof t]?this.dependTypes[typeof t](t,e):!0},dependTypes:{"boolean":function(t){return t},string:function(e,i){return!!t(e,i.form).length},"function":function(t,e){return t(e)}},optional:function(e){var i=this.elementValue(e);return!t.validator.methods.required.call(this,i,e)&&"dependency-mismatch"},startRequest:function(t){this.pending[t.name]||(this.pendingRequest++,this.pending[t.name]=!0)},stopRequest:function(e,i){this.pendingRequest--,0>this.pendingRequest&&(this.pendingRequest=0),delete this.pending[e.name],i&&0===this.pendingRequest&&this.formSubmitted&&this.form()?(t(this.currentForm).submit(),this.formSubmitted=!1):!i&&0===this.pendingRequest&&this.formSubmitted&&(t(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},previousValue:function(e){return t.data(e,"previousValue")||t.data(e,"previousValue",{old:null,valid:!0,message:this.defaultMessage(e,"remote")})}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(e,i){e.constructor===String?this.classRuleSettings[e]=i:t.extend(this.classRuleSettings,e)},classRules:function(e){var i={},s=t(e).attr("class");return s&&t.each(s.split(" "),function(){this in t.validator.classRuleSettings&&t.extend(i,t.validator.classRuleSettings[this])}),i},attributeRules:function(e){var i={},s=t(e),r=s[0].getAttribute("type");for(var n in t.validator.methods){var a;"required"===n?(a=s.get(0).getAttribute(n),""===a&&(a=!0),a=!!a):a=s.attr(n),/min|max/.test(n)&&(null===r||/number|range|text/.test(r))&&(a=Number(a)),a?i[n]=a:r===n&&"range"!==r&&(i[n]=!0)}return i.maxlength&&/-1|2147483647|524288/.test(i.maxlength)&&delete i.maxlength,i},dataRules:function(e){var i,s,r={},n=t(e);for(i in t.validator.methods)s=n.data("rule-"+i.toLowerCase()),void 0!==s&&(r[i]=s);return r},staticRules:function(e){var i={},s=t.data(e.form,"validator");return s.settings.rules&&(i=t.validator.normalizeRule(s.settings.rules[e.name])||{}),i},normalizeRules:function(e,i){return t.each(e,function(s,r){if(r===!1)return delete e[s],void 0;if(r.param||r.depends){var n=!0;switch(typeof r.depends){case"string":n=!!t(r.depends,i.form).length;break;case"function":n=r.depends.call(i,i)}n?e[s]=void 0!==r.param?r.param:!0:delete e[s]}}),t.each(e,function(s,r){e[s]=t.isFunction(r)?r(i):r}),t.each(["minlength","maxlength"],function(){e[this]&&(e[this]=Number(e[this]))}),t.each(["rangelength","range"],function(){var i;e[this]&&(t.isArray(e[this])?e[this]=[Number(e[this][0]),Number(e[this][1])]:"string"==typeof e[this]&&(i=e[this].split(/[\s,]+/),e[this]=[Number(i[0]),Number(i[1])]))}),t.validator.autoCreateRanges&&(e.min&&e.max&&(e.range=[e.min,e.max],delete e.min,delete e.max),e.minlength&&e.maxlength&&(e.rangelength=[e.minlength,e.maxlength],delete e.minlength,delete e.maxlength)),e},normalizeRule:function(e){if("string"==typeof e){var i={};t.each(e.split(/\s/),function(){i[this]=!0}),e=i}return e},addMethod:function(e,i,s){t.validator.methods[e]=i,t.validator.messages[e]=void 0!==s?s:t.validator.messages[e],3>i.length&&t.validator.addClassRules(e,t.validator.normalizeRule(e))},methods:{required:function(e,i,s){if(!this.depend(s,i))return"dependency-mismatch";if("select"===i.nodeName.toLowerCase()){var r=t(i).val();return r&&r.length>0}return this.checkable(i)?this.getLength(e,i)>0:t.trim(e).length>0},email:function(t,e){return this.optional(e)||/^((([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(t)},url:function(t,e){return this.optional(e)||/^(https?|s?ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([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])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(t)},date:function(t,e){return this.optional(e)||!/Invalid|NaN/.test(""+new Date(t))},dateISO:function(t,e){return this.optional(e)||/^\d{4}[\/\-]\d{1,2}[\/\-]\d{1,2}$/.test(t)},number:function(t,e){return this.optional(e)||/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(t)},digits:function(t,e){return this.optional(e)||/^\d+$/.test(t)},creditcard:function(t,e){if(this.optional(e))return"dependency-mismatch";if(/[^0-9 \-]+/.test(t))return!1;var i=0,s=0,r=!1;t=t.replace(/\D/g,"");for(var n=t.length-1;n>=0;n--){var a=t.charAt(n);s=parseInt(a,10),r&&(s*=2)>9&&(s-=9),i+=s,r=!r}return 0===i%10},minlength:function(e,i,s){var r=t.isArray(e)?e.length:this.getLength(t.trim(e),i);return this.optional(i)||r>=s},maxlength:function(e,i,s){var r=t.isArray(e)?e.length:this.getLength(t.trim(e),i);return this.optional(i)||s>=r},rangelength:function(e,i,s){var r=t.isArray(e)?e.length:this.getLength(t.trim(e),i);return this.optional(i)||r>=s[0]&&s[1]>=r},min:function(t,e,i){return this.optional(e)||t>=i},max:function(t,e,i){return this.optional(e)||i>=t},range:function(t,e,i){return this.optional(e)||t>=i[0]&&i[1]>=t},equalTo:function(e,i,s){var r=t(s);return this.settings.onfocusout&&r.unbind(".validate-equalTo").bind("blur.validate-equalTo",function(){t(i).valid()}),e===r.val()},remote:function(e,i,s){if(this.optional(i))return"dependency-mismatch";var r=this.previousValue(i);if(this.settings.messages[i.name]||(this.settings.messages[i.name]={}),r.originalMessage=this.settings.messages[i.name].remote,this.settings.messages[i.name].remote=r.message,s="string"==typeof s&&{url:s}||s,r.old===e)return r.valid;r.old=e;var n=this;this.startRequest(i);var a={};return a[i.name]=e,t.ajax(t.extend(!0,{url:s,mode:"abort",port:"validate"+i.name,dataType:"json",data:a,success:function(s){n.settings.messages[i.name].remote=r.originalMessage;var a=s===!0||"true"===s;if(a){var u=n.formSubmitted;n.prepareElement(i),n.formSubmitted=u,n.successList.push(i),delete n.invalid[i.name],n.showErrors()}else{var o={},l=s||n.defaultMessage(i,"remote");o[i.name]=r.message=t.isFunction(l)?l(e):l,n.invalid[i.name]=!0,n.showErrors(o)}r.valid=a,n.stopRequest(i,a)}},s)),"pending"}}}),t.format=t.validator.format})(jQuery),function(t){var e={};if(t.ajaxPrefilter)t.ajaxPrefilter(function(t,i,s){var r=t.port;"abort"===t.mode&&(e[r]&&e[r].abort(),e[r]=s)});else{var i=t.ajax;t.ajax=function(s){var r=("mode"in s?s:t.ajaxSettings).mode,n=("port"in s?s:t.ajaxSettings).port;return"abort"===r?(e[n]&&e[n].abort(),e[n]=i.apply(this,arguments),e[n]):i.apply(this,arguments)}}}(jQuery),function(t){t.extend(t.fn,{validateDelegate:function(e,i,s){return this.bind(i,function(i){var r=t(i.target);return r.is(e)?s.apply(r,arguments):void 0})}})}(jQuery);
/* NUGET: BEGIN LICENSE TEXT
 *
 * Microsoft grants you the right to use these script files for the sole
 * purpose of either: (i) interacting through your browser with the Microsoft
 * website or online service, subject to the applicable licensing or use
 * terms; or (ii) using the files as included with a Microsoft product subject
 * to that product's license terms. Microsoft reserves all other rights to the
 * files not expressly granted by Microsoft, whether by implication, estoppel
 * or otherwise. Insofar as a script file is dual licensed under GPL,
 * Microsoft neither took the code under GPL nor distributes it thereunder but
 * under the terms set out in this paragraph. All notices and licenses
 * below are for informational purposes only.
 *
 * NUGET: END LICENSE TEXT */

/**
* bootstrap.js v3.0.0 by @fat and @mdo
* Copyright 2013 Twitter Inc.
* http://www.apache.org/licenses/LICENSE-2.0
*/
if(!jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(window.jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]');if(a.length){var b=this.$element.find("input").prop("checked",!this.$element.hasClass("active")).trigger("change");"radio"===b.prop("type")&&a.find(".active").removeClass("active")}this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(window.jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(window.jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a('<div class="dropdown-backdrop"/>').insertAfter(a(this)).on("click",b),f.trigger(d=a.Event("show.bs.dropdown")),d.isDefaultPrevented())return;f.toggleClass("open").trigger("shown.bs.dropdown"),e.focus()}return!1}},f.prototype.keydown=function(b){if(/(38|40|27)/.test(b.keyCode)){var d=a(this);if(b.preventDefault(),b.stopPropagation(),!d.is(".disabled, :disabled")){var f=c(d),g=f.hasClass("open");if(!g||g&&27==b.keyCode)return 27==b.which&&f.find(e).focus(),d.click();var h=a("[role=menu] li:not(.divider):visible a",f);if(h.length){var i=h.index(h.filter(":focus"));38==b.keyCode&&i>0&&i--,40==b.keyCode&&i<h.length-1&&i++,~i||(i=0),h.eq(i).focus()}}}};var g=a.fn.dropdown;a.fn.dropdown=function(b){return this.each(function(){var c=a(this),d=c.data("dropdown");d||c.data("dropdown",d=new f(this)),"string"==typeof b&&d[b].call(c)})},a.fn.dropdown.Constructor=f,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=g,this},a(document).on("click.bs.dropdown.data-api",b).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",e,f.prototype.toggle).on("keydown.bs.dropdown.data-api",e+", [role=menu]",f.prototype.keydown)}(window.jQuery),+function(a){"use strict";var b=function(b,c){this.options=c,this.$element=a(b),this.$backdrop=this.isShown=null,this.options.remote&&this.$element.load(this.options.remote)};b.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},b.prototype.toggle=function(a){return this[this.isShown?"hide":"show"](a)},b.prototype.show=function(b){var c=this,d=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(d),this.isShown||d.isDefaultPrevented()||(this.isShown=!0,this.escape(),this.$element.on("click.dismiss.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.backdrop(function(){var d=a.support.transition&&c.$element.hasClass("fade");c.$element.parent().length||c.$element.appendTo(document.body),c.$element.show(),d&&c.$element[0].offsetWidth,c.$element.addClass("in").attr("aria-hidden",!1),c.enforceFocus();var e=a.Event("shown.bs.modal",{relatedTarget:b});d?c.$element.find(".modal-dialog").one(a.support.transition.end,function(){c.$element.focus().trigger(e)}).emulateTransitionEnd(300):c.$element.focus().trigger(e)}))},b.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").attr("aria-hidden",!0).off("click.dismiss.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one(a.support.transition.end,a.proxy(this.hideModal,this)).emulateTransitionEnd(300):this.hideModal())},b.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.focus()},this))},b.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keyup.dismiss.bs.modal")},b.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.removeBackdrop(),a.$element.trigger("hidden.bs.modal")})},b.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},b.prototype.backdrop=function(b){var c=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var d=a.support.transition&&c;if(this.$backdrop=a('<div class="modal-backdrop '+c+'" />').appendTo(document.body),this.$element.on("click.dismiss.modal",a.proxy(function(a){a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus.call(this.$element[0]):this.hide.call(this))},this)),d&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;d?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()}else!this.isShown&&this.$backdrop?(this.$backdrop.removeClass("in"),a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one(a.support.transition.end,b).emulateTransitionEnd(150):b()):b&&b()};var c=a.fn.modal;a.fn.modal=function(c,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},b.DEFAULTS,e.data(),"object"==typeof c&&c);f||e.data("bs.modal",f=new b(this,g)),"string"==typeof c?f[c](d):g.show&&f.show(d)})},a.fn.modal.Constructor=b,a.fn.modal.noConflict=function(){return a.fn.modal=c,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(b){var c=a(this),d=c.attr("href"),e=a(c.attr("data-target")||d&&d.replace(/.*(?=#[^\s]+$)/,"")),f=e.data("modal")?"toggle":a.extend({remote:!/#/.test(d)&&d},e.data(),c.data());b.preventDefault(),e.modal(f,this).one("hide",function(){c.is(":visible")&&c.focus()})}),a(document).on("show.bs.modal",".modal",function(){a(document.body).addClass("modal-open")}).on("hidden.bs.modal",".modal",function(){a(document.body).removeClass("modal-open")})}(window.jQuery),+function(a){"use strict";var b=function(a,b){this.type=this.options=this.enabled=this.timeout=this.hoverState=this.$element=null,this.init("tooltip",a,b)};b.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1},b.prototype.init=function(b,c,d){this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d);for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focus",i="hover"==g?"mouseleave":"blur";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},b.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},b.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show),void 0):c.show()},b.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type);return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide),void 0):c.hide()},b.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){if(this.$element.trigger(b),b.isDefaultPrevented())return;var c=this.tip();this.setContent(),this.options.animation&&c.addClass("fade");var d="function"==typeof this.options.placement?this.options.placement.call(this,c[0],this.$element[0]):this.options.placement,e=/\s?auto?\s?/i,f=e.test(d);f&&(d=d.replace(e,"")||"top"),c.detach().css({top:0,left:0,display:"block"}).addClass(d),this.options.container?c.appendTo(this.options.container):c.insertAfter(this.$element);var g=this.getPosition(),h=c[0].offsetWidth,i=c[0].offsetHeight;if(f){var j=this.$element.parent(),k=d,l=document.documentElement.scrollTop||document.body.scrollTop,m="body"==this.options.container?window.innerWidth:j.outerWidth(),n="body"==this.options.container?window.innerHeight:j.outerHeight(),o="body"==this.options.container?0:j.offset().left;d="bottom"==d&&g.top+g.height+i-l>n?"top":"top"==d&&g.top-l-i<0?"bottom":"right"==d&&g.right+h>m?"left":"left"==d&&g.left-h<o?"right":d,c.removeClass(k).addClass(d)}var p=this.getCalculatedOffset(d,g,h,i);this.applyPlacement(p,d),this.$element.trigger("shown.bs."+this.type)}},b.prototype.applyPlacement=function(a,b){var c,d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),a.top=a.top+g,a.left=a.left+h,d.offset(a).addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;if("top"==b&&j!=f&&(c=!0,a.top=a.top+f-j),/bottom|top/.test(b)){var k=0;a.left<0&&(k=-2*a.left,a.left=0,d.offset(a),i=d[0].offsetWidth,j=d[0].offsetHeight),this.replaceArrow(k-e+i,i,"left")}else this.replaceArrow(j-f,j,"top");c&&d.offset(a)},b.prototype.replaceArrow=function(a,b,c){this.arrow().css(c,a?50*(1-a/b)+"%":"")},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},b.prototype.hide=function(){function b(){"in"!=c.hoverState&&d.detach()}var c=this,d=this.tip(),e=a.Event("hide.bs."+this.type);return this.$element.trigger(e),e.isDefaultPrevented()?void 0:(d.removeClass("in"),a.support.transition&&this.$tip.hasClass("fade")?d.one(a.support.transition.end,b).emulateTransitionEnd(150):b(),this.$element.trigger("hidden.bs."+this.type),this)},b.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},b.prototype.hasContent=function(){return this.getTitle()},b.prototype.getPosition=function(){var b=this.$element[0];return a.extend({},"function"==typeof b.getBoundingClientRect?b.getBoundingClientRect():{width:b.offsetWidth,height:b.offsetHeight},this.$element.offset())},b.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},b.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},b.prototype.tip=function(){return this.$tip=this.$tip||a(this.options.template)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},b.prototype.validate=function(){this.$element[0].parentNode||(this.hide(),this.$element=null,this.options=null)},b.prototype.enable=function(){this.enabled=!0},b.prototype.disable=function(){this.enabled=!1},b.prototype.toggleEnabled=function(){this.enabled=!this.enabled},b.prototype.toggle=function(b){var c=b?a(b.currentTarget)[this.type](this.getDelegateOptions()).data("bs."+this.type):this;c.tip().hasClass("in")?c.leave(c):c.enter(c)},b.prototype.destroy=function(){this.hide().$element.off("."+this.type).removeData("bs."+this.type)};var c=a.fn.tooltip;a.fn.tooltip=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof c&&c;e||d.data("bs.tooltip",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.tooltip.Constructor=b,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=c,this}}(window.jQuery),+function(a){"use strict";var b=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");b.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(window.jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parents(".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(window.jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.attr("data-target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top()),"function"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;this.affixed!==i&&(this.unpin&&this.$element.css("top",""),this.affixed=i,this.unpin="bottom"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),"bottom"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(window.jQuery);
/* exported UTILITIES */
var UTILITIES = (function () {

    activate();

    return {
        arrayContains: function arrayContains(value, arrayToCheck) {
            var match = false;

            for (var i = 0, arrayLength = arrayToCheck.length; i < arrayLength; i++) {
                if (arrayToCheck[i] === value) {
                    match = true;
                    break;
                }
            }

            return match;
        },
        consoleSupport: function consoleSupport() {
            // prevent errors for browsers without console object
            if (typeof console === "undefined") {
                console = {
                    log: function (v) { },
                    info: function (v) { },
                    warn: function (v) { },
                    error: function (v) { }
                };
            }
        },
        convertDateFormat: function (date) {
            return (date.getMonth() + 1) + "-" + date.getDate() + "-" + date.getFullYear() + " " + date.getHours() + ':' + date.getMinutes() + ':' + date.getSeconds();
        },
        elementsArePresent: function elementsArePresent(elements) {
            //@ pass a single element or an array of elements (jquery or non jquery elements)
            var i,
                singleElement,
                noMissingElements = true;

            if (Array.isArray(elements)) {
                for (i = 0; i < elements.length; i++) {
                    if (typeof elements[i] === 'undefined' || elements[i] === null || elements[i].length <= 0) {
                        noMissingElements = false;
                        break;
                    }
                }
            } else {
                singleElement = elements;
                if (typeof singleElement === 'undefined' || singleElement === null || singleElement.length <= 0) {
                    noMissingElements = false;
                }
            }

            return noMissingElements;
        },
        formatMoney: function formatMoney(nStr, decimals) {
            var x = parseFloat(nStr).toFixed(2).split("."),
                rgx = /(\d+)(\d{3})/;
            while (rgx.test(x[0])) {
                x[0] = x[0].replace(rgx, "$1" + "," + "$2");
            }
            if (decimals === false) {
                return "$" + x[0];
            } else {
                return "$" + x[0] + "." + x[1];
            }
        },
        formatMVCDate: function formatMVCDate(dateToFilter) {
            if (typeof dateToFilter !== 'undefined' && dateToFilter !== null && dateToFilter !== "" && dateToFilter.length) {
                try {
                    var date = new Date(parseInt(dateToFilter.substr(6))),
                        formattedDate = (date.getMonth() + 1) + "/" + date.getDate() + "/" + date.getFullYear();

                    return formattedDate;
                } catch (e) {
                    return null;
                }
            } else {
                return null;
            }
        },
        isValidTime: function isValidTime(timeString) {
            var time = new Date("4/1/2018 " + timeString);

            if (isNaN(time.getTime()) === true) {
                return false;
            } else {
                return true;
            }
        },
        generateGuid: function generateGuid() {
            var guid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
                var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
                return v.toString(16);
            });

            return guid;
        },
        getMonthName: function (monthIndex) {
            var monthNames = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"];

            return monthNames[monthIndex];
        },
        getQueryStringValue: function getQueryStringValue(variable) {
            var query = window.location.search.substring(1),
                vars = query.split("&"),
                pair = "",
                i = 0;
            for (i = 0; i < vars.length; i++) {
                pair = vars[i].split("=");
                if (pair[0].toLowerCase() === variable.toLowerCase()) {
                    return pair[1];
                }
            }
        },
        makeSafeForCSS: function makeSafeForCSS(name) {
            return name.replace(/[^a-z0-9]/g, function (s) {
                var c = s.charCodeAt(0);
                if (c == 32) return '-';
                if (c >= 65 && c <= 90) return '_' + s.toLowerCase();
                return '__' + ('000' + c.toString(16)).slice(-4);
            });
        },
        objectIsNullOrEmptyOrUndefined: function objectIsEmpty(objectToCheck) {
            var empty = true;

            if (typeof objectToCheck !== 'undefined' && objectToCheck !== null) {
                for (var prop in objectToCheck) {
                    if (objectToCheck.hasOwnProperty(prop)) {
                        empty = false;
                    }
                }
            }

            return empty;
        },
        randomNumber: function randomNumber(between) {
            return Math.floor(Math.random() * between) + 1;
        },
        parseQueryString: function parseQueryString(queryString) {
            //pass window.location.search.substring(1)
            var decodedQueryString = decodeURIComponent(queryString.toLowerCase());
            var params = {}, queries, temp, i, l, empty;

            if (decodedQueryString !== "") {
                // Split into key/value pairs
                // array created if format (widget=foo&widget=bar)
                queries = decodedQueryString.split(/&(?:amp;)?/gi);

                // Convert the array of strings into an object
                for (i = 0, l = queries.length; i < l; i++) {
                    temp = queries[i].split('=');
                    if (typeof params[temp[0]] === 'undefined') {
                        params[temp[0]] = temp[1];
                    } else {
                        if (typeof params[temp[0]] === 'string') {
                            params[temp[0]] = [params[temp[0]]];
                        }
                        params[temp[0]].push(temp[1]);
                    }
                }

                return params;
            }

            return empty;
        },
        scrubQueryParams: function scrubQueryParams(locationObj, whiteList) {
            //@ locationObj: window.location
            //@ whiteList: ["appealcode", "reportid"] array of query params lowercased
            //@ utilities.scrubQueryParams(window.location, ["appealcode", "reportid"]);
            //@ requires utilities.parseQueryString
            var queryStrings = this.parseQueryString(locationObj.search.substring(1)),
                allowedParams = (typeof whiteList !== 'undefined' && typeof queryStrings !== 'undefined') ? _buildAllowedParamsString() : "";

            return [locationObj.protocol, '//', locationObj.host, locationObj.pathname, allowedParams].join('');

            /////

            function _buildAllowedParamsString() {
                var returnString = "";

                for (var i = 0; i < whiteList.length; i++) {
                    if (whiteList[i] in queryStrings) {
                        if (returnString !== "") { returnString += "&" }
                        returnString += (whiteList[i] + "=" + queryStrings[whiteList[i]]);
                    }
                }

                returnString = (returnString !== "") ? "?" + returnString : "";

                return returnString;
            }
        },
        shuffle: function shuffle(array) {
            var currentIndex = array.length, temporaryValue, randomIndex;

            // While there remain elements to shuffle...
            while (0 !== currentIndex) {

                // Pick a remaining element...
                randomIndex = Math.floor(Math.random() * currentIndex);
                currentIndex -= 1;

                // And swap it with the current element.
                temporaryValue = array[currentIndex];
                array[currentIndex] = array[randomIndex];
                array[randomIndex] = temporaryValue;
            }

            return array;
        },
        testCookieSupport: function testCookieSupport() {
            document.cookie = "uwTestCookie=true;";

            var cookiesEnabled = false,
                ca = document.cookie.split('; '),
                i = 0;

            for (i = 0; i < ca.length; i++) {
                if (ca[i].indexOf("uwTestCookie=") === 0) {
                    cookiesEnabled = true;
                    document.cookie = "uwTestCookie=; expires=Sat, 01 Jan 2000 00:00:00 UTC;"; // Expire it
                    break;
                }
            }

            return cookiesEnabled;
        },
        toBool: function toBool(val) {
            if (val.toLowerCase() === "true") {
                return true;
            } else {
                return false;
            }
        },
        valueIsDefined: function (val) {
            if (typeof val !== 'undefined' && val !== null && val !== '') {
                return true;
            }

            return false;
        },
        scrollToElement: function ($element, offsetPadding) {
            var scrollTop = $element.offset().top;

            $('html, body').animate({
                scrollTop: scrollTop + (offsetPadding ? offsetPadding : 0)
            }, 2000);
        },
        serializeObjectAsQueryString: function serializeObjectAsQueryString(obj) {
            var str = [];
            for (var p in obj)
                if (Object.prototype.hasOwnProperty.call(obj, p)) {
                    str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]).replace(/\(/g, "%28").replace(/\)/g, "%29"));
                }
            return str.join("&");
        }
    };

    //////////////

    function activate() {
        _loadPolyfills();
    }

    /////////////

    function _loadPolyfills() {
        //isArray
        if (!Array.isArray) {
            Array.isArray = function (arg) {
                return Object.prototype.toString.call(arg) === '[object Array]';
            };
        }
    }

})();
/* globals SERVER_SETTINGS */
/* exported ERRORMESSENGER */
var ERRORMESSENGER = (function () {
    return {
        sendError: function sendError(errorString, redirect) {
            var data = {
                javascriptError: errorString
            };

            if (SERVER_SETTINGS.siteMode.toLowerCase() !== "dev") {
                $.ajax({
                    type: 'POST',
                    data: data,
                    url: SERVER_SETTINGS.applicationRoot + "Base/JavascriptError",
                    success: function () {
                        if (redirect === true) {
                            window.location.replace(SERVER_SETTINGS.applicationRoot + "Error/");
                        }
                    },
                    error: function () {
                        if (redirect === true) {
                            window.location.replace(SERVER_SETTINGS.applicationRoot + "Error/");
                        }
                    }
                });
            } else {
                console.error(errorString);
            }
        }
    };
})();
/*
Tooltip.js version 1.3, updated 4/18/14
Written by Colin McClure 2/01/13 // Updates by Ryan Grant
Requires jQuery version 1.7 or greater

HTML Syntax: <span data-tooltip="<em class='purple'>html enabled content</em>">Hover on me</span>

4/18/14 - attach mousemove and mouseleave events to tooltip directly rather than with delegate binding on the body
3/17/14 - If "prevent-tooltip" class is present, don't show popup. Useful for disabling in mobile views.
1/3/14 - fixed ie8 bug
6/27/13 - replaced deprecated jquery live() method with on() method - Ryan W Grant

*/

(function ($) {
    $.event.special.destroyed = {
        remove: function (o) {
            if (o.handler) {
                o.handler();
            }
        }
    };
})(jQuery);

$(document).ready(function () {
    var xOffset = 10,
		yOffset = 10,
		padding = 10,
		activeTooltips = [],
        browser = {
            version: function () {
                var version = 999; //Returns 999 if not IE
                if (navigator.appVersion.indexOf("MSIE") != -1) {
                    version = parseFloat(navigator.appVersion.split("MSIE")[1]);
                }
                return version;
            }
        };

    if (!Array.prototype.indexOf) {//adds indexOf method to array object for IE8
        Array.prototype.indexOf = function (obj, start) {
            for (var i = (start || 0), j = this.length; i < j; i++) {
                if (this[i] === obj) { return i; }
            }
            return -1;
        };
    }

    function updatePosition(theTooltip, event) {
        var windowWidth = $(window).width(),
            viewportBottom = $(window).scrollTop() + $(window).height(),
			tooltipHeight = theTooltip.outerHeight() + padding,
			tooltipWidth = theTooltip.outerWidth() + padding,
			xPosition = 0,
			yPosition = 0;
        if (event.pageY + tooltipHeight < viewportBottom) {
            yPosition = event.pageY - yOffset;
        } else {
            yPosition = viewportBottom - tooltipHeight - yOffset;
        }
        if (event.pageX + tooltipWidth + xOffset < windowWidth) {
            xPosition = event.pageX + xOffset;
        } else {
            xPosition = event.pageX - (tooltipWidth - padding + xOffset);
        }
        return {
            "top": yPosition + "px",
            "left": xPosition + "px"
        };
    }

    function removeFromActiveTooltips(id) {
        var result = $.grep(activeTooltips, function (e) { return e.id == id; }),
			index = activeTooltips.indexOf(result[0]);
        activeTooltips.splice(index, 1);
    }

    (function mouseMoveToolTip() {

        var outer_mousemove = false,
            theTooltip;

        $("body").on("mouseenter", "[data-tooltip]", function (e) {
            if (!$(this).hasClass("prevent-tooltip")) {
                this.tooltipData = this.getAttribute("data-tooltip");
                this.tempTitle = this.title;
                this.title = "";
                this.timestamp = new Date().getTime();

                outer_mousemove = true;

                $("body").append("<div id='tooltip" + this.timestamp + "' class='tooltipBox'>" + this.tooltipData + "</div>");
                theTooltip = $("#tooltip" + this.timestamp);
                activeTooltips.push({
                    id: this.timestamp,
                    parent: $(this),
                    tooltip: theTooltip
                });
                theTooltip.css(updatePosition(theTooltip, e)).fadeIn(100);

                $(this).on("mousemove", function (e) {
                    if (outer_mousemove && !$(this).hasClass("prevent-tooltip")) {
                        theTooltip.css(updatePosition(theTooltip, e));
                    }
                }).on("mouseleave", function () {
                    if (!$(this).hasClass("prevent-tooltip")) {
                        theTooltip.fadeOut(100, function () {
                            $(this).remove();
                        });
                        removeFromActiveTooltips(this.timestamp);
                        this.title = this.tempTitle;
                    }
                });
            }
        }).bind("destroyed", function () {
            if (!$(this).hasClass("prevent-tooltip")) {
                for (var i = 0; i < activeTooltips.length; i++) {
                    if (activeTooltips[i].parent.closest("body").length > 0) {
                        activeTooltips[i].tooltip.fadeOut(100, function () {
                            $(this).remove();
                        });
                        removeFromActiveTooltips(activeTooltips[i].parent.timestamp);
                    }
                }
            }
        });
    })();
});
/*
BootstrapModalCreator.js version 1.3.5
A jquery plugin for dynamic creation of bootstrap modals
Written by Ryan Grant 5/14/14
Requires jQuery version 1.7 or greater and boostrap framework (css and boostrap.js)

Usage: $.showBsModal(optionsObject);

var optionsObject = {
    title: "Your Modal Title",
    content: "Your Modal Content",
    noHeader: false, // or true,
    noFooter: false, // or true,
    bootstrapOptions: "",// see bootstrap3 documentation
    buttons: [{ text: "Yes", id: "buttonID", className: "btn btn-primary", data: "data-something='true'" }],
    width: "", // "10px" || "80%"
    size: "", // "modal-sm" || "modal-lg"
    marginTop: "", // eg. 15% || 30px
    onClose: function() {}, //your custom on close function
    id: "uniqueModalID", // css selector
    className: "", // pass an extra class name for unique styling eg. "ab-modal-primary"
    ajaxLoadingMessage: "", // eg. Modal Loading
    ajaxContent: "", // Pass "URL" to do an ajax load of content into the modal, a div with class "modal-loading" will be displayed first. Pass [URL, DATA] if you have data to send to controller for your ajax load. 
    ajaxCallBack: function (response, status, xhr) { yourGlobaFunctionName(response, status, xhr); }
}

Updates: 07/30/14: Allow content option to pre-populate modal when ajaxContent will be loaded. Allows for custom loading message.
         08/08/14: Use new option "ajaxLoadingMessage" for message to display while ajax content is being loaded. Apply class to modal-content as it's loading ".ab-modal-loading", put message in div with <div class="modal-loading-img"> and vertically center it all.
         12/12/2014: REQUIRED: This version now requires ApplicationBase-2.0.3. Fixed issue with noHeader: true option also hiding footer.
         01/08/15: Fix issue with loading height when footer or header was  present
         4/13/2016: Pass parameters to ajax callback, reponse, status and XHR
*/

; (function ($) {

    $.extend({
        showBsModal: function (modalOptions) {
            //modal options
            var options = $.extend({
                title: "Alert",
                content: "",
                noHeader: false,
                noFooter: false,
                bootstrapOptions: null,
                buttons: null,
                width: null,
                size: null,
                marginTop: null,
                onClose: null,
                id: "myModalID" + $('.modal').length,
                className: null,
                ajaxLoadingMessage: "",
                ajaxContent: null,
                ajaxCallBack: null
            }, modalOptions);

            var modalTemplate = "",
                contentContainer = (options.noHeader === true && options.noFooter === true) ? ".modal-content" : ".modal-body";

            if (options.ajaxContent !== null) {
                options.content = "<div class='modal-loading-msg'>" + ((options.ajaxLoadingMessage) ? options.ajaxLoadingMessage : "") + "<div class='modal-loading-img'></div></div>";
            }

            // build modal template
            (function () {
                modalTemplate += '<div class="modal fade" id="' + options.id + '" tabindex="-1" role="dialog" aria-labelledby="' + options.title.replace(/ /g, '') + 'ModalLabel" aria-hidden="true">' +
                    '<div class="modal-dialog';
                if (options.className) { modalTemplate += ' ' + options.className; }
                if (options.size) {
                    modalTemplate += ' ' + options.size;
                }
                modalTemplate += '"';
                if (options.width || options.marginTop) {
                    modalTemplate += ' style="';
                    if (options.width) { modalTemplate += 'width:' + options.width + ';'; }
                    if (options.marginTop) { modalTemplate += 'margin-top:' + options.marginTop + ';'; }
                    modalTemplate += '"';
                }
                modalTemplate += '><div class="modal-content';
                if (options.ajaxContent !== null) {
                    modalTemplate += ' ab-modal-loading';
                    if (options.noFooter === false) {
                        modalTemplate += ' loading-with-footer';
                    }
                    if (options.noHeader === false) {
                        modalTemplate += ' loading-with-header';
                    }
                }
                modalTemplate += '"';
                modalTemplate += ' id="' + options.id + '-content"';
                modalTemplate += '>';

                if (options.noHeader !== true) {
                    modalTemplate += '<div class="modal-header">' +
                                        '<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>' +
                                        '<h4 class="modal-title" id="' + options.title.replace(/ /g, '') + 'ModalLabel">' +
                                            options.title +
                                        '</h4>' +
                                     '</div>';
                    //modalTemplate += '<div class="modal-body">' +
                    //                    options.content +
                    //                 '</div>';
                    //} else {
                    //    modalTemplate += options.content;
                }

                if (options.noHeader === true && options.noFooter === true) {
                    modalTemplate += options.content;
                } else {
                    modalTemplate += '<div class="modal-body">' +
                                        options.content +
                                     '</div>';
                }

                if (options.noFooter !== true) {
                    modalTemplate += '<div class="modal-footer">';

                    if (options.buttons) {
                        $.each(options.buttons, function (i, button) {
                            modalTemplate += '<button type="button" class="';
                            if (button.className) {
                                modalTemplate += button.className;
                            } else {
                                modalTemplate += 'btn btn-default';
                            }
                            modalTemplate += '" id="';
                            if (button.id) {
                                modalTemplate += button.id;
                            } else {
                                modalTemplate += options.id + button.text + "button";
                            }
                            if (button.onClick) {
                                modalTemplate += '" onClick="';
                                modalTemplate += button.onClick;
                            }

                            modalTemplate += '"';

                            if (button.data) {
                                modalTemplate += " " + button.data;
                            }

                            modalTemplate += ">" + button.text + '</button>';
                        });
                    } else {
                        modalTemplate += '<button type="button" id="' + options.id + 'closeButton" class="btn btn-default" data-dismiss="modal">Close</button>';
                    }
                    modalTemplate += '</div>';
                }

                modalTemplate += '</div>' +
                              '</div>' +
                            '</div>';
            })();

            $("body").append(modalTemplate);

            $('#' + options.id).modal(options.bootstrapOptions && options.bootstrapOptions);

            if (options.ajaxContent !== null) {
                var hasDataToPass = (options.ajaxContent instanceof Array) ? true : false,
                    url = (hasDataToPass) ? options.ajaxContent[0] : options.ajaxContent;
                // TO DO: Display message in modal if ajax content does not load
                $('#' + options.id + ' ' + contentContainer).load(url, (hasDataToPass) ? options.ajaxContent[1] : null, function (response, status, xhr) {
                    $("#" + options.id + " .modal-content").removeClass("ab-modal-loading").removeClass("loading-with-footer").removeClass("loading-with-header");
                    if (options.ajaxCallBack !== null) {
                        (options.ajaxCallBack)(response, status, xhr);
                    }
                });
            }

            $('#' + options.id).on('hidden.bs.modal', function (e) {
                if (options.onClose) { options.onClose(); }
                $(this).remove();
            });
        }
    });

}(jQuery));
var RESPONSIVEHEIGHTMESSENGER = (function () {
    var startingHeight,
        bodySizePoller;

    $(document).ready(function () {
        // set height variable
        startingHeight = $("body").outerHeight();
        if (isSubmitPage()) {
            ir.messageParent(false, 0);
        } else {
            ir.messageParent(true);
        }
    });

    if (inIframe()) {
        bodySizePoller = setInterval(function () {
            checkHeightChange();
        }, 125);
    }

    function inIframe() {
        try {
            return window.self !== window.top;
        } catch (e) {
            return true;
        }
    }

    function checkHeightChange() {
        var currentHeight = $("body").outerHeight();
        if (currentHeight !== startingHeight) {
            startingHeight = currentHeight;
            ir.messageParent(false); // npr responive iframe syntax, tell parent height has change and scrollTop true/false
        }
    }

    function isSubmitPage() {
        if (window.location.href.toLowerCase().indexOf("uwaa/submit") >= 0) {
            return true;
        } else {
            return false;
        }
    }

    return {
        scrollToError: function (offSet) {
            ir.messageParent(false, offSet);
        }
    }
})();

/*!
 * jQuery Cookie Plugin v1.4.1
 * https://github.com/carhartl/jquery-cookie
 *
 * Copyright 2006, 2014 Klaus Hartl
 * Released under the MIT license
 */
(function (factory) {
	if (typeof define === 'function' && define.amd) {
		// AMD (Register as an anonymous module)
		define(['jquery'], factory);
	} else if (typeof exports === 'object') {
		// Node/CommonJS
		module.exports = factory(require('jquery'));
	} else {
		// Browser globals
		factory(jQuery);
	}
}(function ($) {

	var pluses = /\+/g;

	function encode(s) {
		return config.raw ? s : encodeURIComponent(s);
	}

	function decode(s) {
		return config.raw ? s : decodeURIComponent(s);
	}

	function stringifyCookieValue(value) {
		return encode(config.json ? JSON.stringify(value) : String(value));
	}

	function parseCookieValue(s) {
		if (s.indexOf('"') === 0) {
			// This is a quoted cookie as according to RFC2068, unescape...
			s = s.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
		}

		try {
			// Replace server-side written pluses with spaces.
			// If we can't decode the cookie, ignore it, it's unusable.
			// If we can't parse the cookie, ignore it, it's unusable.
			s = decodeURIComponent(s.replace(pluses, ' '));
			return config.json ? JSON.parse(s) : s;
		} catch(e) {}
	}

	function read(s, converter) {
		var value = config.raw ? s : parseCookieValue(s);
		return $.isFunction(converter) ? converter(value) : value;
	}

	var config = $.cookie = function (key, value, options) {

		// Write

		if (arguments.length > 1 && !$.isFunction(value)) {
			options = $.extend({}, config.defaults, options);

			if (typeof options.expires === 'number') {
				var days = options.expires, t = options.expires = new Date();
				t.setMilliseconds(t.getMilliseconds() + days * 864e+5);
			}

			return (document.cookie = [
				encode(key), '=', stringifyCookieValue(value),
				options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
				options.path    ? '; path=' + options.path : '',
				options.domain  ? '; domain=' + options.domain : '',
				options.secure  ? '; secure' : ''
			].join(''));
		}

		// Read

		var result = key ? undefined : {},
			// To prevent the for loop in the first place assign an empty array
			// in case there are no cookies at all. Also prevents odd result when
			// calling $.cookie().
			cookies = document.cookie ? document.cookie.split('; ') : [],
			i = 0,
			l = cookies.length;

		for (; i < l; i++) {
			var parts = cookies[i].split('='),
				name = decode(parts.shift()),
				cookie = parts.join('=');

			if (key === name) {
				// If second argument (value) is a function it's a converter...
				result = read(cookie, value);
				break;
			}

			// Prevent storing a cookie that we couldn't decode.
			if (!key && (cookie = read(cookie)) !== undefined) {
				result[name] = cookie;
			}
		}

		return result;
	};

	config.defaults = {};

	$.removeCookie = function (key, options) {
		// Must not alter options, thus extending a fresh object...
		$.cookie(key, '', $.extend({}, options, { expires: -1 }));
		return !$.cookie(key);
	};

}));

/* globals grecaptcha, recaptchaSiteV3Key, recaptchaSiteV2Key */
/* exported RECAPTCHAHELPER */

/* Notes: 
 * On submit, recpatcha v3 will be tested by calling our server, if it fails, payment submission is halted and the v2 checkbox will be shown. 
 * We store the v3 response in the server session so that when payment gets submitted, we know that we need to check the validity of the v2 response in order to proceed if v3 response had failed. 
 * v2 value is passed to submit action on post if v2 checkbox was presented to the user.
 * If a saved nonce was used, then user will not have to resubmit a captcha response.
 * If card was declined (so not using saved nonce), captcha process will start over with the v3 test and subsequently the v2 if necessary.
 */

/* version 1.1 */

var RECAPTCHAHELPER = (function () {
    var service = {
        init: init,
        execute: execute,
        loadCaptchaV2: loadCaptchaV2,
        setPassed: setPassed,
        hasRecaptchaPassed: hasRecaptchaPassed,
        isV2ShownButNotVerified: isV2ShownButNotVerified
    };

    var v2VerifyCallback,
        v2ExpiredCallback;

    var TEST_PATH;

    var hasPassed = false,
        v2ShownButNotVerified = false;

    return service;

    ///////////////

    function init(verifyCallback, expiredCallback, testPath) {
        v2VerifyCallback = verifyCallback;
        v2ExpiredCallback = expiredCallback;
        TEST_PATH = testPath;
    }

    function setPassed(didItPass) {
        hasPassed = didItPass;
    }

    function hasRecaptchaPassed() {
        return hasPassed;
    }

    function isV2ShownButNotVerified() {
        return v2ShownButNotVerified;
    }

    function execute(action) {
        var deferred = $.Deferred();

        grecaptcha.ready(function () {
            grecaptcha.execute(recaptchaSiteV3Key, { action: action })
                .then(function (token) {
                    $.ajax({
                        url: TEST_PATH,
                        type: "post",
                        data: { token: token },
                        success: function (response) {
                            deferred.resolve({ message: "pass", error: null });
                        },
                        error: function (xhr, status, error) {
                            deferred.resolve({ message: "fail", error: error });
                        }
                    });
                });
        });

        return deferred.promise();
    }

    function loadCaptchaV2(locationSelector) {
        var $elem = $(locationSelector);

        $elem.before('<div id="grecap2"></div>');

        grecaptcha.ready(function () {
            grecaptcha.render('grecap2', {
                'sitekey': recaptchaSiteV2Key,
                'callback': _verifyCallback,
                'expired-callback': _onRecaptchaExpired
            });

            v2ShownButNotVerified = true;
        });
    }

    /////////

    function _verifyCallback(response) {
        v2VerifyCallback(response);
        v2ShownButNotVerified = false;
    }

    function _onRecaptchaExpired() {
        v2ExpiredCallback();
        v2ShownButNotVerified = true;
    }
})();
/* global UTILITIES, CHECKOUT, UA_PayPal, ccHostedFieldsEndpoint */
/* exported PAYMENT */

/* Payment.js Version 4.2.1
 * Requires Checkout.js version 4.0 or higher 
 * Requires UA_PayPal.js if using PayPal
 * 
 * Version notes:
 * 4.0: First run of CardConnect
 * 4.1: Re-adding PayPal
 * 4.1.7: When updating to this version change cConnectBlock div style to opacity:0; instead of display:none;
 * 4.1.8: Wait to show cc error until cc fields have been interacted with
 */

var PAYMENT = (function () {
    var SUBMIT_BTN_ID,
        CUSTOM_CC_CSS,
        BASE_URL,
        SHOWING_PAYMENT_TYPES,
        USE_MOBILE_LAYOUT,
        USE_PAYMENT_LOCKER,
        USE_PAYPAL;

    var iframeLoaded = false,
        altPaymentMethodsInUse = false,
        paymentMethodInitializerRun = false,
        paymentFormModified = false,
        paymentResetting = false;

    var cardConnectConfig = {
        sendcssloadedevent: true,
        cardlabel: 'Card Number',
        cardnumbernumericonly: true,
        cardinputmaxlength: 19,
        formatinput: true,
        useexpiry: true,
        usecvv: true,
        useexpiryfield: true,
        expirylabel: 'Expiration MM YYYY',
        placeholdermonth: 'MM',
        placeholderyear: 'YYYY',
        placeholdercvv: 'CVV',
        cvvlabel: 'CVV',
        invalidcreditcardevent: true,
        invalidcvvevent: true,
        invalidexpiryevent: true,
        sendcardtypingevent: true,
        enhancedresponse: true,
        tokenpropname: 'cconnecttoken',
        tokenizewheninactive: true,
        inactivityto: 1000,
        orientation: "default"
        //unique:false // false by default, if true, CardSecure generates a unique token for each tokenization of a given card number.
        //css: // initialized later
    };

    var cardConnectStarted = false,
        validationMessages = [],
        usingSavedNonce;

    var _paymentType;

    // Required Universal elements 
    var form = document.getElementById('cardconnect-payment-form'),
        cConnectBlock = document.getElementById('cConnectBlock'),
        ccValidationError = document.getElementById('ccValidation'),
        expField = document.querySelector('input[name="exp"]'),
        nonceField = document.querySelector('input[name="payment_method_nonce"]'),
        totalCharge = document.getElementById('TotalChargedToday'),
        submitBtn;

    // Alt Payment associated elements
    var $ccPartial,
        $inputPaymentSelection,
        $inputPaymentType,
        oneTime,
        $paymentMethodBoxes,
        $paymentMethodBoxCC,
        $paymentMethodBoxPP,
        $sameAddressText;

    var service = {
        init: init,
        paymentUpdate: paymentUpdate,
        getTotalCharge: getTotalCharge
    };

    return service;

    ////////////////

    function init(submitBtnId, usePaymentLocker, usePaypal, payPalButtonContainerID, customCardConnectStyles, showPaymentTypes, cardConnectOrientation) {
        SUBMIT_BTN_ID = submitBtnId;
        CUSTOM_CC_CSS = (customCardConnectStyles !== null) ? customCardConnectStyles : null;
        cardConnectConfig.orientation = (cardConnectOrientation !== null && typeof cardConnectOrientation !== 'undefined') ? cardConnectOrientation : null;
        SHOWING_PAYMENT_TYPES = showPaymentTypes;
        USE_PAYMENT_LOCKER = usePaymentLocker;
        USE_PAYPAL = usePaypal;
        submitBtn = document.getElementById(SUBMIT_BTN_ID);
        altPaymentMethodsInUse = USE_PAYPAL;

        BASE_URL = ccHostedFieldsEndpoint;

        usingSavedNonce = (nonceField.value !== "" && USE_PAYMENT_LOCKER) ? true : false;

        if (!altPaymentMethodsInUse && USE_PAYMENT_LOCKER) {
            $(document).ready(function () {
                $paymentMethodBoxes = $(".payment-method-box");
                $paymentMethodBoxCC = $(".payment-method-box[data-type='CreditCard']");
                $ccPartial = $(".credit-card-partial");

                if (!paymentMethodInitializerRun) {
                    _setupPaymentMethodsListener();
                }

                if (usingSavedNonce) {
                    _paymentLocker(true);
                } else {
                    _paymentLocker(false);
                }
            });
        }

        if (USE_PAYPAL) {
            $(document).ready(function () {
                _initializeAltPaymentAssociatedElements();

                UA_PayPal.init(payPalButtonContainerID, oneTime.value);
                UA_PayPal.initializePaypalElements();

                if (!paymentMethodInitializerRun) {
                    _setupPaymentMethodsListener();
                }

                UA_PayPal.setupPayPal();
            });
        }

        if (!usingSavedNonce && !USE_PAYMENT_LOCKER) {
            $(document).ready(function () {
                _startCardConnect();
            });
        }

        if (usingSavedNonce) {
            $(document).ready(function () {
                submitBtn.addEventListener('click', _submitNonCConnect);
            });
        }

        $("#" + SUBMIT_BTN_ID).attr("style", "pointer-events:all");
    }

    function getTotalCharge() {
        return totalCharge ? parseInt(totalCharge.value.replace('$', ''), 10) : null;
    }

    function paymentUpdate(paymentType) {
        var $btn;
        var cachedPaymentType = _paymentType;

        if (paymentType === _paymentType) {
            return;
        }

        _paymentType = (paymentType && paymentType !== "") ? paymentType : "CreditCard";

        $btn = (_paymentType === "PayPal") ? $paymentMethodBoxPP : $paymentMethodBoxCC;

        $paymentMethodBoxes.removeClass("selected");
        $btn.addClass("selected");

        if ($sameAddressText) {
            $sameAddressText.html((paymentType === 'PayPal') ? $sameAddressText.attr("data-paypal") : $sameAddressText.attr("data-cc"));
        }

        $ccPartial.hide();

        if (USE_PAYPAL === true) {
            UA_PayPal.hidePayPalButton();
        }

        $("#" + SUBMIT_BTN_ID).hide();

        if (_paymentType === "PayPal" && !usingSavedNonce) {
            UA_PayPal.showPayPalButton();
        } else {
            $ccPartial.show();
            $("#" + SUBMIT_BTN_ID).show();
        }

        $inputPaymentType.val(_paymentType);

        CHECKOUT.hideValidationError(cachedPaymentType);
        CHECKOUT.showPreviousValidationError(_paymentType);

        if (usingSavedNonce) {
            _paymentLocker(true);
        }
    }

    ////////////////

    function _cardConnectValidityChange(valid) {
        if (valid) {
            $(submitBtn).attr("data-cconnect-valid", true);
            CHECKOUT.enableSubmitButton();
        } else {
            $(submitBtn).attr("data-cconnect-valid", false);
            CHECKOUT.disableSubmitButton();
        }
    }

    function _errorNotAlreadyInThere(code) {
        var nomatch = true;

        for (var i = 0; i < validationMessages.length; i++) {
            if (validationMessages[i].errorCode === code) {
                nomatch = false;
                break;
            }
        }

        return nomatch;
    }

    function _finishPaymentInitialization() {
        CHECKOUT.finishPaymentInitialization();

        submitBtn.removeEventListener('click', _submitNonCConnect);
        submitBtn.addEventListener('click', _submitCConnect);
        submitBtn.addEventListener('mouseover', _submitBtnHover);

        if (!UTILITIES.elementsArePresent([
            form,
            nonceField,
            submitBtn,
            expField,
            ccValidationError
        ])) {
            console.error("CardConnect elements missing");
        }

        if (USE_PAYMENT_LOCKER && !altPaymentMethodsInUse) {
            if (!UTILITIES.elementsArePresent([
                $paymentMethodBoxes,
                $paymentMethodBoxCC,
                $(".payment-locker"),
                $ccPartial
            ])) {
                console.error("Payment locker elements missing");
            }
        }
    }

    function _getCSS() {
        var cssString = "";

        if (CUSTOM_CC_CSS !== null) {
            return CUSTOM_CC_CSS.cssString;
        } else {
            cssString += 'input' + '{width:100%;max-width:365px;border:1px solid #ccc;padding:.2em;height:30px;transition: all .2s ease-in-out;font-size: 14px;line-height: 1.428571429;color: #555555;vertical-align: middle;background-color: #ffffff;border-radius: 4px;box-shadow: inset 0 1px 1px rgb(0 0 0 / 8%);box-sizing: border-box;}';

            cssString += 'input:focus,select:focus' + '{border: 1px solid #5d4a82;outline: 0;box-shadow: inset 0 1px 1px rgb(0 0 0 / 8%), 0 0 8px rgb(93 74 130 / 60%);}';

            cssString += 'label+br' + '{display:none}';

            //cssString += 'label+label' + '{margin-top:20px;}';

            if (!USE_MOBILE_LAYOUT) {
                cssString += 'label' + '{display:inline-block;width:27%;text-align:right;}';
            } else {
                cssString += 'label' + '{display:block;width:100%;text-align:left;}';
                cssString += 'label[for="ccexpiryfieldyear"]' + '{display:inline;}';
            }

            cssString += 'label' + '{margin-right:10px;font-family:"Open Sans", sans-serif;font-size:11px;color:#3D3D3D;margin-top:20px;}';

            cssString += 'select' + '{padding: 6px 12px;font-size: 14px;line-height: 1.428571429;color: #555555;vertical-align: middle;background-color: #ffffff;border: 1px solid #cccccc;border-radius: 4px;box-shadow: inset 0 1px 1px rgb(0 0 0 / 8%);}';

            if (!USE_MOBILE_LAYOUT) {
                cssString += '#ccexpiryfieldmonth,#ccexpiryfieldyear' + '{width:10%;}';

            } else {
                cssString += '#ccexpiryfieldmonth,#ccexpiryfieldyear' + '{width:25%;}';
            }

            cssString += '#ccexpiryfieldmonth + label' + '{width:0px;}';

            cssString += '::placeholder' + '{color:#999999;}';

            //cssString += '.error' + '{border-color:#df1111}'; // seems to apply this bordering oddly, i.e., doesn't clear when it seems like it should

            return cssString;
        }
    }

    //function _getErrorsForDisplay() {
    //    var errorString = "";

    //    for (var i = 0; i < validationMessages.length; i++) {
    //        if (i > 0) {
    //            errorString += " ";
    //        }
    //        errorString += validationMessages[i].validationError + ".";
    //    }

    //    return errorString;
    //}

    function _initializeAltPaymentAssociatedElements() {
        $paymentMethodBoxes = $(".payment-method-box");
        $inputPaymentType = $("input#PaymentType");
        $inputPaymentSelection = $("input[name='PaymentTypeSelection']");
        $paymentMethodBoxCC = $(".payment-method-box[data-type='CreditCard']");
        $ccPartial = $(".credit-card-partial");
        oneTime = document.getElementById('IsOneTimeOnly'),
            $paymentMethodBoxPP = $(".payment-method-box[data-type='PayPal']"),
            $sameAddressText = $("#sameAddressText").length > 0 ? $("#sameAddressText") : null; // optional

        if (!UTILITIES.elementsArePresent([$paymentMethodBoxes, $paymentMethodBoxPP, $inputPaymentType, $inputPaymentSelection, $paymentMethodBoxCC, $ccPartial, oneTime, totalCharge])) {
            console.error("Alt Payment elements missing");
        }
    }

    function _lastMessageInValidationListIsOlderThan(ageInMS, newMessageTimeStamp) {
        var lastMessage = validationMessages[validationMessages.length - 1];

        if (newMessageTimeStamp - lastMessage.timeStamp > ageInMS) {
            return true;
        }

        return false;
    }

    function _paymentLocker(lock) {
        var $selectedPaymentBox;

        if (altPaymentMethodsInUse || USE_PAYMENT_LOCKER) {
            $selectedPaymentBox = _getSelectedPaymentBox();

            if (lock) {
                $('input[type="radio"]', $paymentMethodBoxes).attr('disabled', true);
                $paymentMethodBoxes.addClass("disabled");
                $(".payment-locker", $selectedPaymentBox).show();
                $ccPartial.hide();

                if (!SHOWING_PAYMENT_TYPES) {
                    $selectedPaymentBox.parent().show();
                }

                _cardConnectValidityChange(true);
            } else {
                $('input[type="radio"]', $paymentMethodBoxes).attr('disabled', false);
                $paymentMethodBoxes.removeClass("disabled");
                $(".payment-locker").hide();
                $ccPartial.show();

                if (!SHOWING_PAYMENT_TYPES) {
                    $selectedPaymentBox.parent().hide();
                }

                _startCardConnect();
            }
        }

        ////////

        function _getSelectedPaymentBox() {
            var returnObject;

            if (!altPaymentMethodsInUse) {
                return $paymentMethodBoxCC;
            }

            for (var i = 0; i < $paymentMethodBoxes.length; i++) {
                if ($($paymentMethodBoxes[i]).hasClass("selected")) {
                    returnObject = $($paymentMethodBoxes[i]);
                    break;
                }
            }

            return returnObject;
        }
    }

    function _setupPaymentMethodsListener() {
        paymentMethodInitializerRun = true;

        $(document).ready(function () {
            if (altPaymentMethodsInUse) {
                PAYMENT.paymentUpdate($inputPaymentType.val());

                $inputPaymentSelection.on("click", function (e) {
                    var $el, paymentType;

                    if (!paymentResetting) {
                        $el = $(this);
                        paymentType = $el.val();

                        PAYMENT.paymentUpdate(paymentType);
                    } else {
                        _reCheckPaymentRadio();
                        paymentResetting = false;
                        return false;
                    }
                });
            }

            $paymentMethodBoxes.on("click", function (e) {
                if ($(e.target).hasClass("remove-payment")) {
                    paymentResetting = true;
                    usingSavedNonce = false;
                    if (altPaymentMethodsInUse) {
                        PAYMENT.paymentUpdate("CreditCard");
                    }
                    nonceField.value = "";
                    _paymentLocker(false);
                }
            });
        });

        /////////////

        function _reCheckPaymentRadio() {
            for (var i = 0; i < $inputPaymentSelection.length; i++) {
                if ($($inputPaymentSelection[i]).val() === $inputPaymentType.val()) {
                    $($inputPaymentSelection[i]).attr('checked', true);
                    break;
                }
            }
        }
    }

    function _scrollToElement($element, offsetPadding) {
        var scrollTop = 0;

        if ($element.attr('type') === 'hidden') {
            scrollTop = $($element.prevAll(":visible")[0]).offset().top;
        } else {
            scrollTop = $element.offset().top;
        }

        $('html, body').animate({
            scrollTop: scrollTop + (offsetPadding ? offsetPadding : 0)
        }, 2000);
    }

    function _showCCForm() {
        $(cConnectBlock).css('opacity', '1');
    }

    function _startCardConnect() {
        var iframeHeight = "250",
            mobileLayoutTrigger = CUSTOM_CC_CSS.mobileTrigger ? parseInt(CUSTOM_CC_CSS.mobileTrigger, 10) : 768;

        if (!cardConnectStarted) {
            cardConnectStarted = true;

            _cardConnectValidityChange(false);

            USE_MOBILE_LAYOUT = ((window.innerWidth > 0) ? window.innerWidth : screen.width) < mobileLayoutTrigger ? true : false;

            if (USE_MOBILE_LAYOUT) {
                if (CUSTOM_CC_CSS !== null && typeof CUSTOM_CC_CSS.mobileIframeHeight !== 'undefined') {
                    iframeHeight = CUSTOM_CC_CSS.mobileIframeHeight;
                } else {
                    if (cardConnectConfig.orientation === 'default') {
                        iframeHeight = "250";
                    } else {
                        iframeHeight = "200";
                    }
                }
            } else {
                if (CUSTOM_CC_CSS !== null && typeof CUSTOM_CC_CSS.iframeHeight !== 'undefined') {
                    iframeHeight = CUSTOM_CC_CSS.iframeHeight;
                } else {
                    if (cardConnectConfig.orientation === 'default') {
                        iframeHeight = "250";
                    } else {
                        iframeHeight = "200";
                    }
                }
            }

            document.getElementById("tokenframe").height = iframeHeight;

            cardConnectConfig.css = _getCSS();

            document.getElementById("tokenframe").src = BASE_URL + "?" + UTILITIES.serializeObjectAsQueryString(cardConnectConfig);

            _startIframeLoadDetection();

            window.addEventListener('message', function (event) {
                // this will receive multiple messages, just not necessarily when a breakpoint is set for some reason
                var parsed = null;

                if (event.origin !== 'https://fts-uat.cardconnect.com' && event.origin !== 'https://fts.cardconnect.com') {
                    return false;
                }

                try {
                    parsed = JSON.parse(event.data);
                    //console.log(event);
                } catch (err) {
                    parsed = null;
                }

                if (typeof parsed !== 'object') {
                    parsed = {};
                }

                if (parsed && parsed["cssLoaded"]) {
                    // cssLoaded Event
                    iframeLoaded = true;
                    _showCCForm();
                } else if (parsed && typeof parsed.cconnecttoken !== 'undefined') {
                    // add the extra check above because we are receiving post messages for iframe resizing also
                    expField.value = parsed.expiry;
                    nonceField.value = parsed.cconnecttoken;
                    ccValidationError.innerHTML = "";
                    $(ccValidationError).hide();
                    paymentFormModified = true;

                    if (parsed.validationError && parsed.validationError !== "") {
                        // this doesn't work because multiple messages will come after onBlur on any field.
                        // the problem is I don't know when to clear a validation message, since I only receive messages when something is invalid, not when it is valid
                        // it is currently set up to look at the age of the message and discard when a new batch of messages come in that are newer than the old ones by 1 second.
                        // another problem is that it does not come back with validation errors when the expiration date is only partially filled out or invalid, only when it is empty.

                        //ccValidationError.innerHTML = parsed.validationError;
                        //console.log(parsed.validationError);
                        if (validationMessages.length > 0 && _lastMessageInValidationListIsOlderThan(1000, event.timeStamp)) {
                            validationMessages = [];
                        }

                        if (_errorNotAlreadyInThere(parsed.errorCode)) {
                            validationMessages.push({ validationError: parsed.validationError, errorCode: parsed.errorCode, timeStamp: event.timeStamp });
                        }

                        //console.log(validationMessages);
                    } else if (parsed && parsed["cardTyping"]) {
                        paymentFormModified = true;
                    }

                    if (parsed.cconnecttoken && parsed.cconnecttoken !== "") {
                        validationMessages = [];
                        _cardConnectValidityChange(true);
                    } else {
                        _cardConnectValidityChange(false);
                    }
                }
            }, false);

            _finishPaymentInitialization();
        }
    }

    function _startIframeLoadDetection() {
        setTimeout(function () {
            if (!iframeLoaded) {
                CHECKOUT.paymentError("card connect iframe failed to load after 15 seconds", "Payment.js", "_startIframeLoadDetection");
            }
        }, 15000);
    }

    function _showCardConnectError() {
        // disable showing the actual card connect validation messages for now, since they are not useful
        //if (validationMessages.length > 0) {
        //    ccValidationError.innerHTML = _getErrorsForDisplay();
        //    $(ccValidationError).show();
        //    $(ccValidationError).removeClass("hide");
        //}

        ccValidationError.innerHTML = "Please correct any issues with an invalid card number, exp or cvv below.";
        $(ccValidationError).show();
        $(ccValidationError).removeClass("hide");

        _scrollToElement($(ccValidationError));
    }

    function _submitBtnHover() {
        if (_submitButtonIsDisabled() && ccValidationError.innerText.trim() === '' && paymentFormModified) {
            setTimeout(function () {
                if ($(nonceField).val() === "") {
                    _showCardConnectError();
                }
            }, 1000);
        }
    }

    function _submitCConnect(event) {
        event.preventDefault();

        if (_submitButtonIsDisabled()) {
            _showCardConnectError();

            return false;
        }

        if (typeof _paymentType === 'undefined' || _paymentType === "" || _paymentType === "CreditCard") {
            CHECKOUT.swapButtons("startloading");

            CHECKOUT.testRecaptcha()
                .then(function (response) {
                    // message could come back as 'dontProceed' which means the v2 captcha was shown and the payment should not yet be submitted
                    if (response.message === 'proceed') {
                        _submitPayment();
                    }
                })
                .fail(function (err) {
                    _submitPayment();
                });
        }

        ////////////

        function _submitPayment() {
            form.submit();
        }
    }

    function _submitButtonIsDisabled() {
        return $("#" + SUBMIT_BTN_ID).hasClass("disabled");
    }

    function _submitNonCConnect() {
        event.preventDefault();

        if (_submitButtonIsDisabled()) {
            return false;
        } else {
            CHECKOUT.swapButtons("startloading");
            form.submit();
        }
    }
})();

/* global PAYMENT, UTILITIES */
/* Checkout.js Version 4.0.6
/* 4.0: Switch over to CardConnect, remove PayPal

/* compatible with Payment.js 4.1 and greater */

//@ CHECKOUT.init({
//@    logErrorFN: yourFunction, // optional
//@    logErrorFnHandlesErrorDisplay: true|false, // false by default
//@    errorPagePath: "/yourErrorPage": required
//@    submitBtnID: "yourButtonID", // required
//@    formIsValid: yourFunction, // optional
//@    cardConnectStyles: {cssString: "yourCSSString", mobileIframeHeight: "200", mobileTrigger: "768" } // optional
//@    cardConnectOrientation: "horizontal", // defaults to "default" if not passed
//@    loadingButtonClass: "yourLoadingButtonClass", // required
//@    errorContainerClass: "yourErrorContainerClass", // required
//@    showPaymentInfoMessageFN: yourFunction, // required if using paypal (shows message if paypal is down)
//@    showPaymentOptions: true|false;  // set to false if you only offer cc and don't want to show the cc box
//@    enableButtonOnPaymentInitialize: true|false, // defaults to true
//@    recaptchaHelper: RECAPTCHAHELPER || null,
//@    recaptchaHelperTestPath: "pathToRecpatchTestMethodOnServer",
//@    initPayment: true||false // defaults to true
//@});

var CHECKOUT = (function () {
    var validationErrorCache = {
        paymentType: null,
        message: null
    };

    // elements
    var submitBtn,
        $nextButton,
        $loadingButton,
        $errorContainer;

    var RECAPTCHA_HELPER;

    return {
        init: init,
        disableSubmitButton: disableSubmitButton,
        enableSubmitButton: enableSubmitButton,
        finishPaymentInitialization: finishPaymentInitialization,
        hideValidationError: hideValidationError,
        logError: logError,
        paymentError: paymentError,
        paymentInitialized: paymentInitialized,
        showPreviousValidationError: showPreviousValidationError,
        showValidationError: showValidationError,
        swapButtons: swapButtons,
        testRecaptcha: testRecaptcha,
        validationError: validationError
    };

    /////////////

    function init(checkoutOptions) {
        this.checkoutOptions = checkoutOptions;
        this.logErrors = (typeof this.checkoutOptions.logErrorFN !== 'undefined') ? true : false;

        if (typeof this.checkoutOptions.logErrorFnHandlesErrorDisplay === 'undefined') {
            this.checkoutOptions.logErrorFnHandlesErrorDisplay = false;
        }

        if (typeof this.checkoutOptions.initPayment === 'undefined') {
            this.checkoutOptions.initPayment = true;
        }

        if (typeof this.checkoutOptions.cardConnectStyles === 'undefined') {
            this.checkoutOptions.cardConnectStyles = null;
        }

        _initializeElements();

        RECAPTCHA_HELPER = this.checkoutOptions.recaptchaHelper || null;

        if (this.checkoutOptions.initPayment) {
            try {
                PAYMENT.init(CHECKOUT.checkoutOptions.submitBtnID, CHECKOUT.checkoutOptions.usePaymentLocker, CHECKOUT.checkoutOptions.usePayPal, CHECKOUT.checkoutOptions.payPalButtonContainerID, CHECKOUT.checkoutOptions.cardConnectStyles, CHECKOUT.checkoutOptions.showPaymentOptions, CHECKOUT.checkoutOptions.cardConnectOrientation);
            } catch (error) {
                CHECKOUT.paymentError(error, "Checkout.js", "init");
            }
        }

        if (RECAPTCHA_HELPER) {
            RECAPTCHA_HELPER.init(_v2VerifyCallback, _v2ExpiredCallback, CHECKOUT.checkoutOptions.recaptchaHelperTestPath);
        }

        CHECKOUT.paymentInitialized();
    }

    /////////////

    function disableSubmitButton() {
        //submitBtn.attr("disabled", true);
        submitBtn.addClass("disabled");
    }

    function enableSubmitButton() {
        var hasFormIsValidMethod = (typeof CHECKOUT.checkoutOptions.formIsValid !== 'undefined') ? true : false;

        if ((hasFormIsValidMethod && CHECKOUT.checkoutOptions.formIsValid()) || !hasFormIsValidMethod) {
            submitBtn.attr("disabled", false);
            submitBtn.removeClass("disabled");
        }
    }

    function finishPaymentInitialization() {
        if (!RECAPTCHA_HELPER) {
            CHECKOUT.paymentInitialized();
        }
    }

    function hideValidationError(cachedPaymentType) {
        var errorText = $errorContainer.text(),
            messageActive = ($errorContainer.hasClass("hide")) ? false : true;

        if (errorText && messageActive && cachedPaymentType) {
            validationErrorCache.paymentType = cachedPaymentType;
            validationErrorCache.message = errorText;

            $errorContainer.addClass("hide");
        }
    }

    function logError(errorType, subErrorType, errorMessage, errorSource) {
        var errorObj;

        if (CHECKOUT.logErrors) {
            errorObj = {
                ErrorType: errorType,
                SubErrorType: subErrorType,
                ErrorMessage: errorMessage,
                ErrorSource: errorSource
            };

            CHECKOUT.checkoutOptions.logErrorFN(errorObj);
        }
    }

    function paymentError(error, file, fnName) {
        var parsedError,
            errorObj = {
                ErrorType: "CardConnect payment error",
                SubErrorType: null,
                ErrorMessage: null,
                ErrorSource: file + " / " + fnName
            };

        try {
            if (typeof error !== 'undefined' && error !== null) {
                errorObj.SubErrorType = (typeof error.code !== 'undefined') ? error.code + " / " + error.type : null;
            }

            parsedError = _parseError(error);

            errorObj.ErrorMessage = parsedError + " / " + file + " / " + fnName;

            CHECKOUT.swapButtons("doneloading");

            if (CHECKOUT.logErrors) {
                CHECKOUT.checkoutOptions.logErrorFN(errorObj);
            }

            if (CHECKOUT.checkoutOptions.logErrorFnHandlesErrorDisplay === false) {
                // take user to error page
                window.location.replace(CHECKOUT.checkoutOptions.errorPagePath);
            }
        } catch (e) {
            console.error(error);

            if (CHECKOUT.logErrors) {
                CHECKOUT.checkoutOptions.logErrorFN(errorObj);
            }
            if (CHECKOUT.checkoutOptions.logErrorFnHandlesErrorDisplay === false) {
                // take user to error page
                window.location.replace(CHECKOUT.checkoutOptions.errorPagePath);
            }
        }
    }

    function paymentInitialized() {
        // some forms will set this to false because they have their own validation methods that control submit button as well, form validity is determined by disabled class on submit button
        var enableButtonOnPaymentInitialize = this.checkoutOptions.enableButtonOnPaymentInitialize === false ? false : true;

        if (enableButtonOnPaymentInitialize) {
            submitBtn.removeAttr("disabled");
            submitBtn.removeClass("disabled");
        }
    }

    function showPreviousValidationError(paymentType) {
        if (validationErrorCache.paymentType === paymentType) {
            CHECKOUT.showValidationError(validationErrorCache.message);
        }
    }

    function showValidationError(errorString) {
        if ($errorContainer.hasClass("alert-danger")) {
            $errorContainer.html("<span class='icon-remove'></span>" + errorString);
        } else {
            $errorContainer.html(errorString);
        }
        $errorContainer.removeClass("hide");

        $.event.trigger({
            type: "validationErrorShown",
            message: "test message",
            time: new Date()
        });
    }

    function swapButtons(type) {
        if (type === "startloading") {
            $.event.trigger({
                type: "swapButtonsFnStarted"
            });
            $nextButton.hide();
            $loadingButton.show();
        } else {
            $nextButton.show();
            $loadingButton.hide();
        }
    }

    function testRecaptcha() {
        var deferred = $.Deferred();

        if (RECAPTCHA_HELPER && !RECAPTCHA_HELPER.hasRecaptchaPassed()) {
            RECAPTCHA_HELPER.execute('submitButton')
                .then(function (response) {
                    try {
                        if (response.message === "fail") {
                            v3Failed();
                        } else {
                            RECAPTCHA_HELPER.setPassed(true);
                            deferred.resolve({ message: "proceed", error: null });
                        }
                    } catch (error) {
                        v3Failed();
                        // log unknown captcha error
                        CHECKOUT.logError("reCaptchaUnknownError", null, JSON.stringify(err), "RECAPTCHA_HELPER.execute > catch");
                    }

                })
                .fail(function (err) {
                    v3Failed();
                    // log unknown captcha error
                    CHECKOUT.logError("reCaptchaUnknownError", null, JSON.stringify(err), "RECAPTCHA_HELPER.execute > fail");
                });
        } else {
            deferred.resolve({ message: "proceed", error: null });
        }

        return deferred.promise();

        /////////

        function v3Failed() {
            RECAPTCHA_HELPER.loadCaptchaV2("#" + CHECKOUT.checkoutOptions.submitBtnID);
            CHECKOUT.swapButtons("doneloading");
            CHECKOUT.disableSubmitButton();
            deferred.resolve({ message: "dontProceed", error: null });
        }
    }

    function validationError(error) {
        //@ error = { message: "error message" }; // optional
        var errorString = "",
            genericError = "Sorry, we are unable to complete your transaction at this time. Please try again, or contact <a href='mailto:advsti@uw.edu'>advsti@uw.edu</a> if the problem persists.";

        if (typeof error === 'undefined') {
            errorString = genericError;
        } else {
            try {
                errorString = (typeof error.message !== 'undefined') ? error.message : "";

                // if error string still empty, check to see if one was explicitly passed
                if (errorString === "") {
                    if (typeof error === "string") {
                        errorString = error;
                    } else {
                        errorString = genericError;
                    }
                }
            } catch (e) {
                errorString = genericError;
            }
        }

        CHECKOUT.showValidationError(errorString);

        CHECKOUT.swapButtons("doneloading");
    }

    /////////////

    function _initializeElements() {
        submitBtn = $("#" + CHECKOUT.checkoutOptions.submitBtnID);
        $nextButton = $("#" + CHECKOUT.checkoutOptions.submitBtnID);
        $loadingButton = $("." + CHECKOUT.checkoutOptions.loadingButtonClass);
        $errorContainer = $("." + CHECKOUT.checkoutOptions.errorContainerClass);

        if (!UTILITIES.elementsArePresent([submitBtn, $nextButton, $loadingButton, $errorContainer])) {
            console.error("Checkout elements are missing");
        }
    }

    function _parseError(error) {
        var stringifiedError;
        // could be string, could be error object, could be javascript exception object

        if (typeof error !== 'undefined') {
            stringifiedError = JSON.stringify(error);

            if (typeof error === 'string') {
                return error;
            }

            if (stringifiedError === "{}") {
                if (typeof error.message !== 'undefined' && error.message.length > 0) {
                    return error.message;
                } else {
                    return "";
                }
            } else {
                return stringifiedError;
            }
        } else {
            return "no error param passed";
        }
    }

    function _v2VerifyCallback(response) {
        // google recaptcha callback
        CHECKOUT.enableSubmitButton();
        //CHECKOUT.paymentInitialized();
        RECAPTCHA_HELPER.setPassed(true);
    }

    function _v2ExpiredCallback(response) {
        // google recaptcha callback
        CHECKOUT.disableSubmitButton();
    }
})();
/**
 * @license AngularJS v1.4.0
 * (c) 2010-2015 Google, Inc. http://angularjs.org
 * License: MIT
 */
(function(window, angular, undefined) {'use strict';

/**
 * @ngdoc module
 * @name ngCookies
 * @description
 *
 * # ngCookies
 *
 * The `ngCookies` module provides a convenient wrapper for reading and writing browser cookies.
 *
 *
 * <div doc-module-components="ngCookies"></div>
 *
 * See {@link ngCookies.$cookies `$cookies`} and
 * {@link ngCookies.$cookieStore `$cookieStore`} for usage.
 */


angular.module('ngCookies', ['ng']).
  /**
   * @ngdoc provider
   * @name $cookiesProvider
   * @description
   * Use `$cookiesProvider` to change the default behavior of the {@link ngCookies.$cookies $cookies} service.
   * */
   provider('$cookies', [function $CookiesProvider() {
    /**
     * @ngdoc property
     * @name $cookiesProvider#defaults
     * @description
     *
     * Object containing default options to pass when setting cookies.
     *
     * The object may have following properties:
     *
     * - **path** - `{string}` - The cookie will be available only for this path and its
     *   sub-paths. By default, this would be the URL that appears in your base tag.
     * - **domain** - `{string}` - The cookie will be available only for this domain and
     *   its sub-domains. For obvious security reasons the user agent will not accept the
     *   cookie if the current domain is not a sub domain or equals to the requested domain.
     * - **expires** - `{string|Date}` - String of the form "Wdy, DD Mon YYYY HH:MM:SS GMT"
     *   or a Date object indicating the exact date/time this cookie will expire.
     * - **secure** - `{boolean}` - The cookie will be available only in secured connection.
     *
     * Note: by default the address that appears in your <base> tag will be used as path.
     * This is import so that cookies will be visible for all routes in case html5mode is enabled
     *
     **/
    var defaults = this.defaults = {};

    function calcOptions(options) {
      return options ? angular.extend({}, defaults, options) : defaults;
    }

    /**
     * @ngdoc service
     * @name $cookies
     *
     * @description
     * Provides read/write access to browser's cookies.
     *
     * BREAKING CHANGE: `$cookies` no longer exposes properties that represent the
     * current browser cookie values. Now you must use the get/put/remove/etc. methods
     * as described below.
     *
     * Requires the {@link ngCookies `ngCookies`} module to be installed.
     *
     * @example
     *
     * ```js
     * angular.module('cookiesExample', ['ngCookies'])
     *   .controller('ExampleController', ['$cookies', function($cookies) {
     *     // Retrieving a cookie
     *     var favoriteCookie = $cookies.get('myFavorite');
     *     // Setting a cookie
     *     $cookies.put('myFavorite', 'oatmeal');
     *   }]);
     * ```
     */
    this.$get = ['$$cookieReader', '$$cookieWriter', function($$cookieReader, $$cookieWriter) {
      return {
        /**
         * @ngdoc method
         * @name $cookies#get
         *
         * @description
         * Returns the value of given cookie key
         *
         * @param {string} key Id to use for lookup.
         * @returns {string} Raw cookie value.
         */
        get: function(key) {
          return $$cookieReader()[key];
        },

        /**
         * @ngdoc method
         * @name $cookies#getObject
         *
         * @description
         * Returns the deserialized value of given cookie key
         *
         * @param {string} key Id to use for lookup.
         * @returns {Object} Deserialized cookie value.
         */
        getObject: function(key) {
          var value = this.get(key);
          return value ? angular.fromJson(value) : value;
        },

        /**
         * @ngdoc method
         * @name $cookies#getAll
         *
         * @description
         * Returns a key value object with all the cookies
         *
         * @returns {Object} All cookies
         */
        getAll: function() {
          return $$cookieReader();
        },

        /**
         * @ngdoc method
         * @name $cookies#put
         *
         * @description
         * Sets a value for given cookie key
         *
         * @param {string} key Id for the `value`.
         * @param {string} value Raw value to be stored.
         * @param {Object=} options Options object.
         *    See {@link ngCookies.$cookiesProvider#defaults $cookiesProvider.defaults}
         */
        put: function(key, value, options) {
          $$cookieWriter(key, value, calcOptions(options));
        },

        /**
         * @ngdoc method
         * @name $cookies#putObject
         *
         * @description
         * Serializes and sets a value for given cookie key
         *
         * @param {string} key Id for the `value`.
         * @param {Object} value Value to be stored.
         * @param {Object=} options Options object.
         *    See {@link ngCookies.$cookiesProvider#defaults $cookiesProvider.defaults}
         */
        putObject: function(key, value, options) {
          this.put(key, angular.toJson(value), options);
        },

        /**
         * @ngdoc method
         * @name $cookies#remove
         *
         * @description
         * Remove given cookie
         *
         * @param {string} key Id of the key-value pair to delete.
         * @param {Object=} options Options object.
         *    See {@link ngCookies.$cookiesProvider#defaults $cookiesProvider.defaults}
         */
        remove: function(key, options) {
          $$cookieWriter(key, undefined, calcOptions(options));
        }
      };
    }];
  }]);

angular.module('ngCookies').
/**
 * @ngdoc service
 * @name $cookieStore
 * @deprecated
 * @requires $cookies
 *
 * @description
 * Provides a key-value (string-object) storage, that is backed by session cookies.
 * Objects put or retrieved from this storage are automatically serialized or
 * deserialized by angular's toJson/fromJson.
 *
 * Requires the {@link ngCookies `ngCookies`} module to be installed.
 *
 * <div class="alert alert-danger">
 * **Note:** The $cookieStore service is deprecated.
 * Please use the {@link ngCookies.$cookies `$cookies`} service instead.
 * </div>
 *
 * @example
 *
 * ```js
 * angular.module('cookieStoreExample', ['ngCookies'])
 *   .controller('ExampleController', ['$cookieStore', function($cookieStore) {
 *     // Put cookie
 *     $cookieStore.put('myFavorite','oatmeal');
 *     // Get cookie
 *     var favoriteCookie = $cookieStore.get('myFavorite');
 *     // Removing a cookie
 *     $cookieStore.remove('myFavorite');
 *   }]);
 * ```
 */
 factory('$cookieStore', ['$cookies', function($cookies) {

    return {
      /**
       * @ngdoc method
       * @name $cookieStore#get
       *
       * @description
       * Returns the value of given cookie key
       *
       * @param {string} key Id to use for lookup.
       * @returns {Object} Deserialized cookie value, undefined if the cookie does not exist.
       */
      get: function(key) {
        return $cookies.getObject(key);
      },

      /**
       * @ngdoc method
       * @name $cookieStore#put
       *
       * @description
       * Sets a value for given cookie key
       *
       * @param {string} key Id for the `value`.
       * @param {Object} value Value to be stored.
       */
      put: function(key, value) {
        $cookies.putObject(key, value);
      },

      /**
       * @ngdoc method
       * @name $cookieStore#remove
       *
       * @description
       * Remove given cookie
       *
       * @param {string} key Id of the key-value pair to delete.
       */
      remove: function(key) {
        $cookies.remove(key);
      }
    };

  }]);

/**
 * @name $$cookieWriter
 * @requires $document
 *
 * @description
 * This is a private service for writing cookies
 *
 * @param {string} name Cookie name
 * @param {string=} value Cookie value (if undefined, cookie will be deleted)
 * @param {Object=} options Object with options that need to be stored for the cookie.
 */
function $$CookieWriter($document, $log, $browser) {
  var cookiePath = $browser.baseHref();
  var rawDocument = $document[0];

  function buildCookieString(name, value, options) {
    var path, expires;
    options = options || {};
    expires = options.expires;
    path = angular.isDefined(options.path) ? options.path : cookiePath;
    if (value === undefined) {
      expires = 'Thu, 01 Jan 1970 00:00:00 GMT';
      value = '';
    }
    if (angular.isString(expires)) {
      expires = new Date(expires);
    }

    var str = encodeURIComponent(name) + '=' + encodeURIComponent(value);
    str += path ? ';path=' + path : '';
    str += options.domain ? ';domain=' + options.domain : '';
    str += expires ? ';expires=' + expires.toUTCString() : '';
    str += options.secure ? ';secure' : '';

    // per http://www.ietf.org/rfc/rfc2109.txt browser must allow at minimum:
    // - 300 cookies
    // - 20 cookies per unique domain
    // - 4096 bytes per cookie
    var cookieLength = str.length + 1;
    if (cookieLength > 4096) {
      $log.warn("Cookie '" + name +
        "' possibly not set or overflowed because it was too large (" +
        cookieLength + " > 4096 bytes)!");
    }

    return str;
  }

  return function(name, value, options) {
    rawDocument.cookie = buildCookieString(name, value, options);
  };
}

$$CookieWriter.$inject = ['$document', '$log', '$browser'];

angular.module('ngCookies').provider('$$cookieWriter', function $$CookieWriterProvider() {
  this.$get = $$CookieWriter;
});


})(window, window.angular);

/*
 AngularJS v1.4.0
 (c) 2010-2015 Google, Inc. http://angularjs.org
 License: MIT
*/
(function(I,d,B){'use strict';function D(f,q){q=q||{};d.forEach(q,function(d,h){delete q[h]});for(var h in f)!f.hasOwnProperty(h)||"$"===h.charAt(0)&&"$"===h.charAt(1)||(q[h]=f[h]);return q}var x=d.$$minErr("$resource"),C=/^(\.[a-zA-Z_$@][0-9a-zA-Z_$@]*)+$/;d.module("ngResource",["ng"]).provider("$resource",function(){var f=this;this.defaults={stripTrailingSlashes:!0,actions:{get:{method:"GET"},save:{method:"POST"},query:{method:"GET",isArray:!0},remove:{method:"DELETE"},"delete":{method:"DELETE"}}};
this.$get=["$http","$q",function(q,h){function u(d,g){this.template=d;this.defaults=s({},f.defaults,g);this.urlParams={}}function w(y,g,l,m){function c(b,k){var c={};k=s({},g,k);r(k,function(a,k){v(a)&&(a=a());var d;if(a&&a.charAt&&"@"==a.charAt(0)){d=b;var e=a.substr(1);if(null==e||""===e||"hasOwnProperty"===e||!C.test("."+e))throw x("badmember",e);for(var e=e.split("."),n=0,g=e.length;n<g&&d!==B;n++){var h=e[n];d=null!==d?d[h]:B}}else d=a;c[k]=d});return c}function F(b){return b.resource}function e(b){D(b||
{},this)}var G=new u(y,m);l=s({},f.defaults.actions,l);e.prototype.toJSON=function(){var b=s({},this);delete b.$promise;delete b.$resolved;return b};r(l,function(b,k){var g=/^(POST|PUT|PATCH)$/i.test(b.method);e[k]=function(a,z,m,y){var n={},f,l,A;switch(arguments.length){case 4:A=y,l=m;case 3:case 2:if(v(z)){if(v(a)){l=a;A=z;break}l=z;A=m}else{n=a;f=z;l=m;break}case 1:v(a)?l=a:g?f=a:n=a;break;case 0:break;default:throw x("badargs",arguments.length);}var u=this instanceof e,p=u?f:b.isArray?[]:new e(f),
t={},w=b.interceptor&&b.interceptor.response||F,C=b.interceptor&&b.interceptor.responseError||B;r(b,function(b,a){"params"!=a&&"isArray"!=a&&"interceptor"!=a&&(t[a]=H(b))});g&&(t.data=f);G.setUrlParams(t,s({},c(f,b.params||{}),n),b.url);n=q(t).then(function(a){var c=a.data,g=p.$promise;if(c){if(d.isArray(c)!==!!b.isArray)throw x("badcfg",k,b.isArray?"array":"object",d.isArray(c)?"array":"object",t.method,t.url);b.isArray?(p.length=0,r(c,function(a){"object"===typeof a?p.push(new e(a)):p.push(a)})):
(D(c,p),p.$promise=g)}p.$resolved=!0;a.resource=p;return a},function(a){p.$resolved=!0;(A||E)(a);return h.reject(a)});n=n.then(function(a){var b=w(a);(l||E)(b,a.headers);return b},C);return u?n:(p.$promise=n,p.$resolved=!1,p)};e.prototype["$"+k]=function(a,b,c){v(a)&&(c=b,b=a,a={});a=e[k].call(this,a,this,b,c);return a.$promise||a}});e.bind=function(b){return w(y,s({},g,b),l)};return e}var E=d.noop,r=d.forEach,s=d.extend,H=d.copy,v=d.isFunction;u.prototype={setUrlParams:function(f,g,l){var m=this,
c=l||m.template,h,e,q=m.urlParams={};r(c.split(/\W/),function(b){if("hasOwnProperty"===b)throw x("badname");!/^\d+$/.test(b)&&b&&(new RegExp("(^|[^\\\\]):"+b+"(\\W|$)")).test(c)&&(q[b]=!0)});c=c.replace(/\\:/g,":");g=g||{};r(m.urlParams,function(b,k){h=g.hasOwnProperty(k)?g[k]:m.defaults[k];d.isDefined(h)&&null!==h?(e=encodeURIComponent(h).replace(/%40/gi,"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"%20").replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,
"+"),c=c.replace(new RegExp(":"+k+"(\\W|$)","g"),function(b,a){return e+a})):c=c.replace(new RegExp("(/?):"+k+"(\\W|$)","g"),function(b,a,c){return"/"==c.charAt(0)?c:a+c})});m.defaults.stripTrailingSlashes&&(c=c.replace(/\/+$/,"")||"/");c=c.replace(/\/\.(?=\w+($|\?))/,".");f.url=c.replace(/\/\\\./,"/.");r(g,function(b,c){m.urlParams[c]||(f.params=f.params||{},f.params[c]=b)})}};return w}]})})(window,window.angular);
//# sourceMappingURL=angular-resource.min.js.map

(function () {
    'use strict';
    angular
        .module('core', [
        'ngCookies'
    ]);
})();
//# sourceMappingURL=core.module.js.map
/* globals SERVER_SETTINGS */
(function () {
    'use strict';
    angular
        .module('core')
        .constant('SERVER_SETTINGS', SERVER_SETTINGS);
})();
//# sourceMappingURL=constants.js.map
/* globals UTILITIES */
(function () {
    'use strict';
    // imports from '/Scripts/plugins/utilities.js'
    angular
        .module('core')
        .constant('UTILITIES', UTILITIES);
})();
//# sourceMappingURL=utilities.js.map
/* globals ERRORMESSENGER */
(function () {
    'use strict';
    // imports from '/Scripts/plugins/errorMessenger.js'
    angular
        .module('core')
        .constant('ERRORMESSENGER', ERRORMESSENGER);
})();
//# sourceMappingURL=errorMessenger.js.map
(function () {
    'use strict';
    angular.module('dataServices', [
        'core',
        'ngResource'
    ]);
})();
//# sourceMappingURL=dataservices.module.js.map
(function () {
    'use strict';
    angular
        .module('dataServices')
        .factory('GetIndexDataService', GetIndexDataService);
    GetIndexDataService.$inject = [
        '$resource',
        'SERVER_SETTINGS'
    ];
    function GetIndexDataService($resource, SERVER_SETTINGS) {
        var service = {
            GetUWAAIndexData: GetUWAAIndexData,
            GetMembershipAmount: GetMembershipAmount
        };
        var GetUWAAIndexDataResource = $resource(SERVER_SETTINGS.applicationRoot + 'UWAA/GetIndexData?appealCode=:appealCode', { appealCode: '@appealCode', membCodes: '@membCodes' }, { 'get': { method: 'GET' } });
        var GetMembershipAmountResource = $resource(SERVER_SETTINGS.applicationRoot + 'UWAA/GetMembershipAmount?rate=:rate', { rate: '@rate' }, { 'get': { method: 'GET' } });
        return service;
        ///////
        function GetUWAAIndexData(appealCode, membCodes) {
            return GetUWAAIndexDataResource.get({ appealCode: appealCode, membCodes: membCodes });
        }
        function GetMembershipAmount(rate) {
            return GetMembershipAmountResource.get({ rate: rate });
        }
    }
})();
//# sourceMappingURL=indexData.service.js.map
(function () {
    'use strict';
    angular.module('modelsMod', []);
})();
//# sourceMappingURL=models.module.js.map
(function () {
    'use strict';
    angular
        .module('modelsMod')
        .factory('ViewModel', ViewModel);
    function ViewModel() {
        function ViewModel() {
            this.appLoaded = false;
            this.serverModelLoaded = false;
            this.mainError = "";
        }
        return ViewModel;
    }
    ;
})();
//# sourceMappingURL=viewModel.js.map
(function () {
    'use strict';
    angular.module('shared', []);
})();
//# sourceMappingURL=shared.module.js.map
(function () {
    'use strict';
    angular.module('uwaa', [
        'core',
        'dataServices',
        'modelsMod',
        'shared'
    ]);
})();
//# sourceMappingURL=uwaa.module.js.map
/* exported UWAAConfig */
var UWAAConfig = (function () {
    return {
        cookieName: "UWAAMembershipSession",
        cookieVersion: "1.6"
    };
})();
//# sourceMappingURL=uwaa.config.js.map
/* globals RESPONSIVEHEIGHTMESSENGER, UWAAConfig, CHECKOUT, PAYMENT */
(function () {
    'use strict';
    angular
        .module('uwaa')
        .constant('UWAAConfig', UWAAConfig)
        .constant('RESPONSIVEHEIGHTMESSENGER', RESPONSIVEHEIGHTMESSENGER)
        .constant('CHECKOUT', CHECKOUT)
        .constant('PAYMENT', PAYMENT);
})();
//# sourceMappingURL=uwaa.constants.js.map
(function () {
    'use strict';
    angular
        .module('uwaa')
        .factory('UWAAViewModel', UWAAViewModel);
    UWAAViewModel.$inject = ['ViewModel'];
    function UWAAViewModel(ViewModel) {
        return {
            getViewModel: function getViewModel() {
                var vm = new ViewModel();
                vm.membershipCat = null; // 'life' or 'annual'
                vm.membershipType = null;
                vm.selectedMembershipOptionObject = null;
                vm.restoringWithCookieFlag = false;
                vm.hidePaymentInfo = false;
                return vm;
            }
        };
    }
    ;
})();
//# sourceMappingURL=uwaa.viewModel.js.map
/*global ERRORMESSENGER, SERVER_SETTINGS, CHECKOUT, RECAPTCHAHELPER*/
CHECKOUT.UWAA = (function () {
    var submitBtnID = "memSubmit",
        $paymentInfoBox = $(".payment-info-box"),
        $paymentInfoBoxTextBox = $(".payment-info-box-text", $paymentInfoBox);

    return {
        init: init,
        logErrorFN: logErrorFN,
        showPaymentInfoMessageFN: showPaymentInfoMessageFN
    };

    ////////////

    function init() {
        CHECKOUT.init({
            enableButtonOnPaymentInitialize: false,
            errorContainerClass: "payment-error",
            errorPagePath: SERVER_SETTINGS.applicationRoot + "Error",
            initPayment: true,
            cardConnectStyles: { cssString: _getCSS(), iframeHeight: "163", mobileIframeHeight: "225", mobileTrigger: "992" },
            cardConnectOrientation: "default",
            loadingButtonClass: "loading-button",
            logErrorFN: this.logErrorFN,
            logErrorFnHandlesErrorDisplay: true,
            recaptchaHelper: RECAPTCHAHELPER,
            recaptchaHelperTestPath: SERVER_SETTINGS.applicationRoot + "RetirementAssociation/TestRecaptcha",
            showPaymentInfoMessageFN: this.showPaymentInfoMessageFN,
            showPaymentOptions: false,
            submitBtnID: submitBtnID,
            usePaymentLocker: true,
            usePayPal: false
        });
    }

    ////////////

    function logErrorFN(error) {
        var redirect = _warrantsRedirect(error);

        ERRORMESSENGER.sendError(error.ErrorMessage, redirect);
    }

    function showPaymentInfoMessageFN(msg) {
        $paymentInfoBoxTextBox.html(msg);
        $paymentInfoBox.show();
    }

    ////////////

    function _getCSS() {
        var cssString = "";
        var USE_MOBILE_LAYOUT = ((window.innerWidth > 0) ? window.innerWidth : screen.width) < 992 ? true : false;

        cssString += 'input' + '{width:100%;max-width:945px;border:1px solid #ccc;padding:.2em;height:34px;transition: all .2s ease-in-out;font-size: 14px;line-height: 1.428571429;color: #555555;vertical-align: middle;background-color: #ffffff;border-radius: 4px;box-shadow: inset 0 1px 1px rgb(0 0 0 / 8%);box-sizing: border-box;}';

        cssString += 'input:focus,select:focus' + '{border: 1px solid #5d4a82;outline: 0;box-shadow: inset 0 1px 1px rgb(0 0 0 / 8%), 0 0 8px rgb(93 74 130 / 60%);}';

        cssString += 'label+br' + '{display:none}';

        //cssString += 'label+label' + '{margin-top:20px;}';

        if (!USE_MOBILE_LAYOUT) {
            cssString += 'label' + '{display:inline-block;width:16.6%;text-align:right;margin-left:-20px;margin-right:28px;}';
            cssString += 'input' + '{width:82.4%}';
        } else {
            cssString += 'label' + '{display:block;width:100%;text-align:left;margin-right:10px;}';
            cssString += 'label[for="ccexpiryfieldyear"]' + '{display:inline;}';
        }

        cssString += 'label' + '{font-family:"Open Sans", sans-serif;font-size:14px;color:#333333;margin-top:20px;font-weight:bold;}';

        cssString += 'select' + '{padding: 6px 12px;font-size: 14px;line-height: 1.428571429;color: #555555;vertical-align: middle;background-color: #ffffff;border: 1px solid #cccccc;border-radius: 4px;box-shadow: inset 0 1px 1px rgb(0 0 0 / 8%);}';

        if (!USE_MOBILE_LAYOUT) {
            cssString += '#ccexpiryfieldmonth,#ccexpiryfieldyear' + '{width:10%;}';
        } else {
            cssString += '#ccexpiryfieldmonth,#ccexpiryfieldyear' + '{width:25%;}';
        }

        cssString += '#ccexpiryfieldmonth + label' + '{width:0px;margin:10px}';

        cssString += '::placeholder' + '{color:#999999;}';

        //cssString += '.error' + '{border-color:#df1111}'; // seems to apply this bordering oddly, i.e., doesn't clear when it seems like it should

        return cssString;
    }

    function _warrantsRedirect(error) {
        if (_isRecaptchaError()) {
            return false;
        }

        return true;

        ///////

        function _isRecaptchaError() {
            if (error.ErrorType === "reCaptchaUnknownError") {
                return true;
            }

            return false;
        }
    }
})();
/* globals UTILITIES */
(function () {
    'use strict';
    angular
        .module('shared')
        .directive('membershipFormFields', membershipFormFields);
    membershipFormFields.$inject = [
        'RESPONSIVEHEIGHTMESSENGER',
        '$timeout'
    ];
    function membershipFormFields(RESPONSIVEHEIGHTMESSENGER, $timeout) {
        //Usage:
        //<membership-form-fields></membership-form-fields>
        var directive = {
            restrict: 'E',
            link: _link,
            scope: {
                dataModel: '=serverModel'
            }
        };
        return directive;
        ///////////////
        function _link(scope, elem, attrs) {
            var billingSameAsMemberInitialized = false;
            var firstLoad = true;
            var billingSameAsMemberModule = (function () {
                var temp_billing_name_prefix, temp_billing_name_first, temp_billing_name_middle, temp_billing_name_last, temp_billing_name_suffix, temp_billing_address_international, temp_billing_address_street1, temp_billing_address_street2, temp_billing_address_street3, temp_billing_address_city, temp_billing_address_state, temp_billing_address_province, temp_billing_address_zip, temp_billing_address_country, temp_billing_address_email;
                // set billing input variables
                var $international = $("input[name='BillingMemberAddress.IsInternational']"), $intAddrYes = $("#BillingMemberAddress_IsInternationalYes"), $intAddrNo = $("#BillingMemberAddress_IsInternationalNo"), $prefix = $("#BillingName_PREFIX"), $firstName = $("#BillingName_FIRST_NAME"), $lastName = $("#BillingName_LAST_NAME"), $suffix = $("#BillingName_SUFFIX"), $addr1 = $("#BillingMemberAddress_STREET1"), $addr2 = $("#BillingMemberAddress_STREET2"), $addr3 = $("#BillingMemberAddress_STREET3"), $city = $("#BillingMemberAddress_CITY"), $state = $("#BillingMemberAddress_STATE_CODE"), $province = $("#BillingMemberAddress_Province"), $zip = $("#BillingMemberAddress_ZIPCODE"), $country = $("#BillingMemberAddress_COUNTRY_CODE"), $email = $("#BillingEmail_Email");
                return {
                    init: function init(vm) {
                        $("input[name='MemberDifferentFromPayee']").change(function (e) {
                            _sameAsMemberClick();
                        });
                        _sameAsMemberClick();
                    },
                    attachBindings: attachBindings
                };
                function attachBindings() {
                    $("#memberInformationFieldset input, #memberInformationFieldset select").on("change", function () {
                        if (scope.dataModel.MemberDifferentFromPayee === false) {
                            _autoFillBillingInfo.call($(this));
                        }
                    });
                    $(".is-international").on("click", function () {
                        var $radio = $(this), type = $radio.attr("data-address-type"), radioValue = UTILITIES.toBool($radio.val());
                        _toggleAddress(type, radioValue);
                    });
                    // run toggles on page load, handles cases where validation has failed
                    _toggleAddress("MemberAddress", UTILITIES.toBool($("input[name='MemberAddress.IsInternational']:checked").val()));
                    _toggleAddress("BillingMemberAddress", UTILITIES.toBool($("input[name='BillingMemberAddress.IsInternational']:checked").val()));
                    _scrollToFirstError();
                }
                /////////////
                function _autoFillBillingInfo() {
                    var $formField = $(this), formFieldName = $formField.attr("name"), formVal = $formField.val(), formFieldNameStripped = formFieldName.substr(formFieldName.indexOf(".") + 1), formValAsYesOrNo, $theRadio;
                    if ($formField.attr("type") === "radio") {
                        formValAsYesOrNo = (formVal === "true") ? "Yes" : "No";
                        $theRadio = $("[id$=" + formFieldNameStripped + formValAsYesOrNo + "]", "#billingInformationFieldset");
                        $theRadio.prop("checked", true);
                        $theRadio.trigger("click");
                    }
                    else {
                        $("[id$=" + formFieldNameStripped + "]", "#billingInformationFieldset").val(formVal);
                    }
                }
                function _cacheAndRestore(sameAsMember) {
                    if (sameAsMember) {
                        // cache new values if any
                        temp_billing_name_prefix = $prefix.val();
                        temp_billing_name_first = $firstName.val();
                        temp_billing_name_last = $lastName.val();
                        temp_billing_name_suffix = $suffix.val();
                        temp_billing_address_international = ($intAddrYes.is(":checked")) ? "true" : "false";
                        temp_billing_address_street1 = $addr1.val();
                        temp_billing_address_street2 = $addr2.val();
                        temp_billing_address_street3 = $addr3.val();
                        temp_billing_address_city = $city.val();
                        temp_billing_address_state = $state.val();
                        temp_billing_address_province = $province.val();
                        temp_billing_address_zip = $zip.val();
                        temp_billing_address_country = $country.val();
                        temp_billing_address_email = $email.val();
                        // restore member values
                        $prefix.val($("#MemberName_PREFIX").val());
                        $firstName.val($("#MemberName_FIRST_NAME").val());
                        $lastName.val($("#MemberName_LAST_NAME").val());
                        $suffix.val($("#MemberName_SUFFIX").val());
                        $addr1.val($("#MemberAddress_STREET1").val());
                        $addr2.val($("#MemberAddress_STREET2").val());
                        $addr3.val($("#MemberAddress_STREET3").val());
                        $city.val($("#MemberAddress_CITY").val());
                        $state.val($("#MemberAddress_STATE_CODE").val());
                        $province.val($("#MemberAddress_Province").val());
                        $zip.val($("#MemberAddress_ZIPCODE").val());
                        $country.val($("#MemberAddress_COUNTRY_CODE").val());
                        $email.val($("#MemberEmail_Email").val());
                        // Toggle the international fields if necessary
                        if ($("input[name='MemberAddress.IsInternational']:checked").val() === "true") {
                            $intAddrYes.prop("checked", true);
                            $intAddrYes.trigger("click");
                        }
                        else {
                            $intAddrNo.prop("checked", true);
                            $intAddrNo.trigger("click");
                        }
                    }
                    else {
                        if (typeof temp_billing_name_prefix !== "undefined") {
                            // restore temp values if any
                            $prefix.val(temp_billing_name_prefix);
                            $firstName.val(temp_billing_name_first);
                            $lastName.val(temp_billing_name_last);
                            $suffix.val(temp_billing_name_suffix);
                            $addr1.val(temp_billing_address_street1);
                            $addr2.val(temp_billing_address_street2);
                            $addr3.val(temp_billing_address_street3);
                            $city.val(temp_billing_address_city);
                            $state.val(temp_billing_address_state);
                            $province.val(temp_billing_address_province);
                            $zip.val(temp_billing_address_zip);
                            $country.val(temp_billing_address_country);
                            $email.val(temp_billing_address_email);
                            // Toggle the international fields if necessary
                            if (temp_billing_address_international.toLowerCase() === "true") {
                                $intAddrYes.prop("checked", true);
                                $intAddrYes.trigger("click");
                            }
                            else {
                                $intAddrNo.prop("checked", true);
                                $intAddrNo.trigger("click");
                            }
                        }
                    }
                }
                function _sameAsMemberClick() {
                    var value = $("#MemberDifferentFromPayeeYes").is(":checked") ? false : true;
                    scope.dataModel.MemberDifferentFromPayee = value;
                    if (scope.dataModel.MemberDifferentFromPayee === false) {
                        $("input[type='text'], input[type='email'], select", "#billingInformationFieldset").attr("readonly", "readonly").addClass("locked");
                        $("select", "#billingInformationFieldset").attr("disabled", "disabled");
                        $("input[name='BillingMemberAddress.IsInternational']").attr("disabled", "disabled");
                        _cacheAndRestore(true);
                    }
                    else {
                        $("input[type='text'], input[type='email'], select", "#billingInformationFieldset").removeAttr("readonly").removeClass("locked");
                        $("select", "#billingInformationFieldset").removeAttr("disabled");
                        $("input[name='BillingMemberAddress.IsInternational']").attr("disabled", false);
                        _cacheAndRestore();
                    }
                }
                function _scrollToFirstError() {
                    var firstErrorOffset;
                    if ($(".field-validation-error").length > 0) {
                        firstErrorOffset = $($(".field-validation-error")[0]).closest(".form-group").offset().top;
                    }
                    else if ($(".payment-error").text().length > 0) {
                        firstErrorOffset = $(".payment-fieldset").offset().top;
                    }
                    if (typeof firstErrorOffset !== 'undefined') {
                        $timeout(function () {
                            window.scrollTo(0, firstErrorOffset);
                        });
                    }
                    // report to parent so it can scroll to error
                    RESPONSIVEHEIGHTMESSENGER.scrollToError(firstErrorOffset);
                }
                function _toggleAddress(type, isInternational) {
                    var $context = (type === "MemberAddress") ? $("#memberInformationFieldset") : $("#billingInformationFieldset");
                    if (isInternational) {
                        $(".province-form-group", $context).show();
                        $(".countrycode-form-group", $context).show();
                        $(".state-form-group", $context).hide();
                    }
                    else {
                        $(".province-form-group", $context).hide();
                        $(".countrycode-form-group", $context).hide();
                        $(".state-form-group", $context).show();
                    }
                }
            })();
            scope.$watch('dataModel', function (newVal, oldVal) {
                if (newVal !== oldVal && !billingSameAsMemberInitialized) {
                    billingSameAsMemberModule.init(scope.vm);
                    billingSameAsMemberInitialized = true;
                }
                if (newVal !== oldVal && firstLoad) {
                    firstLoad = false;
                    $timeout(function () {
                        billingSameAsMemberModule.attachBindings();
                    });
                }
            }, true);
        }
        ;
    }
    ;
})();
//# sourceMappingURL=membershipFormFields.directive.js.map
(function () {
    'use strict';
    angular
        .module('shared')
        .directive('stringToNumber', stringToNumber);
    function stringToNumber() {
        return {
            require: 'ngModel',
            link: function (scope, element, attrs, ngModel) {
                ngModel.$parsers.push(function (value) {
                    return '' + value;
                });
                ngModel.$formatters.push(function (value) {
                    return parseFloat(value, 10);
                });
            }
        };
    }
})();
//# sourceMappingURL=stringToNumber.directive.js.map
/* globals ERRORMESSENGER, UTILITIES, CHECKOUT, SERVER_SETTINGS */
(function () {
    'use strict';
    angular
        .module('uwaa')
        .controller('UWAAController', UWAAController);
    UWAAController.$inject = [
        '$scope',
        '$cookies',
        '$filter',
        '$timeout',
        'UWAAViewModel',
        'UWAAConfig',
        'GetIndexDataService',
        '$location',
        '$window'
    ];
    function UWAAController($scope, $cookies, $filter, $timeout, UWAAViewModel, UWAAConfig, GetIndexDataService, $location, $window) {
        var vm = this, timeout = null, cachedServerModel, membAmountIsZero = false, queryParams;
        vm.dataModel;
        vm.uwaaVM = UWAAViewModel.getViewModel();
        vm.persistentQueryStrings = null;
        vm.goBack = goBack;
        vm.goToNewGrad2020Page = goToNewGrad2020Page;
        vm.optionBoxSelection = optionBoxSelection;
        vm.promotionalItemSelection = promotionalItemSelection;
        vm.showMoreAddtionalMembershipOptionInfo = showMoreAddtionalMembershipOptionInfo;
        $scope.$watch('vm.dataModel', _debounceSaveUpdates, true);
        $scope.$watch('vm.GiftAmount', _giftAmountChange);
        $scope.$watch('vm.uwaaVM', _debounceSaveUpdates, true);
        $scope.$watch('vm.uwaaVM.membershipCat', _membershipCatChange);
        $scope.$watch('vm.uwaaVM.selectedMembershipOptionObject', _selectedMembershipChange);
        activate();
        //////////
        function activate() {
            var _a;
            var appealCode, membcodes;
            queryParams = (_a = UTILITIES.parseQueryString(window.location.search.substring(1).toLowerCase())) !== null && _a !== void 0 ? _a : null;
            vm.persistentQueryStrings = queryParams !== null ? UTILITIES.serializeObjectAsQueryString(queryParams) : null;
            appealCode = (queryParams && queryParams.appealcode) ? queryParams.appealcode : null;
            membcodes = (queryParams && queryParams.membcodes) ? queryParams.membcodes : null;
            CHECKOUT.UWAA.init();
            _setRequiredLabels();
            GetIndexDataService.GetUWAAIndexData(appealCode, membcodes).$promise
                .then(function (data) {
                _consumeServerData(data);
                vm.uwaaVM.serverModelLoaded = true;
                if (vm.persistentQueryStrings === null && data.persistentQueryStrings !== null && data.persistentQueryStrings !== '') {
                    vm.persistentQueryStrings = data.persistentQueryStrings;
                }
                if (window.location.search === '') {
                    try {
                        _readCookie();
                    }
                    catch (err) {
                        console.error(err);
                    }
                }
                else if (typeof queryParams !== 'undefined' && queryParams !== null) {
                    _processQueryParams(queryParams);
                }
                _processLimitedMemberships();
                if (vm.dataModel.SelectedMembershipOption && vm.dataModel.SelectedMembershipOption !== "" && vm.uwaaVM.membershipType !== null) {
                    vm.uwaaVM.selectedMembershipOptionObject = _setSelectedMembershipOptionObjectByRateCode(vm.dataModel.SelectedMembershipOption);
                }
            })
                .catch(function (err) {
                ERRORMESSENGER.sendError(err, true);
                //vm.uwaaVM.mainError = "There was an error loading the application. Please refresh the page and try again. If the issue persists, please email advsti@uw.edu.";
            })
                .finally(function () {
                vm.uwaaVM.appLoaded = true;
            });
        }
        ;
        function goBack() {
            var goingBackFromSubmit = SERVER_SETTINGS.controller.toLowerCase() === 'uwaa' && SERVER_SETTINGS.action.toLowerCase() === 'submit' ? true : false;
            if (goingBackFromSubmit) {
                $cookies.remove(UWAAConfig.cookieName, { path: "/" });
                if (vm.persistentQueryStrings !== null) {
                    window.location.href = SERVER_SETTINGS.applicationRoot + SERVER_SETTINGS.controller + "?" + vm.persistentQueryStrings;
                }
                else {
                    window.location.href = SERVER_SETTINGS.applicationRoot + SERVER_SETTINGS.controller;
                }
            }
            else {
                _resetModels();
                if (typeof queryParams !== 'undefined' && queryParams !== null) {
                    _processQueryParams(queryParams);
                }
                _processLimitedMemberships();
            }
        }
        function goToNewGrad2020Page() {
            $window.open('https://uw.edu/alumni/2020grad', '_blank');
        }
        function optionBoxSelection(membershipCategory, membershipType, upgrade) {
            if (membershipCategory !== null) {
                vm.uwaaVM.membershipCat = membershipCategory;
            }
            if (membershipType !== null) {
                vm.uwaaVM.membershipType = membershipType;
            }
            vm.dataModel.IsUpgrade = upgrade;
        }
        function promotionalItemSelection(include, e, summaryMsg) {
            var $modal;
            if ($(e.target).hasClass("additional-membership-option-more-info-link")) {
                e.preventDefault();
                return;
            }
            $modal = $(e.target).closest(".modal");
            vm.dataModel.IncludePromotionalItem = include;
            setTimeout(function () {
                $modal.modal("hide");
            }, 800);
        }
        function showMoreAddtionalMembershipOptionInfo(e) {
            $(e.target).next().fadeIn();
        }
        ///////
        // private methods
        ///////
        function _consumeServerData(data) {
            var clone = angular.copy(data);
            cachedServerModel = data;
            vm.dataModel = clone;
        }
        function _debounceSaveUpdates(newVal, oldVal) {
            // todo: add some error handling
            if (newVal !== oldVal) {
                if (timeout) {
                    $timeout.cancel(timeout);
                }
                timeout = $timeout(_saveState(), 1000); // 1000 = 1 second
            }
        }
        function _giftAmountChange(newVal, oldVal) {
            if (newVal !== oldVal) {
                try {
                    if (parseInt(newVal, 10) > 0) {
                        vm.uwaaVM.hidePaymentInfo = false;
                    }
                    else if (membAmountIsZero) {
                        vm.uwaaVM.hidePaymentInfo = true;
                    }
                }
                catch (err) {
                    if (membAmountIsZero) {
                        vm.uwaaVM.hidePaymentInfo = true;
                    }
                }
            }
        }
        function _membershipCatChange(newVal, oldVal) {
            if (newVal !== oldVal) {
                // toggle MemberDifferentFromPayee and ShipToBilling checkboxes
                if (newVal === 'gift') {
                    $("#MemberDifferentFromPayeeNo").trigger("click");
                    $("#ShipToBillingYes").trigger("click");
                }
                else {
                    $("#MemberDifferentFromPayeeYes").trigger("click");
                    $("#ShipToBillingNo").trigger("click");
                }
            }
        }
        function _processLimitedMemberships() {
            // process limited membership, fast forward past choices
            if (vm.dataModel.limitedMembershipOptionsVM && vm.dataModel.limitedMembershipOptionsVM.MembershipOptions.length > 0) {
                if (vm.dataModel.JoinRenewGift.SelectedOption === null) {
                    vm.dataModel.JoinRenewGift.SelectedOption = 'Join';
                }
                vm.uwaaVM.membershipType = 'limitedMembershipOptions';
                vm.uwaaVM.membershipCat = 'limited';
            }
        }
        function _processQueryParams(queryParams) {
            if (queryParams.renew === "true") {
                vm.dataModel.JoinRenewGift.SelectedOption = "Renew";
            }
            else if (queryParams.join === "true") {
                vm.dataModel.JoinRenewGift.SelectedOption = "Join";
            }
            else if (queryParams.newgrad === "true") {
                vm.dataModel.JoinRenewGift.SelectedOption = "Join";
                vm.uwaaVM.membershipCat = "newGrad";
                vm.uwaaVM.membershipType = "newGrad";
            }
            if (queryParams.gift === "true") {
                vm.dataModel.JoinRenewGift.SelectedOption = "Join";
                $timeout(function () {
                    // wait for other model processes to complete
                    vm.uwaaVM.membershipType = vm.uwaaVM.membershipType || "gift"; // only set type to gift if it was not set to newGrad, limited etc.
                    vm.uwaaVM.membershipCat = "gift"; // sets GiftMembership hidden input to true for use by server on submit, sets "Billing Same as Member Information to no" and  sets "Ship to Billing Address" to true
                    $scope.$apply(); // apply changes to model after timeout
                });
            }
        }
        function _readCookie() {
            var session, cookieObj;
            _removeOldCookieIfExists();
            session = $cookies.get(UWAAConfig.cookieName);
            if (session) {
                cookieObj = angular.fromJson(session);
                if (vm.dataModel.limitedMembershipOptionsVM === null && cookieObj.uwaaVM.membershipType === 'limitedMembershipOptions') {
                    $cookies.remove(UWAAConfig.cookieName, { path: "/" });
                    return false;
                }
                vm.uwaaVM = cookieObj.uwaaVM;
                vm.uwaaVM.restoringWithCookieFlag = true;
                vm.dataModel.SelectedMembershipOption = cookieObj.SelectedMembershipOption;
                if (vm.dataModel.ShowPromotion) {
                    vm.dataModel.IncludePromotionalItem = cookieObj.IncludePromotionalItem;
                }
                vm.dataModel.JoinRenewGift.SelectedOption = cookieObj.JoinRenewGift.SelectedOption;
                vm.dataModel.IsUpgrade = cookieObj.IsUpgrade;
                $timeout(function () {
                    vm.uwaaVM.restoringWithCookieFlag = false;
                });
            }
        }
        function _removeOldCookieIfExists() {
            if (typeof $cookies.get(UWAAConfig.cookieName) !== 'undefined'
                && $cookies.getObject(UWAAConfig.cookieName).version !== UWAAConfig.cookieVersion) {
                $cookies.remove(UWAAConfig.cookieName, { path: "/" });
            }
        }
        function _resetModels() {
            var newVM = UWAAViewModel.getViewModel(), clone = angular.copy(cachedServerModel);
            newVM.appLoaded = true;
            newVM.serverModelLoaded = true;
            vm.dataModel = clone;
            vm.uwaaVM = newVM;
        }
        function _saveState() {
            var cookieObj = {
                version: UWAAConfig.cookieVersion
            };
            _removeOldCookieIfExists();
            cookieObj.uwaaVM = vm.uwaaVM;
            cookieObj.SelectedMembershipOption = vm.dataModel.SelectedMembershipOption;
            cookieObj.IncludePromotionalItem = vm.dataModel.IncludePromotionalItem;
            cookieObj.JoinRenewGift = { SelectedOption: vm.dataModel.JoinRenewGift.SelectedOption };
            cookieObj.IsUpgrade = vm.dataModel.IsUpgrade;
            $cookies.put(UWAAConfig.cookieName, angular.toJson(cookieObj), { path: "/" });
        }
        function _selectedMembershipChange(newVal, oldVal) {
            var $addlOptionElement;
            if (newVal !== oldVal && newVal !== null && !vm.uwaaVM.restoringWithCookieFlag) {
                GetIndexDataService.GetMembershipAmount(newVal.RATE).$promise
                    .then(function (response) {
                    if (parseInt(response.amount, 10) === 0) {
                        membAmountIsZero = true;
                        vm.uwaaVM.hidePaymentInfo = true;
                    }
                    else {
                        membAmountIsZero = false;
                        vm.uwaaVM.hidePaymentInfo = false;
                    }
                })
                    .catch(function (err) {
                    vm.uwaaVM.mainError = "There was an error loading the application. Please refresh the page and try again. If the issue persists, please email advsti@uw.edu.";
                });
                vm.dataModel["Include" + newVal.AdditionalMembershipOption] = null;
                if (newVal.AdditionalMembershipOption !== null) {
                    if ((newVal.AdditionalMembershipOption === "PromotionalItem" && vm.dataModel.JoinRenewGift.SelectedOption === "Join")
                        || newVal.AdditionalMembershipOption !== "PromotionalItem") {
                        $addlOptionElement = $(".additional-membership-option-" + newVal.AdditionalMembershipOption);
                        $(".additional-membership-option-more-info-link").next().hide();
                        $addlOptionElement.modal({
                            backdrop: 'static',
                            keyboard: false
                        });
                    }
                }
            }
        }
        function _setSelectedMembershipOptionObjectByRateCode(rateCode) {
            return $filter('filter')(vm.dataModel[vm.uwaaVM.membershipType + 'VM'].MembershipOptions, { RATE: rateCode })[0];
        }
        function _setRequiredLabels() {
            $("label[for='MemberName_FIRST_NAME'] .required-star").show();
            $("label[for='MemberName_LAST_NAME'] .required-star").show();
            $("label[for='BillingName_FIRST_NAME'] .required-star").show();
            $("label[for='BillingName_LAST_NAME'] .required-star").show();
            $("label[for='JointMemberName_FIRST_NAME'] .required-star").show();
            $("label[for='JointMemberName_LAST_NAME'] .required-star").show();
        }
    }
    ;
})();
//# sourceMappingURL=uwaa.controller.js.map
