/* Minification failed. Returning unminified contents.
(5339,70-71): run-time error JS1010: Expected identifier: .
(5339,70-71): run-time error JS1195: Expected expression: .
 */
/* 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 */
/* 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 */
/*
** Unobtrusive Ajax support library for jQuery
** Copyright (C) Microsoft Corporation. All rights reserved.
*/
(function(a){var b="unobtrusiveAjaxClick",d="unobtrusiveAjaxClickTarget",h="unobtrusiveValidation";function c(d,b){var a=window,c=(d||"").split(".");while(a&&c.length)a=a[c.shift()];if(typeof a==="function")return a;b.push(d);return Function.constructor.apply(null,b)}function e(a){return a==="GET"||a==="POST"}function g(b,a){!e(a)&&b.setRequestHeader("X-HTTP-Method-Override",a)}function i(c,b,e){var d;if(e.indexOf("application/x-javascript")!==-1)return;d=(c.getAttribute("data-ajax-mode")||"").toUpperCase();a(c.getAttribute("data-ajax-update")).each(function(e,c){switch(d){case"BEFORE":a(c).prepend(b);break;case"AFTER":a(c).append(b);break;case"REPLACE-WITH":a(c).replaceWith(b);break;default:a(c).html(b)}})}function f(b,d){var j,k,f,h;j=b.getAttribute("data-ajax-confirm");if(j&&!window.confirm(j))return;k=a(b.getAttribute("data-ajax-loading"));h=parseInt(b.getAttribute("data-ajax-loading-duration"),10)||0;a.extend(d,{type:b.getAttribute("data-ajax-method")||undefined,url:b.getAttribute("data-ajax-url")||undefined,cache:!!b.getAttribute("data-ajax-cache"),beforeSend:function(d){var a;g(d,f);a=c(b.getAttribute("data-ajax-begin"),["xhr"]).apply(b,arguments);a!==false&&k.show(h);return a},complete:function(){k.hide(h);c(b.getAttribute("data-ajax-complete"),["xhr","status"]).apply(b,arguments)},success:function(a,e,d){i(b,a,d.getResponseHeader("Content-Type")||"text/html");c(b.getAttribute("data-ajax-success"),["data","status","xhr"]).apply(b,arguments)},error:function(){c(b.getAttribute("data-ajax-failure"),["xhr","status","error"]).apply(b,arguments)}});d.data.push({name:"X-Requested-With",value:"XMLHttpRequest"});f=d.type.toUpperCase();if(!e(f)){d.type="POST";d.data.push({name:"X-HTTP-Method-Override",value:f})}a.ajax(d)}function j(c){var b=a(c).data(h);return!b||!b.validate||b.validate()}a(document).on("click","a[data-ajax=true]",function(a){a.preventDefault();f(this,{url:this.href,type:"GET",data:[]})});a(document).on("click","form[data-ajax=true] input[type=image]",function(c){var g=c.target.name,e=a(c.target),f=a(e.parents("form")[0]),d=e.offset();f.data(b,[{name:g+".x",value:Math.round(c.pageX-d.left)},{name:g+".y",value:Math.round(c.pageY-d.top)}]);setTimeout(function(){f.removeData(b)},0)});a(document).on("click","form[data-ajax=true] :submit",function(e){var g=e.currentTarget.name,f=a(e.target),c=a(f.parents("form")[0]);c.data(b,g?[{name:g,value:e.currentTarget.value}]:[]);c.data(d,f);setTimeout(function(){c.removeData(b);c.removeData(d)},0)});a(document).on("submit","form[data-ajax=true]",function(h){var e=a(this).data(b)||[],c=a(this).data(d),g=c&&c.hasClass("cancel");h.preventDefault();if(!g&&!j(this))return;f(this,{url:this.action,type:this.method||"GET",data:e.concat(a(this).serializeArray())})})})(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 */
/* 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 */
/*
** Unobtrusive validation support library for jQuery and jQuery Validate
** Copyright (C) Microsoft Corporation. All rights reserved.
*/
(function(a){var d=a.validator,b,e="unobtrusiveValidation";function c(a,b,c){a.rules[b]=c;if(a.message)a.messages[b]=a.message}function j(a){return a.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/g)}function f(a){return a.replace(/([!"#$%&'()*+,./:;<=>?@\[\\\]^`{|}~])/g,"\\$1")}function h(a){return a.substr(0,a.lastIndexOf(".")+1)}function g(a,b){if(a.indexOf("*.")===0)a=a.replace("*.",b);return a}function m(c,e){var b=a(this).find("[data-valmsg-for='"+f(e[0].name)+"']"),d=b.attr("data-valmsg-replace"),g=d?a.parseJSON(d)!==false:null;b.removeClass("field-validation-valid").addClass("field-validation-error");c.data("unobtrusiveContainer",b);if(g){b.empty();c.removeClass("input-validation-error").appendTo(b)}else c.hide()}function l(e,d){var c=a(this).find("[data-valmsg-summary=true]"),b=c.find("ul");if(b&&b.length&&d.errorList.length){b.empty();c.addClass("validation-summary-errors").removeClass("validation-summary-valid");a.each(d.errorList,function(){a("<li />").html(this.message).appendTo(b)})}}function k(d){var b=d.data("unobtrusiveContainer"),c=b.attr("data-valmsg-replace"),e=c?a.parseJSON(c):null;if(b){b.addClass("field-validation-valid").removeClass("field-validation-error");d.removeData("unobtrusiveContainer");e&&b.empty()}}function n(){var b=a(this),c="__jquery_unobtrusive_validation_form_reset";if(b.data(c))return;b.data(c,true);try{b.data("validator").resetForm()}finally{b.removeData(c)}b.find(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors");b.find(".field-validation-error").addClass("field-validation-valid").removeClass("field-validation-error").removeData("unobtrusiveContainer").find(">*").removeData("unobtrusiveContainer")}function i(b){var c=a(b),f=c.data(e),i=a.proxy(n,b),g=d.unobtrusive.options||{},h=function(e,d){var c=g[e];c&&a.isFunction(c)&&c.apply(b,d)};if(!f){f={options:{errorClass:g.errorClass||"input-validation-error",errorElement:g.errorElement||"span",errorPlacement:function(){m.apply(b,arguments);h("errorPlacement",arguments)},invalidHandler:function(){l.apply(b,arguments);h("invalidHandler",arguments)},messages:{},rules:{},success:function(){k.apply(b,arguments);h("success",arguments)}},attachValidation:function(){c.off("reset."+e,i).on("reset."+e,i).validate(this.options)},validate:function(){c.validate();return c.valid()}};c.data(e,f)}return f}d.unobtrusive={adapters:[],parseElement:function(b,h){var d=a(b),f=d.parents("form")[0],c,e,g;if(!f)return;c=i(f);c.options.rules[b.name]=e={};c.options.messages[b.name]=g={};a.each(this.adapters,function(){var c="data-val-"+this.name,i=d.attr(c),h={};if(i!==undefined){c+="-";a.each(this.params,function(){h[this]=d.attr(c+this)});this.adapt({element:b,form:f,message:i,params:h,rules:e,messages:g})}});a.extend(e,{__dummy__:true});!h&&c.attachValidation()},parse:function(c){var b=a(c),e=b.parents().addBack().filter("form").add(b.find("form")).has("[data-val=true]");b.find("[data-val=true]").each(function(){d.unobtrusive.parseElement(this,true)});e.each(function(){var a=i(this);a&&a.attachValidation()})}};b=d.unobtrusive.adapters;b.add=function(c,a,b){if(!b){b=a;a=[]}this.push({name:c,params:a,adapt:b});return this};b.addBool=function(a,b){return this.add(a,function(d){c(d,b||a,true)})};b.addMinMax=function(e,g,f,a,d,b){return this.add(e,[d||"min",b||"max"],function(b){var e=b.params.min,d=b.params.max;if(e&&d)c(b,a,[e,d]);else if(e)c(b,g,e);else d&&c(b,f,d)})};b.addSingleVal=function(a,b,d){return this.add(a,[b||"val"],function(e){c(e,d||a,e.params[b])})};d.addMethod("__dummy__",function(){return true});d.addMethod("regex",function(b,c,d){var a;if(this.optional(c))return true;a=(new RegExp(d)).exec(b);return a&&a.index===0&&a[0].length===b.length});d.addMethod("nonalphamin",function(c,d,b){var a;if(b){a=c.match(/\W/g);a=a&&a.length>=b}return a});if(d.methods.extension){b.addSingleVal("accept","mimtype");b.addSingleVal("extension","extension")}else b.addSingleVal("extension","extension","accept");b.addSingleVal("regex","pattern");b.addBool("creditcard").addBool("date").addBool("digits").addBool("email").addBool("number").addBool("url");b.addMinMax("length","minlength","maxlength","rangelength").addMinMax("range","min","max","range");b.addMinMax("minlength","minlength").addMinMax("maxlength","minlength","maxlength");b.add("equalto",["other"],function(b){var i=h(b.element.name),j=b.params.other,d=g(j,i),e=a(b.form).find(":input").filter("[name='"+f(d)+"']")[0];c(b,"equalTo",e)});b.add("required",function(a){(a.element.tagName.toUpperCase()!=="INPUT"||a.element.type.toUpperCase()!=="CHECKBOX")&&c(a,"required",true)});b.add("remote",["url","type","additionalfields"],function(b){var d={url:b.params.url,type:b.params.type||"GET",data:{}},e=h(b.element.name);a.each(j(b.params.additionalfields||b.element.name),function(i,h){var c=g(h,e);d.data[c]=function(){var d=a(b.form).find(":input").filter("[name='"+f(c)+"']");return d.is(":checkbox")?d.filter(":checked").val()||d.filter(":hidden").val()||"":d.is(":radio")?d.filter(":checked").val()||"":d.val()}});c(b,"remote",d)});b.add("password",["min","nonalphamin","regex"],function(a){a.params.min&&c(a,"minlength",a.params.min);a.params.nonalphamin&&c(a,"nonalphamin",a.params.nonalphamin);a.params.regex&&c(a,"regex",a.params.regex)});a(function(){d.unobtrusive.parse(document)})})(jQuery);;
/*! jQuery Validation Plugin - v1.16.0 - 12/2/2016
 * http://jqueryvalidation.org/
 * Copyright (c) 2016 Jörn Zaefferer; Licensed MIT */
!function(a){"function"==typeof define&&define.amd?define(["jquery","./jquery.validate.min"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(jQuery)}(function(a){return function(){function b(a){return a.replace(/<.[^<>]*?>/g," ").replace(/&nbsp;|&#160;/gi," ").replace(/[.(),;:!?%#$'\"_+=\/\-“”’]*/g,"")}a.validator.addMethod("maxWords",function(a,c,d){return this.optional(c)||b(a).match(/\b\w+\b/g).length<=d},a.validator.format("Please enter {0} words or less.")),a.validator.addMethod("minWords",function(a,c,d){return this.optional(c)||b(a).match(/\b\w+\b/g).length>=d},a.validator.format("Please enter at least {0} words.")),a.validator.addMethod("rangeWords",function(a,c,d){var e=b(a),f=/\b\w+\b/g;return this.optional(c)||e.match(f).length>=d[0]&&e.match(f).length<=d[1]},a.validator.format("Please enter between {0} and {1} words."))}(),a.validator.addMethod("accept",function(b,c,d){var e,f,g,h="string"==typeof d?d.replace(/\s/g,""):"image/*",i=this.optional(c);if(i)return i;if("file"===a(c).attr("type")&&(h=h.replace(/[\-\[\]\/\{\}\(\)\+\?\.\\\^\$\|]/g,"\\$&").replace(/,/g,"|").replace(/\/\*/g,"/.*"),c.files&&c.files.length))for(g=new RegExp(".?("+h+")$","i"),e=0;e<c.files.length;e++)if(f=c.files[e],!f.type.match(g))return!1;return!0},a.validator.format("Please enter a value with a valid mimetype.")),a.validator.addMethod("alphanumeric",function(a,b){return this.optional(b)||/^\w+$/i.test(a)},"Letters, numbers, and underscores only please"),a.validator.addMethod("bankaccountNL",function(a,b){if(this.optional(b))return!0;if(!/^[0-9]{9}|([0-9]{2} ){3}[0-9]{3}$/.test(a))return!1;var c,d,e,f=a.replace(/ /g,""),g=0,h=f.length;for(c=0;c<h;c++)d=h-c,e=f.substring(c,c+1),g+=d*e;return g%11===0},"Please specify a valid bank account number"),a.validator.addMethod("bankorgiroaccountNL",function(b,c){return this.optional(c)||a.validator.methods.bankaccountNL.call(this,b,c)||a.validator.methods.giroaccountNL.call(this,b,c)},"Please specify a valid bank or giro account number"),a.validator.addMethod("bic",function(a,b){return this.optional(b)||/^([A-Z]{6}[A-Z2-9][A-NP-Z1-9])(X{3}|[A-WY-Z0-9][A-Z0-9]{2})?$/.test(a.toUpperCase())},"Please specify a valid BIC code"),a.validator.addMethod("cifES",function(a){"use strict";function b(a){return a%2===0}var c,d,e,f,g=new RegExp(/^([ABCDEFGHJKLMNPQRSUVW])(\d{7})([0-9A-J])$/gi),h=a.substring(0,1),i=a.substring(1,8),j=a.substring(8,9),k=0,l=0,m=0;if(9!==a.length||!g.test(a))return!1;for(c=0;c<i.length;c++)d=parseInt(i[c],10),b(c)?(d*=2,m+=d<10?d:d-9):l+=d;return k=l+m,e=(10-k.toString().substr(-1)).toString(),e=parseInt(e,10)>9?"0":e,f="JABCDEFGHI".substr(e,1).toString(),h.match(/[ABEH]/)?j===e:h.match(/[KPQS]/)?j===f:j===e||j===f},"Please specify a valid CIF number."),a.validator.addMethod("cpfBR",function(a){if(a=a.replace(/([~!@#$%^&*()_+=`{}\[\]\-|\\:;'<>,.\/? ])+/g,""),11!==a.length)return!1;var b,c,d,e,f=0;if(b=parseInt(a.substring(9,10),10),c=parseInt(a.substring(10,11),10),d=function(a,b){var c=10*a%11;return 10!==c&&11!==c||(c=0),c===b},""===a||"00000000000"===a||"11111111111"===a||"22222222222"===a||"33333333333"===a||"44444444444"===a||"55555555555"===a||"66666666666"===a||"77777777777"===a||"88888888888"===a||"99999999999"===a)return!1;for(e=1;e<=9;e++)f+=parseInt(a.substring(e-1,e),10)*(11-e);if(d(f,b)){for(f=0,e=1;e<=10;e++)f+=parseInt(a.substring(e-1,e),10)*(12-e);return d(f,c)}return!1},"Please specify a valid CPF number"),a.validator.addMethod("creditcard",function(a,b){if(this.optional(b))return"dependency-mismatch";if(/[^0-9 \-]+/.test(a))return!1;var c,d,e=0,f=0,g=!1;if(a=a.replace(/\D/g,""),a.length<13||a.length>19)return!1;for(c=a.length-1;c>=0;c--)d=a.charAt(c),f=parseInt(d,10),g&&(f*=2)>9&&(f-=9),e+=f,g=!g;return e%10===0},"Please enter a valid credit card number."),a.validator.addMethod("creditcardtypes",function(a,b,c){if(/[^0-9\-]+/.test(a))return!1;a=a.replace(/\D/g,"");var d=0;return c.mastercard&&(d|=1),c.visa&&(d|=2),c.amex&&(d|=4),c.dinersclub&&(d|=8),c.enroute&&(d|=16),c.discover&&(d|=32),c.jcb&&(d|=64),c.unknown&&(d|=128),c.all&&(d=255),1&d&&/^(5[12345])/.test(a)?16===a.length:2&d&&/^(4)/.test(a)?16===a.length:4&d&&/^(3[47])/.test(a)?15===a.length:8&d&&/^(3(0[012345]|[68]))/.test(a)?14===a.length:16&d&&/^(2(014|149))/.test(a)?15===a.length:32&d&&/^(6011)/.test(a)?16===a.length:64&d&&/^(3)/.test(a)?16===a.length:64&d&&/^(2131|1800)/.test(a)?15===a.length:!!(128&d)},"Please enter a valid credit card number."),a.validator.addMethod("currency",function(a,b,c){var d,e="string"==typeof c,f=e?c:c[0],g=!!e||c[1];return f=f.replace(/,/g,""),f=g?f+"]":f+"]?",d="^["+f+"([1-9]{1}[0-9]{0,2}(\\,[0-9]{3})*(\\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\\.[0-9]{0,2})?|0(\\.[0-9]{0,2})?|(\\.[0-9]{1,2})?)$",d=new RegExp(d),this.optional(b)||d.test(a)},"Please specify a valid currency"),a.validator.addMethod("dateFA",function(a,b){return this.optional(b)||/^[1-4]\d{3}\/((0?[1-6]\/((3[0-1])|([1-2][0-9])|(0?[1-9])))|((1[0-2]|(0?[7-9]))\/(30|([1-2][0-9])|(0?[1-9]))))$/.test(a)},a.validator.messages.date),a.validator.addMethod("dateITA",function(a,b){var c,d,e,f,g,h=!1,i=/^\d{1,2}\/\d{1,2}\/\d{4}$/;return i.test(a)?(c=a.split("/"),d=parseInt(c[0],10),e=parseInt(c[1],10),f=parseInt(c[2],10),g=new Date(Date.UTC(f,e-1,d,12,0,0,0)),h=g.getUTCFullYear()===f&&g.getUTCMonth()===e-1&&g.getUTCDate()===d):h=!1,this.optional(b)||h},a.validator.messages.date),a.validator.addMethod("dateNL",function(a,b){return this.optional(b)||/^(0?[1-9]|[12]\d|3[01])[\.\/\-](0?[1-9]|1[012])[\.\/\-]([12]\d)?(\d\d)$/.test(a)},a.validator.messages.date),a.validator.addMethod("extension",function(a,b,c){return c="string"==typeof c?c.replace(/,/g,"|"):"png|jpe?g|gif",this.optional(b)||a.match(new RegExp("\\.("+c+")$","i"))},a.validator.format("Please enter a value with a valid extension.")),a.validator.addMethod("giroaccountNL",function(a,b){return this.optional(b)||/^[0-9]{1,7}$/.test(a)},"Please specify a valid giro account number"),a.validator.addMethod("iban",function(a,b){if(this.optional(b))return!0;var c,d,e,f,g,h,i,j,k,l=a.replace(/ /g,"").toUpperCase(),m="",n=!0,o="",p="",q=5;if(l.length<q)return!1;if(c=l.substring(0,2),h={AL:"\\d{8}[\\dA-Z]{16}",AD:"\\d{8}[\\dA-Z]{12}",AT:"\\d{16}",AZ:"[\\dA-Z]{4}\\d{20}",BE:"\\d{12}",BH:"[A-Z]{4}[\\dA-Z]{14}",BA:"\\d{16}",BR:"\\d{23}[A-Z][\\dA-Z]",BG:"[A-Z]{4}\\d{6}[\\dA-Z]{8}",CR:"\\d{17}",HR:"\\d{17}",CY:"\\d{8}[\\dA-Z]{16}",CZ:"\\d{20}",DK:"\\d{14}",DO:"[A-Z]{4}\\d{20}",EE:"\\d{16}",FO:"\\d{14}",FI:"\\d{14}",FR:"\\d{10}[\\dA-Z]{11}\\d{2}",GE:"[\\dA-Z]{2}\\d{16}",DE:"\\d{18}",GI:"[A-Z]{4}[\\dA-Z]{15}",GR:"\\d{7}[\\dA-Z]{16}",GL:"\\d{14}",GT:"[\\dA-Z]{4}[\\dA-Z]{20}",HU:"\\d{24}",IS:"\\d{22}",IE:"[\\dA-Z]{4}\\d{14}",IL:"\\d{19}",IT:"[A-Z]\\d{10}[\\dA-Z]{12}",KZ:"\\d{3}[\\dA-Z]{13}",KW:"[A-Z]{4}[\\dA-Z]{22}",LV:"[A-Z]{4}[\\dA-Z]{13}",LB:"\\d{4}[\\dA-Z]{20}",LI:"\\d{5}[\\dA-Z]{12}",LT:"\\d{16}",LU:"\\d{3}[\\dA-Z]{13}",MK:"\\d{3}[\\dA-Z]{10}\\d{2}",MT:"[A-Z]{4}\\d{5}[\\dA-Z]{18}",MR:"\\d{23}",MU:"[A-Z]{4}\\d{19}[A-Z]{3}",MC:"\\d{10}[\\dA-Z]{11}\\d{2}",MD:"[\\dA-Z]{2}\\d{18}",ME:"\\d{18}",NL:"[A-Z]{4}\\d{10}",NO:"\\d{11}",PK:"[\\dA-Z]{4}\\d{16}",PS:"[\\dA-Z]{4}\\d{21}",PL:"\\d{24}",PT:"\\d{21}",RO:"[A-Z]{4}[\\dA-Z]{16}",SM:"[A-Z]\\d{10}[\\dA-Z]{12}",SA:"\\d{2}[\\dA-Z]{18}",RS:"\\d{18}",SK:"\\d{20}",SI:"\\d{15}",ES:"\\d{20}",SE:"\\d{20}",CH:"\\d{5}[\\dA-Z]{12}",TN:"\\d{20}",TR:"\\d{5}[\\dA-Z]{17}",AE:"\\d{3}\\d{16}",GB:"[A-Z]{4}\\d{14}",VG:"[\\dA-Z]{4}\\d{16}"},g=h[c],"undefined"!=typeof g&&(i=new RegExp("^[A-Z]{2}\\d{2}"+g+"$",""),!i.test(l)))return!1;for(d=l.substring(4,l.length)+l.substring(0,4),j=0;j<d.length;j++)e=d.charAt(j),"0"!==e&&(n=!1),n||(m+="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".indexOf(e));for(k=0;k<m.length;k++)f=m.charAt(k),p=""+o+f,o=p%97;return 1===o},"Please specify a valid IBAN"),a.validator.addMethod("integer",function(a,b){return this.optional(b)||/^-?\d+$/.test(a)},"A positive or negative non-decimal number please"),a.validator.addMethod("ipv4",function(a,b){return this.optional(b)||/^(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)\.(25[0-5]|2[0-4]\d|[01]?\d\d?)$/i.test(a)},"Please enter a valid IP v4 address."),a.validator.addMethod("ipv6",function(a,b){return this.optional(b)||/^((([0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}:[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){5}:([0-9A-Fa-f]{1,4}:)?[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){4}:([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){3}:([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){2}:([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){6}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(([0-9A-Fa-f]{1,4}:){0,5}:((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|(::([0-9A-Fa-f]{1,4}:){0,5}((\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b)\.){3}(\b((25[0-5])|(1\d{2})|(2[0-4]\d)|(\d{1,2}))\b))|([0-9A-Fa-f]{1,4}::([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})|(::([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})|(([0-9A-Fa-f]{1,4}:){1,7}:))$/i.test(a)},"Please enter a valid IP v6 address."),a.validator.addMethod("lettersonly",function(a,b){return this.optional(b)||/^[a-z]+$/i.test(a)},"Letters only please"),a.validator.addMethod("letterswithbasicpunc",function(a,b){return this.optional(b)||/^[a-z\-.,()'"\s]+$/i.test(a)},"Letters or punctuation only please"),a.validator.addMethod("mobileNL",function(a,b){return this.optional(b)||/^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)6((\s|\s?\-\s?)?[0-9]){8}$/.test(a)},"Please specify a valid mobile number"),a.validator.addMethod("mobileUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?|0)7(?:[1345789]\d{2}|624)\s?\d{3}\s?\d{3})$/)},"Please specify a valid mobile number"),a.validator.addMethod("nieES",function(a){"use strict";var b,c=new RegExp(/^[MXYZ]{1}[0-9]{7,8}[TRWAGMYFPDXBNJZSQVHLCKET]{1}$/gi),d="TRWAGMYFPDXBNJZSQVHLCKET",e=a.substr(a.length-1).toUpperCase();return a=a.toString().toUpperCase(),!(a.length>10||a.length<9||!c.test(a))&&(a=a.replace(/^[X]/,"0").replace(/^[Y]/,"1").replace(/^[Z]/,"2"),b=9===a.length?a.substr(0,8):a.substr(0,9),d.charAt(parseInt(b,10)%23)===e)},"Please specify a valid NIE number."),a.validator.addMethod("nifES",function(a){"use strict";return a=a.toUpperCase(),!!a.match("((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)")&&(/^[0-9]{8}[A-Z]{1}$/.test(a)?"TRWAGMYFPDXBNJZSQVHLCKE".charAt(a.substring(8,0)%23)===a.charAt(8):!!/^[KLM]{1}/.test(a)&&a[8]===String.fromCharCode(64))},"Please specify a valid NIF number."),a.validator.addMethod("notEqualTo",function(b,c,d){return this.optional(c)||!a.validator.methods.equalTo.call(this,b,c,d)},"Please enter a different value, values must not be the same."),a.validator.addMethod("nowhitespace",function(a,b){return this.optional(b)||/^\S+$/i.test(a)},"No white space please"),a.validator.addMethod("pattern",function(a,b,c){return!!this.optional(b)||("string"==typeof c&&(c=new RegExp("^(?:"+c+")$")),c.test(a))},"Invalid format."),a.validator.addMethod("phoneNL",function(a,b){return this.optional(b)||/^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)[1-9]((\s|\s?\-\s?)?[0-9]){8}$/.test(a)},"Please specify a valid phone number."),a.validator.addMethod("phonesUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?|0)(?:1\d{8,9}|[23]\d{9}|7(?:[1345789]\d{8}|624\d{6})))$/)},"Please specify a valid uk phone number"),a.validator.addMethod("phoneUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?)|(?:\(?0))(?:\d{2}\)?\s?\d{4}\s?\d{4}|\d{3}\)?\s?\d{3}\s?\d{3,4}|\d{4}\)?\s?(?:\d{5}|\d{3}\s?\d{3})|\d{5}\)?\s?\d{4,5})$/)},"Please specify a valid phone number"),a.validator.addMethod("phoneUS",function(a,b){return a=a.replace(/\s+/g,""),this.optional(b)||a.length>9&&a.match(/^(\+?1-?)?(\([2-9]([02-9]\d|1[02-9])\)|[2-9]([02-9]\d|1[02-9]))-?[2-9]([02-9]\d|1[02-9])-?\d{4}$/)},"Please specify a valid phone number"),a.validator.addMethod("postalcodeBR",function(a,b){return this.optional(b)||/^\d{2}.\d{3}-\d{3}?$|^\d{5}-?\d{3}?$/.test(a)},"Informe um CEP válido."),a.validator.addMethod("postalCodeCA",function(a,b){return this.optional(b)||/^[ABCEGHJKLMNPRSTVXY]\d[ABCEGHJKLMNPRSTVWXYZ] *\d[ABCEGHJKLMNPRSTVWXYZ]\d$/i.test(a)},"Please specify a valid postal code"),a.validator.addMethod("postalcodeIT",function(a,b){return this.optional(b)||/^\d{5}$/.test(a)},"Please specify a valid postal code"),a.validator.addMethod("postalcodeNL",function(a,b){return this.optional(b)||/^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/.test(a)},"Please specify a valid postal code"),a.validator.addMethod("postcodeUK",function(a,b){return this.optional(b)||/^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))\s?([0-9][ABD-HJLNP-UW-Z]{2})|(GIR)\s?(0AA))$/i.test(a)},"Please specify a valid UK postcode"),a.validator.addMethod("require_from_group",function(b,c,d){var e=a(d[1],c.form),f=e.eq(0),g=f.data("valid_req_grp")?f.data("valid_req_grp"):a.extend({},this),h=e.filter(function(){return g.elementValue(this)}).length>=d[0];return f.data("valid_req_grp",g),a(c).data("being_validated")||(e.data("being_validated",!0),e.each(function(){g.element(this)}),e.data("being_validated",!1)),h},a.validator.format("Please fill at least {0} of these fields.")),a.validator.addMethod("skip_or_fill_minimum",function(b,c,d){var e=a(d[1],c.form),f=e.eq(0),g=f.data("valid_skip")?f.data("valid_skip"):a.extend({},this),h=e.filter(function(){return g.elementValue(this)}).length,i=0===h||h>=d[0];return f.data("valid_skip",g),a(c).data("being_validated")||(e.data("being_validated",!0),e.each(function(){g.element(this)}),e.data("being_validated",!1)),i},a.validator.format("Please either skip these fields or fill at least {0} of them.")),a.validator.addMethod("stateUS",function(a,b,c){var d,e="undefined"==typeof c,f=!e&&"undefined"!=typeof c.caseSensitive&&c.caseSensitive,g=!e&&"undefined"!=typeof c.includeTerritories&&c.includeTerritories,h=!e&&"undefined"!=typeof c.includeMilitary&&c.includeMilitary;return d=g||h?g&&h?"^(A[AEKLPRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$":g?"^(A[KLRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$":"^(A[AEKLPRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$":"^(A[KLRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$",d=f?new RegExp(d):new RegExp(d,"i"),this.optional(b)||d.test(a)},"Please specify a valid state"),a.validator.addMethod("strippedminlength",function(b,c,d){return a(b).text().length>=d},a.validator.format("Please enter at least {0} characters")),a.validator.addMethod("time",function(a,b){return this.optional(b)||/^([01]\d|2[0-3]|[0-9])(:[0-5]\d){1,2}$/.test(a)},"Please enter a valid time, between 00:00 and 23:59"),a.validator.addMethod("time12h",function(a,b){return this.optional(b)||/^((0?[1-9]|1[012])(:[0-5]\d){1,2}(\ ?[AP]M))$/i.test(a)},"Please enter a valid time in 12-hour am/pm format"),a.validator.addMethod("url2",function(a,b){return this.optional(b)||/^(https?|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(a)},a.validator.messages.url),a.validator.addMethod("vinUS",function(a){if(17!==a.length)return!1;var b,c,d,e,f,g,h=["A","B","C","D","E","F","G","H","J","K","L","M","N","P","R","S","T","U","V","W","X","Y","Z"],i=[1,2,3,4,5,6,7,8,1,2,3,4,5,7,9,2,3,4,5,6,7,8,9],j=[8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2],k=0;for(b=0;b<17;b++){if(e=j[b],d=a.slice(b,b+1),8===b&&(g=d),isNaN(d)){for(c=0;c<h.length;c++)if(d.toUpperCase()===h[c]){d=i[c],d*=e,isNaN(g)&&8===c&&(g=h[c]);break}}else d*=e;k+=d}return f=k%11,10===f&&(f="X"),f===g},"The specified vehicle identification number (VIN) is invalid."),a.validator.addMethod("zipcodeUS",function(a,b){return this.optional(b)||/^\d{5}(-\d{4})?$/.test(a)},"The specified US ZIP Code is invalid"),a.validator.addMethod("ziprange",function(a,b){return this.optional(b)||/^90[2-5]\d\{2\}-\d{4}$/.test(a)},"Your ZIP-code must be in the range 902xx-xxxx to 905xx-xxxx"),a});;
$.validator.setDefaults({
    ignore: ""
});

jQuery.extend(jQuery.validator.methods, {
    date: function (value, element) {
        return this.optional(element) || kendo.parseDate(value) != null;
    },
    number: function (value, element) {
        return this.optional(element) || kendo.parseFloat(value) != null;
    }
});
;
/**
 * jQuery Guid v1.0.0-1
 * Requires jQuery 1.2.6+ (Not tested with earlier versions).
 * Copyright (c) 2010 Aaron E. [jquery at happinessinmycheeks dot com] 
 * Licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 *	Usage:
 *		jQuery.Guid.Value() // Returns value of internal Guid. If no guid has been specified, returns a new one (value is then stored internally).
 *		jQuery.Guid.New() // Returns a new Guid and sets it's value internally. Also accepts GUID, Sets it internally.
 *		jQuery.Guid.Empty() // Returns an empty Guid 00000000-0000-0000-0000-000000000000.
 *		jQuery.Guid.IsEmpty() // Returns boolean. True if empty/undefined/blank/null.
 *		jQuery.Guid.IsValid() // Returns boolean. True valid guid, false if not.
 *		jQuery.Guid.Set() // Retrns Guid. Sets Guid to user specified Guid, if invalid, returns an empty guid.
 *
 */

jQuery.extend({
    Guid: {
        Set: function (val) {
            var value;
            if (arguments.length == 1) {
                if (this.IsValid(arguments[0])) {
                    value = arguments[0];
                } else {
                    value = this.Empty();
                }
            }
            $(this).data("value", value);
            return value;
        },

        Empty: function () {
            return "00000000-0000-0000-0000-000000000000";
        },

        IsEmpty: function (gid) {
            return gid == this.Empty() || typeof (gid) == 'undefined' || gid == null || gid == '';
        },

        IsValid: function (value) {
            rGx = new RegExp("\\b(?:[A-F0-9]{8})(?:-[A-F0-9]{4}){3}-(?:[A-F0-9]{12})\\b");
            return rGx.exec(value) != null;
        },

        New: function () {
            if (arguments.length == 1 && this.IsValid(arguments[0])) {
                $(this).data("value", arguments[0]);
                value = arguments[0];
                return value;
            }

            var res = [], hv;
            var rgx = new RegExp("[2345]");
            for (var i = 0; i < 8; i++) {
                hv = (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
                if (rgx.exec(i.toString()) != null) {
                    if (i == 3) { hv = "6" + hv.substr(1, 3); }
                    res.push("-");
                }
                res.push(hv.toUpperCase());
            }
            value = res.join('');
            $(this).data("value", value);
            return value;
        },

        Value: function () {
            if ($(this).data("value")) {
                return $(this).data("value");
            }
            var val = this.New();
            $(this).data("value", val);
            return val;
        }
    }
})();;
/**
 * GETs or SETs form parameters to/from Object.
 * Based on: http://javascriptmvc.com/docs.html#!jQuery.fn.formParams
 * @author Tom
 *
 * GET:
 *  @param {boolean} convert   if true - strings that represent numbers and booleans will be converted and empty
 *                             string will not be added to the object.
 *  @return {object}           object representing form fields with values
 *
 * SET:
 *  @param {object} params     object of names with values to apply to the form
 *  @param {boolean} clear     if true - fields which values are undefined (in the passed object) will be cleared
 *  @return {object}           jQuery object representing the form (for chaining)
 *
 * @example
 *  <form>
 *    <input name="foo[bar]" value='2'/>
 *    <input name="foo[ced]" value='4'/>
 *  <form/>
 *
 * $('form').formParams() //-> { foo:{bar:'2', ced: '4'} }
 */

(function ($) {
    'use strict';

    var keyBreaker = /[^\[\]]+/g,
		numberMatcher = /^[\-+]?[0-9]*\.?[0-9]+([eE][\-+]?[0-9]+)?$/,
		isNumber = function (value) {
		    if (typeof value === 'number') return true;
		    if (typeof value !== 'string') return false;
		    return value.match(numberMatcher);
		},
		decodeEntities = function (str) {
		    var d = document.createElement('div');
		    d.innerHTML = str;
		    return d.innerText || d.textContent;
		};


    $.fn.extend({
        formParams: function (params, convert) {
            if (typeof params === 'boolean') { convert = params; params = null; }
            if (params) return this.setParams(params, convert);												// SET
            else if (this[0].nodeName === 'FORM' && this[0].elements) {										// GET
                return jQuery(jQuery.makeArray(this[0].elements)).getParams(convert);
            }
        },


        setParams: function (params, clear) {
            /*jshint eqeqeq: false*/

            // Find all the inputs
            this.find('[name]').each(function () {
                var name = $(this).attr('name'),
					value = params[name],
					names, i, n, v, el;

                // if name is object, e.g. user[name], userData[address][street], update value to read this correctly
                if (name.indexOf('[') > -1) {
                    names = name.replace(/\]/g, '').split('[');
                    n = null;
                    v = params;
                    for (i = 0; n = names[i++];) {
                        if (v[n]) v = v[n];
                        else { v = undefined; break; }
                    }
                    value = v;
                }

                // if clear==true and no value = clear field, otherwise - leave it as it was
                if (clear !== true && value === undefined) return;

                // if no value - clear field
                if (value === null || value === undefined) value = '';

                // decode html special chars (entities)
                if (typeof value === 'string' && value.indexOf('&') > -1) value = decodeEntities(value);

                if (this.type === 'radio') this.checked = (this.value == value);
                else if (this.type === 'checkbox') this.checked = value;
                else {
                    // normal browser
                    if ('placeholder' in document.createElement('input')) this.value = value;
                    else {
                        // manually handle placeholders for specIEl browser
                        el = $(this);
                        if (this.value != value && value !== '') el.data('changed', true);
                        if (value === '') el.data('changed', false).val(el.attr('placeholder'));
                        else this.value = value;
                    }
                }
            });
            return this;
        },


        getParams: function (convert) {
            var data = {}, current, i;
            convert = (convert === undefined ? false : convert);

            this.each(function () {
                var el = this,
					$el = $(el),
					type = el.type && el.type.toLowerCase(),
					key, value, parts, lastPart, tv, cmp;

                // if we are submit or disabled - ignore
                if ((type === 'submit') || !el.name || el.disabled) return;

                key = el.name;
                value = $.data(el, 'value') || $.fn.val.call([el]);
                parts = key.match(keyBreaker);

                // return only "checked" radio value
                if (el.type === 'radio' && !el.checked) return;

                // convert chekbox to [true | false]
                if (el.type === 'checkbox') value = el.checked;


                // clear placeholder valus for IEs
                if ($el.data('changed') !== true && value === $el.attr('placeholder')) value = '';

                if (convert) {
                    if (isNumber(value)) {
                        tv = parseFloat(value);
                        cmp = tv + '';

                        // convert (string)100.00 to (int)100
                        if (value.indexOf('.') > 0) cmp = tv.toFixed(value.split('.')[1].length);
                        if (cmp === value) value = tv;
                    }
                    else if (value === 'true') value = true;
                    else if (value === 'false') value = false;
                    if (value === '') value = null;
                }

                current = data;
                // go through and create nested objects
                for (i = 0; i < parts.length - 1; i++) {
                    if (!current[parts[i]]) current[parts[i]] = {};
                    current = current[parts[i]];
                }
                lastPart = parts[parts.length - 1];

                // now we are on the last part, set the value
                if (current[lastPart]) {
                    if (!$.isArray(current[lastPart])) {
                        current[lastPart] = current[lastPart] === undefined ? [] : [current[lastPart]];
                    }
                    current[lastPart].push(value);
                }
                else if (!current[lastPart]) current[lastPart] = value;
            });
            return data;
        }
    });
})(jQuery);;
function pantherAjax(options) {
    
    var defaultRetryLimit = 3;
    if (!options.retryLimit) {
        options.retryLimit = defaultRetryLimit;
    }

    var defaultTimeout = 5000;
    if (location.hostname === "localhost" || location.hostname === "127.0.0.1") {
        defaultTimeout = 50000;
    }
    if (!options.timeout)
    {
        options.timeout = defaultTimeout;
    }

    options.timeout = options.timeout + Math.max((defaultRetryLimit - options.retryLimit), 0) * 2000;//backoff
 
    
    if (!options.isOriginalErrorSet) {
        options.originalError = options.error;
        options.isOriginalErrorSet = true;
    }
    options.error = function (jqXHR, textStatus, errorThrown) {
        //textStatus can one of these "timeout", "error", "abort", and "parsererror"
        if (textStatus !== "abort") {
            var log = "Ajax request failed. Reason: " + textStatus + " Error thrown: " + errorThrown + " retries left #: " + options.retryLimit;
            console.log(log);
            //Recall method once again
            if (options.retryLimit > 1) {
                options.retryLimit--;
                pantherAjax(options)
            }
            else {
                var defaultMessage = 'The connection has timed out. Please click "Try Again" to refresh the page, or contact us if this is happening often.';
                if (!navigator.onLine)
                {
                    defaultMessage = 'Your device is not connected to the internet. Please check your internet connection and try again.';
                }
                BootstrapDialog.show({
                    title: 'Connection Timeout',
                    message: defaultMessage,
                    buttons: [
                        {
                            id: 'btn-ok',
                            icon: 'fa fa-repeat',
                            label: "Try Again",
                            cssClass: 'btn blue',
                            action: function (dialogRef) {
                                dialogRef.close();
                                //set the current pantherModalAjaxRequest request
                                pantherModalAjaxRequest = pantherAjax(options);
                                return;
                            }
                        },
                        {
                            id: 'btn-ok',
                            icon: 'fa fa-globe',
                            label: "Test My Connection",
                            cssClass: 'btn btn-default',
                            action: function (dialogRef) {
                                window.open("http://www.speedtest.net", "_blank");
                            }
                        },
                        {
                            id: 'btn-ok',
                            icon: 'fa fa-comments-o',
                            label: "Contact Support",
                            cssClass: 'btn btn-default',
                            action: function (dialogRef) {
                                javascript: window.Intercom('showNewMessage');
                            }
                        }

                    ],
                    onhidden: function (result) {
                        try {
                            if (options.originalError) {
                                options.originalError();
                            }
                        }
                        catch (e) {
                            
                        }
                    }
                });
            }
        }
    }

    return $.ajax(options)
};
;
"use strict";

//The purpose of this function is to save form data from Time Entries, Flat Fees, Expenses and Activities and then load it back when visiting the form again
var AutoSaveSetup = function () {
    /**
     * Variables
     */
    var _cookieName = "";
    var _formName = "";
    var _kendoEditorInterval = "";

    /**
     * Helper functions
     */

    /**
     * Gets the form array
     * @returns {any} The form array
     */
    var getFormArray = function () {
        //only serialize non hidden fields but include the hidden fields TimeEntry_Hours and Activity_CallProperties_CallDuration 
        return $("#" + _formName + " [id]").not("[type = hidden]:not(#TimeEntry_Hours):not(#Activity_CallProperties_CallDuration)").serializeArray();
    };

    /**
     * Gets the name value pair object from the form array in the cookie using the field name
     * @param {any} fieldName The field name
     * @returns {any} The name value pair object
     */
    var getNameValuePairFromFormArrayFromCookie = function (fieldName) {
        return $.grep($.parseJSON($.cookie(_cookieName)), function (n) { return n.name.indexOf(fieldName) > -1; });
    };

    var getFieldValueFromFieldName = function (fieldName) {
        var fieldNameValuePair = $.grep($.parseJSON($.cookie(_cookieName)), function (n) { return n.name.indexOf(fieldName) > -1; });
        if(fieldNameValuePair.length > 0){
            return fieldNameValuePair[0].value;
        } else{
            return null;
        }
    };

    /**
     * Gets the field id by using the field name
     * @param {any} fieldName The field name
     * @returns {any} dafadfasfd
     */
    var getFieldIdFromFieldName = function (fieldName) {
        return fieldName.replaceAll(".", "_").replaceAll("[", "_").replaceAll("]", "_");
    };

    /**
     * Sets the cookie with a json form array
     * @param {any} formArray The array that contains the serialized form elements
     */
    var setCookie = function (formArray) {
        $.cookie(_cookieName, JSON.stringify(formArray), { expires: 1, path: '/', secure: true });
    };

    //Removes the cookie and stops the kendoEditor Interval
    var removeCookie = function () {
        $.removeCookie(_cookieName, { path: '/' });
        if (_kendoEditorInterval) {
            clearInterval(_kendoEditorInterval);
        }
    };

    /**
     * Sets the form name and cookie name
     * @param {any} formName The form name
     * @param {any} formType The form type
     * @param {any} userGuid The user guid
     */
    var setFormNameAndCookieName = function (formName, formType, userGuid) {
        _formName = formName;
        _cookieName = formName + formType + "-serialized" + userGuid;
    };

    //Called after a cookie's contents have been added to the page form in order to re bind the elements
    var setFormElementBindingsToEitherSetCookieOrRemoveCookie = function () {

        if ($("#Activity_Description").data("kendoEditor")) {
            setUpKendoEditorInterval("Activity.Description");
        }
        if ($("#Conversation_Messages_0__Body").data("kendoEditor")) {
            setUpKendoEditorInterval("Conversation.Messages[0].Body");
        }
        $("#" + _formName + " *").filter(":input").each(function () {
            $("#" + this.id).on("change keydown paste switchChange.bootstrapSwitch", function () {
                //i need to wait 500 milliseconds because TimeEntry.Hours gets set after the stopwatch value gets changes but its not instant.
                setTimeout(function () { setCookie(getFormArray()); }, 500);
            });
        });

        $("#" + _formName).closest('.modal').on('hidden.bs.modal', function () {
            removeCookie();
        });
    };

    /**
     * Removes the cookie and sets the bindings
     */
    var removeCookieAndSetBindings = function () {
        removeCookie();
        setFormElementBindingsToEitherSetCookieOrRemoveCookie();
    };

    /**
     *Every 10 seconds check for changes in the kendoeditor and add it to the form array before setting up the cookie     
     * @param {any} fieldName The field name
     */
    var setUpKendoEditorInterval = function (fieldName) {

        var fieldId = getFieldIdFromFieldName(fieldName);

        _kendoEditorInterval = setInterval(function () {
            var formArray = getFormArray();

            var fieldValue = $("#" + fieldId).data("kendoEditor").value();

            //manipulate the form array with the new kendo editor data
            if (fieldName && fieldValue) {
                var foundFieldName = false;
                $.each(formArray, function (index, element) {
                    if (element.name === fieldName) {
                        element.value = fieldValue;
                        foundFieldName = true;
                        return;
                    }
                });
                if (!foundFieldName) {
                    formArray.push({ name: fieldName, value: fieldValue });
                }

                setCookie(formArray);
            }
        }, 10000);
    };

    /**
     * Functions used to set data to the forms from the cookie
     */

    var setDataFromCookieIntoTimeEntryForm = function () {

        var accountPromise = setDropDownListValue("TimeEntry.AccountGuid");

        accountPromise.then(function (result) {
            var projectPromise = setDropDownListValue("TimeEntry.ProjectGuid");

            projectPromise.then(function (result) {

                var productPromise = setDropDownListValue("TimeEntry.ProductGuid");

                productPromise.then(function (result) {

                    setStopwatchValue("TimeEntry.Hours", "TimeEntry_Hours_TimeString");

                    setDate("TimeEntry.Date");

                    setTextArea("TimeEntry.Description");

                    setToggleButtonValue("TimeEntry.IsBillable");

                    var userPromise = setDropDownListValue("TimeEntry.UserGuid");

                    userPromise.then(function (result) {

                        setNumericTextBox("TimeEntry.HourlyRate");

                        setNumericTextBox("TimeEntry.Total");

                        setTextArea("TimeEntry.Notes");

                        removeCookieAndSetBindings();
                    });
                });
            });
        });
    };

    var setDataFromCookieIntoFlatFeeForm = function () {

        var accountPromise = setDropDownListValue("FlatFee.AccountGuid");

        accountPromise.then(function (result) {
            var projectPromise = setDropDownListValue("FlatFee.ProjectGuid");

            projectPromise.then(function (result) {

                var productPromise = setDropDownListValue("FlatFee.ProductGuid");

                productPromise.then(function (result) {

                    setDate("FlatFee.Date");

                    setToggleButtonValue("FlatFee.IsBillable");

                    var userPromise = setDropDownListValue("FlatFee.UserGuid");

                    userPromise.then(function (result) {

                        setNumericTextBox("FlatFee.Price");

                        setNumericTextBox("FlatFee.Total");

                        setNumericTextBox("FlatFee.Qty");

                        setTextArea("FlatFee.Description");

                        setTextArea("FlatFee.Notes");

                        removeCookieAndSetBindings();
                    });
                });
            });
        });
    };

    var setDataFromCookieIntoExpenseForm = function () {

        var accountPromise = setDropDownListValue("Expense.AccountGuid");

        accountPromise.then(function (result) {
            var projectPromise = setDropDownListValue("Expense.ProjectGuid");

            projectPromise.then(function (result) {

                setToggleButtonValue("Expense.IsBillable");

                var userPromise = setDropDownListValue("Expense.UserGuid");

                userPromise.then(function (result) {

                    var costTypePromise = setDropDownListValue("Expense.CostType", true);

                    costTypePromise.then(function (result) {

                        setDate("Expense.Date");

                        setNumericTextBox("Expense.Amount");

                        setNumericTextBox("Expense.TotalAmount");

                        setNumericTextBox("Expense.Qty");

                        setTextArea("Expense.Description");

                        setDropDownListValue("Expense.AccountingAccountGuid");

                        setDropDownListValue("Expense.HardCostPaymentBankAccountGuid");

                        var paymentMethodPromise = setDropDownListValue("Expense.HardCostPaymentMethod", true);

                        paymentMethodPromise.then(function (result) {

                            setTextArea("Expense.HardCostPaymentNotes");

                            setDropDownListValue("Expense.HardCostPaymentCheckPayeeGuid");

                            setToggleButtonValue("Expense.HardCostPaymentCheckIsToPrint");

                            setNumericTextBox("Expense.HardCostPaymentCheckNumber");

                            setTextArea("Expense.Notes");

                            removeCookieAndSetBindings();
                        });

                    });

                });

            });
        });
    };

    var setDataFromCookieIntoEventActivityForm = function () {

        var accountPromise = setDropDownListValue("Activity.AccountGuid");

        accountPromise.then(function (result) {
            var projectPromise = setDropDownListValue("Activity.ProjectGuid");

            projectPromise.then(function (result) {

                setInputValues("Activity.Name");

                //DO NOT REMOVE, need to call setToggleButtonValue("Activity.IsAllDayActivity") twice for StartDateTime and EndDateTime to load correctly, I dont know why
                setToggleButtonValue("Activity.IsAllDayActivity");

                setDateTime("Activity.StartDateTime");

                setDateTime("Activity.EndDateTime");

                //DO NOT REMOVE, need to call setToggleButtonValue("Activity.IsAllDayActivity") twice for StartDateTime and EndDateTime to load correctly, I dont know why
                setToggleButtonValue("Activity.IsAllDayActivity");

                setKendoEditorValue("Activity.Description");

                setToggleButtonValue("Activity.IsPrivate");

                setInputValues("Activity.Location");

                setDropDownListValue("Activity.Priority");

                var recurrenceFrequencyPromise = setDropDownListValue("Activity.Recurrence.Frequency", true);

                recurrenceFrequencyPromise.then(function (result) {

                    setDate("Activity.Recurrence.StopDate");

                    setUpMultiSelectValues("Activity.AssignedToUsersGuids");

                    setUpMultiSelectValues("Activity.AssignedToContactsGuids");

                    setUpMultiSelectValues("Activity.TagNames");

                    setToggleButtonValue("Activity.IsSendNotificationEmail");

                    setCheckBoxValue("isChangeDefaultEmailNotification");

                    removeCookieAndSetBindings();
                });

            });
        });
    };

    var setDataFromCookieIntoTaskActivityForm = function () {

        var accountPromise = setDropDownListValue("Activity.AccountGuid");

        accountPromise.then(function (result) {
            var projectPromise = setDropDownListValue("Activity.ProjectGuid");

            projectPromise.then(function (result) {
                setInputValues("Activity.Name");

                setDateTime("Activity.DueDate");

                setDropDownListValue("Activity.Status");

                setKendoEditorValue("Activity.Description");

                setToggleButtonValue("Activity.IsPrivate");

                setDropDownListValue("Activity.Priority");

                var recurrenceFrequencyPromise = setDropDownListValue("Activity.Recurrence.Frequency", true);

                recurrenceFrequencyPromise.then(function (result) {

                    setDate("Activity.Recurrence.StopDate");

                    setUpMultiSelectValues("Activity.AssignedToUsersGuids");

                    setUpMultiSelectValues("Activity.AssignedToContactsGuids");

                    setUpMultiSelectValues("Activity.TagNames");

                    setToggleButtonValue("Activity.IsSendNotificationEmail");

                    setCheckBoxValue("isChangeDefaultEmailNotification");

                    removeCookieAndSetBindings();
                });

            });

        });

    };

    var setDataFromCookieIntoCallActivityForm = function () {

        var accountPromise = setDropDownListValue("Activity.AccountGuid");

        accountPromise.then(function (result) {
            var projectPromise = setDropDownListValue("Activity.ProjectGuid");

            projectPromise.then(function (result) {

                setInputValues("Activity.Name");

                setDropDownListValue("Activity.CallProperties.CallType", true);

                setDateTime("Activity.CallProperties.CallDateTime");

                setStopwatchValue("Activity.CallProperties.CallDuration", "Activity_CallProperties_CallDuration_TimeString");

                setKendoEditorValue("Activity.Description");

                setToggleButtonValue("Activity.IsPrivate");

                setUpMultiSelectValues("Activity.AssignedToUsersGuids");

                setUpMultiSelectValues("Activity.AssignedToContactsGuids");

                setUpMultiSelectValues("Activity.TagNames");

                removeCookieAndSetBindings();
            });
        });

    };

    var setDataFromCookieIntoNoteActivityForm = function () {

        var accountPromise = setDropDownListValue("Activity.AccountGuid");

        accountPromise.then(function (result) {
            var projectPromise = setDropDownListValue("Activity.ProjectGuid");

            projectPromise.then(function (result) {

                setInputValues("Activity.Name");

                setToggleButtonValue("Activity.IsPrivate");

                setKendoEditorValue("Activity.Description");

                setDateTime("Activity.NoteProperties.NoteDateTime");

                setUpMultiSelectValues("Activity.TagNames");

                removeCookieAndSetBindings();
            });
        });

    };

    var setDataFromCookieIntoConversationForm = function () {

        var accountPromise = setDropDownListValue("Conversation.AccountGuid");

        accountPromise.then(function (result) {
            var projectPromise = setDropDownListValue("Conversation.ProjectGuid");

            projectPromise.then(function (result) {

                setUpMultiSelectValues("Conversation.AssignedToUsersGuids");

                setUpMultiSelectValues("Conversation.AssignedToContactsGuids");

                setInputValues("Conversation.Subject");

                setKendoEditorValue("Conversation.Messages[0].Body");

                removeCookieAndSetBindings();
            });
        });

    };


    //Functions used to set the element values of the form


    /**
    * @param {any} dropDownFieldName the dropDown field Name
    * @param {any} changeEventNameWhenBoundToEnum this variable is needed because there are certain drop down elements that are bound to enums that will not trigger the change event correctly if they include a namespace. The namespace is needed for all other drop downs to trigger the change event correctly using bind and resolve.
    */
    var setDropDownListValue = function (dropDownFieldName, changeEventNameWhenBoundToEnum) {
        var promise = new Promise(function (resolve, reject) {
            var dropDownFieldId = getFieldIdFromFieldName(dropDownFieldName);
            var dropDownFieldValue = getFieldValueFromFieldName(dropDownFieldName);
            //we need to have a function to bind to in the event that the multi select value has not loaded yet
            function functionToBind() {
                $("#" + dropDownFieldId).getKendoDropDownList().unbind("dataBound", functionToBind);
                $("#" + dropDownFieldId).getKendoDropDownList().value(dropDownFieldValue);
                var changeEventName = "change.autosave";
                if(changeEventNameWhenBoundToEnum){
                    changeEventName = "change";
                }
                $("#" + dropDownFieldId).getKendoDropDownList().bind(changeEventName, resolve);
                $("#" + dropDownFieldId).getKendoDropDownList().trigger(changeEventName);
                $("#" + dropDownFieldId).getKendoDropDownList().unbind(changeEventName, resolve);

            }

            if (dropDownFieldValue) {
                //check to see if data bound already happened first, if so then just call the function
                if ($("#" + dropDownFieldId).getKendoDropDownList().dataSource.data().length > 1) {
                    functionToBind();
                } else {
                    $("#" + dropDownFieldId).getKendoDropDownList().bind("dataBound", functionToBind);
                }
            } else {
                resolve();
            }
        });

        return promise;

    };

    var setUpMultiSelectValues = function (multiSelectFieldName) {
        var multiSelectFieldId = getFieldIdFromFieldName(multiSelectFieldName);
        var multiSelectFieldNameValuePair = getNameValuePairFromFormArrayFromCookie(multiSelectFieldName);

        //we need to have a function to bind to in the event that the multi select value has not loaded yet
        function functionToBind() {
            $("#" + multiSelectFieldId).getKendoMultiSelect().unbind("dataBound", functionToBind);

            var multiSelectValuesArray = [];
            $.each(multiSelectFieldNameValuePair, function (index, element) {
                multiSelectValuesArray.push(element.value);
            });
            $("#" + multiSelectFieldId).getKendoMultiSelect().value(multiSelectValuesArray);

            $("#" + multiSelectFieldId).getKendoMultiSelect().trigger("change");
        }

        if (multiSelectFieldNameValuePair.length) {
            //check to see if data bound already happened first, if so then just call the function
            if ($("#" + multiSelectFieldId).getKendoMultiSelect().dataSource.data().length > 0) {
                functionToBind();
            } else {
                $("#" + multiSelectFieldId).getKendoMultiSelect().bind("dataBound", functionToBind);
            }
        }
    };

    var setCheckBoxValue = function (checkBoxObjectFieldName) {
        var checkBoxObjectFieldId = getFieldIdFromFieldName(checkBoxObjectFieldName);
        var checkBoxObjectFieldValue = getFieldValueFromFieldName(checkBoxObjectFieldName);

        if (checkBoxObjectFieldValue) {
            $("#" + checkBoxObjectFieldId).prop("checked", checkBoxObjectFieldValue);

        }
    };

    var setKendoEditorValue = function (kendoEditorObjectFieldName) {
        var kendoEditorObjectFieldId = getFieldIdFromFieldName(kendoEditorObjectFieldName);
        var kendoEditorObjectFieldValue = getFieldValueFromFieldName(kendoEditorObjectFieldName);

        if (kendoEditorObjectFieldValue) {
            $("#" + kendoEditorObjectFieldId).data("kendoEditor").value(kendoEditorObjectFieldValue);
        }
    };

    var setInputValues = function (inputObjectFieldName) {
        var inputObjectFieldId = getFieldIdFromFieldName(inputObjectFieldName);
        var inputObjectFieldValue = getFieldValueFromFieldName(inputObjectFieldName);

        if (inputObjectFieldValue) {
            $("#" + inputObjectFieldId).val(inputObjectFieldValue);
        }
    };

    var setTextArea = function (textAreaFieldName) {
        var textAreaFieldId = getFieldIdFromFieldName(textAreaFieldName);
        var textAreaFieldValue = getFieldValueFromFieldName(textAreaFieldName);

        if (textAreaFieldValue) {
            $("#" + textAreaFieldId).val(textAreaFieldValue);
        }
    };

    var setDate = function (dateFieldName) {
        var dateFieldId = getFieldIdFromFieldName(dateFieldName);
        var dateFieldValue = getFieldValueFromFieldName(dateFieldName);

        if (dateFieldValue) {
            $("#" + dateFieldId).getKendoDatePicker().value(dateFieldValue);
            $("#" + dateFieldId).getKendoDatePicker().trigger("change");
        }
    };

    var setDateTime = function (dateTimeFieldName) {
        var dateTimeFieldId = getFieldIdFromFieldName(dateTimeFieldName);
        var dateTimeFieldValue = getFieldValueFromFieldName(dateTimeFieldName);

        if (dateTimeFieldValue) {
            $("#" + dateTimeFieldId).getKendoDateTimePicker().value(dateTimeFieldValue);
            $("#" + dateTimeFieldId).getKendoDateTimePicker().trigger("change");
        }
    };

    var setNumericTextBox = function (numericTextBoxFieldName) {
        var numericTextBoxFieldId = getFieldIdFromFieldName(numericTextBoxFieldName);
        var numericTextBoxFieldValue = getFieldValueFromFieldName(numericTextBoxFieldName);

        if (numericTextBoxFieldValue) {
            $("#" + numericTextBoxFieldId).data("kendoNumericTextBox").value(numericTextBoxFieldValue);
        }
    };

    var setStopwatchValue = function (stopWatchFieldName, timeStringFieldId) {
        var stopWatchFieldValue = getFieldValueFromFieldName(stopWatchFieldName);

        if (stopWatchFieldValue) {
            if ($("#" + timeStringFieldId)) {
                $("#" + timeStringFieldId).val(stopWatchFieldValue);
                $("#" + timeStringFieldId).trigger("change");
            }
        }
    };

    var setToggleButtonValue = function (toggleButtonFieldName) {
        var toggleButtonFieldId = getFieldIdFromFieldName(toggleButtonFieldName);
        var toggleButtonFieldValue = getFieldValueFromFieldName(toggleButtonFieldName);

        //when the form is serialized it will not include toggle button information if it was set to false so this is the default value
        $("#" + toggleButtonFieldId).bootstrapSwitch('state', false);

        if (toggleButtonFieldValue) {
            $("#" + toggleButtonFieldId).bootstrapSwitch('state', toggleButtonFieldValue);
        }
    };

    /**
     *Modal window pops up when a cookie with saved data for a time entry, expense, flat fee, secure message or activities are found
     * @param {any} functionToCall The function that will start the process for the respective form
     * @param {any} message The message that will be displayed for the user when they are prompted to chose whether they want to load the cookie data or not
     */
    var pantherShowAutoSaveConfirmWindow = function (functionToCall, message) {
        BootstrapDialog.show({
            title: 'Work in Progress',
            type: BootstrapDialog.TYPE_WARNING,
            message: message,
            buttons: [
                {
                    id: 'btn-ok',
                    icon: 'glyphicon glyphicon-check',
                    label: 'Open Draft',
                    cssClass: 'btn blue',
                    autospin: false,
                    action: function (dialogRef) {
                        try {
                            functionToCall();
                        } catch (e) {
                            if (location.href.indexOf("localhost") > -1 || location.href.indexOf("dev") > -1 || location.href.indexOf("beta") > -1) {
                                alert(e);
                            }
                        }
                        dialogRef.close();
                    }
                },
                {
                    id: 'btn-ok',
                    icon: 'fa fa-times',
                    label: 'No Thanks',
                    cssClass: 'btn default',
                    autospin: false,
                    action: function (dialogRef) {
                        removeCookieAndSetBindings();
                        dialogRef.close();
                    }
                }
            ],
            closeByBackdrop: false,
            closeByKeyboard: false
        });


        setTimeout(function () { $(".bootstrap-dialog-close-button").hide(); }, 200);
    };

    /**
        * Gets the name of the enum by its type
        * @param {any} enumType The enum type
        * @returns {any} The name value pair object
        */
    var getEnumNameFromFormTypeEnum = function (enumType) {
        return Object.keys(AutoSaveSetup._formTypeEnum)[enumType - 1].replace("_"," ");
    };

    /**
     * The function that starts the entire process of saving the data from the form into a cookie
     * @param {any} formName The name of the form
     * @param {any} formEnumType The name of the enumtype of the form
     * @param {any} functionToCall The function that will start the process for the respective form
     * @param {any} userGuid The user guid
     */
    var init = function (formName, formEnumType, functionToCall, userGuid) {
        var formEnumTypeName = getEnumNameFromFormTypeEnum(formEnumType);
        setFormNameAndCookieName(formName, formEnumTypeName, userGuid);

        //if cookie exists ask if the user wants to load the data
        if (_cookieName && $.cookie(_cookieName) !== undefined) {
            var message = 'PracticePanther found an unsaved ' + formEnumTypeName + ' from your last session. Would you like to continue working on your draft? For more information on drafts, <a href="http://support.practicepanther.com/other/getting-started/auto-save-draft-entries\" target="_blank">click here</a>';


            pantherShowAutoSaveConfirmWindow(functionToCall, message);
        } else {
            removeCookieAndSetBindings();
        }
    };

    return {

        //Enum used to define the different type of forms that will be processed
        _formTypeEnum: {
            Time_Entry: 1,
            Expense: 2,
            Flat_Fee: 3,
            Conversation: 4,
            Note: 5,
            Call: 6,
            Task: 7,
            Event: 8
        },

        /*
        *Public function to remove cookie
        */
        removeCookie: function () {
            removeCookie();
        },

        /**
        *Init functions called from their respective forms to set up the process of saving their form data into a cookie
        */

        /**         
         * @param {any} formType The form type
         * @param {any} userGuid The user guid
         */
        initActivity: function (formType, userGuid) {
            var formName = "formCreateActivity";
            var functionToCall = "";

            switch(formType){
                case AutoSaveSetup._formTypeEnum.Call:
                    functionToCall = setDataFromCookieIntoCallActivityForm;
                    break;
                case AutoSaveSetup._formTypeEnum.Note:
                    functionToCall = setDataFromCookieIntoNoteActivityForm;
                    break;
                case AutoSaveSetup._formTypeEnum.Task:
                    functionToCall = setDataFromCookieIntoTaskActivityForm;
                    break;
                case AutoSaveSetup._formTypeEnum.Event:
                    functionToCall = setDataFromCookieIntoEventActivityForm;
                    break;
            }

            init(formName, formType, functionToCall, userGuid);
        },

        /**         
         * @param {any} userGuid The user guid
         */
        initConversation: function (userGuid) {
            init("formCreateConversation", AutoSaveSetup._formTypeEnum.Conversation, setDataFromCookieIntoConversationForm, userGuid);
        },

        /**         
         * @param {any} userGuid The user guid
         */
        initTimeEntry: function (userGuid) {
            init("formCreateTimeEntry", AutoSaveSetup._formTypeEnum.Time_Entry, setDataFromCookieIntoTimeEntryForm, userGuid);
        },

        /**         
         * @param {any} userGuid The user guid
         */
        initFlatFee: function (userGuid) {
            init("formCreateFlatFee", AutoSaveSetup._formTypeEnum.Flat_Fee, setDataFromCookieIntoFlatFeeForm, userGuid);
        },

        /**         
         * @param {any} userGuid The user guid
         */
        initExpense: function (userGuid) {
            init("formCreateExpense", AutoSaveSetup._formTypeEnum.Expense, setDataFromCookieIntoExpenseForm, userGuid);
        }
    };
}();;
function addParamToUrl(uri, key, value) {
    var re = new RegExp("([?&])" + key + "=.*?(&|$)", "i");
    var separator = uri.indexOf('?') !== -1 ? "&" : "?";
    if (uri.match(re)) {
        return uri.replace(re, '$1' + key + "=" + value + '$2');
    }
    else {
        return uri + separator + key + "=" + value;
    }
}
function AddDashToTaxNumber(text) {
    var textWithDash = text;
    if (textWithDash !== undefined || textWithDash !== null) {
        //Format for : xxx-xx-xxxx
        if (textWithDash.length === 3 || textWithDash.length === 6) {
            textWithDash += "-";
            return textWithDash;
        }
    }
    return textWithDash;
}
function pantherLinkify($element) {
    var inputText = $element.html();
    var replacedText, replacePattern1, replacePattern2, replacePattern3;
    //URLs starting with http://, https://, or ftp://
    replacePattern1 = /(\b(https?|ftp):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gim;
    replacedText = inputText.replace(replacePattern1, '<a href="$1" target="_blank">$1</a>');
    //URLs starting with "www." (without // before it, or it'd re-link the ones done above).
    replacePattern2 = /(^|[^\/])(www\.[\S]+(\b|$))/gim;
    replacedText = replacedText.replace(replacePattern2, '$1<a href="http://$2" target="_blank">$2</a>');
    //Change email addresses to mailto:: links.
    replacePattern3 = /(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6})/gim;
    replacedText = replacedText.replace(replacePattern3, '<a  target="_blank" href="mailto:$1">$1</a>');
    return $element.html(replacedText);
}

function submitFormPost(item) {
    var btn = $('.loading-btn'); //$(this);
    var cancelBtn = $('.cancel-btn');
    var loadingImg = $(".loadingImgFormAction");
    if ($(item).closest("form").valid()) {
        btn.hide();
        cancelBtn.hide();
        loadingImg.show();
        App.blockUI({
            boxed: false,
            message: 'Please Wait...'
        });
        setTimeout(function () {
            btn.button('reset');
            cancelBtn.show();
            loadingImg.hide();
            btn.show();
            App.unblockUI();
        }, Number(20000));

        window.onbeforeunload = null;
        //this.form.submit();
        if (typeof setConfirmUnload == 'function') {
            setConfirmUnload(false);
        }

        $(item).closest("form").submit();
        //item.preventDefault();
    }
    if (event.preventDefault) event.preventDefault();
    if (event.returnValue) event.returnValue = false;


    return false;
}

function clearFields(containerSelector, defaultDropdownIndex) {
    //TODO: Ask Ori which is the oldest version of browsers that we support and check if it's possible to use default parameters
    defaultDropdownIndex = typeof defaultDropdownIndex !== 'undefined' ? defaultDropdownIndex : 0;
    $(containerSelector)
        .find('input')
        .each(function (i, elem) {
            switch (elem.type) {
                case 'checkbox':
                case 'radio':
                    this.checked = false;
                    break;
                default:
                    $(elem).val("");
                    break;
            }
        });
    $(containerSelector)
        .find('select')
        .each(function (i, elem) {
            elem.selectedIndex = defaultDropdownIndex;
        });
}

function getOrdinalSuffix(n) {
    return (n % 10 === 1 && n != 11)
        ? "st" : (n % 10 === 2 && n != 12)
            ? "nd" : (n % 10 === 3 && n != 13)
                ? "rd" : "th";
}

function getAllTimeStartDate() {
    return moment().set("year", 2007).startOf('year');
}

function getAllTimeEndDate() {
    return moment().add('year', 10).endOf('year');
}

//sets the date range using the data from windows.localStorage from serialized form data stored in the items variable
function setDateRangeFromLocalStorage(items, dateFormat, allTimeText, modelPrefix) {
    try {
        if (modelPrefix === undefined) {
            modelPrefix = "";
        }

        var itemsStartDateFunction = modelPrefix + "StartDate";
        var itemsEndDateFunction = modelPrefix + "EndDate";

        var itemsStartDate = items[itemsStartDateFunction];
        var itemsEndDate = items[itemsEndDateFunction];

        var startDateName = "[name = '" + modelPrefix + "StartDate']";
        var endDateName = "[name = '" + modelPrefix + "EndDate']";
        var dateRangeId = "#" + $(startDateName).parent()[0].id;
        var startDate = getAllTimeStartDate().format(dateFormat);
        var endDate = getAllTimeEndDate().format(dateFormat);
        var dateRangeText = allTimeText;

        if (itemsStartDate && itemsEndDate) {
            startDate = itemsStartDate.split(' ')[0];
            endDate = itemsEndDate.split(' ')[0];
            dateRangeText = startDate + ' - ' + endDate;
            $(startDateName).val(startDate);
            $(endDateName).val(endDate);
        } else {
            $(startDateName).val("");
            $(endDateName).val("");
        }

        $(dateRangeId + ' span').html(dateRangeText);
        $(dateRangeId).data('daterangepicker').setStartDate(startDate);
        $(dateRangeId).data('daterangepicker').setEndDate(endDate);
    }
    catch (err) {
        console.log("issue loading saved date information: " + err);
    }
}

function startAccountProjectTimer(accountGuid, projectGuid) {
    timerHub_AddAccountProjectTimer(accountGuid, projectGuid);
}
;
"use strict";
var BatchOperationsKendoGrid = function () {

    // Implement header check box or grid check box click event.

    var current = 0;
    var TotalChecked = 0;
    var isBatchOperationgCurrentlyRunning = false;
    var isLastBatchItem = false;
    var _optionListCtrl = "";
    var _ctrlName = "";
    var _checkBoxSingleCssClass = "";
    var _checkBoxAllCssClass = "";
    var _gridName = "";
    var checkUnchek = function (e, gridName, optionListCtrl, checkBoxSingleCssClass, checkBoxAllCssClass, aggregateFieldName) {
        var ctrlName = '#' + gridName;
        _gridName = gridName;
        _ctrlName = ctrlName;
        _optionListCtrl = optionListCtrl;
        _checkBoxAllCssClass = checkBoxAllCssClass;
        _checkBoxSingleCssClass = checkBoxSingleCssClass;
        //e.stopPropagation();
        if ($(e.target).is(":checked")) {
            $(ctrlName + " #" + optionListCtrl).css("display", "block");
            e.target.checked = true;
            if ($(e.target).hasClass(checkBoxAllCssClass)) {
                $(ctrlName + " ." + checkBoxSingleCssClass).each(function (index, element) {
                    this.checked = true;
                });
            } else {
                var cntr = $(ctrlName + " ." + checkBoxSingleCssClass + ":checked").length;
                if (cntr == $(ctrlName + " ." + checkBoxSingleCssClass).length) {
                    $(ctrlName + " ." + checkBoxAllCssClass)[0].checked = true;
                }
            }
        } else {
            if ($(e.target).hasClass(checkBoxAllCssClass)) {
                $(ctrlName + " ." + checkBoxSingleCssClass).each(function (index, element) {
                    this.checked = false;
                });
                $(ctrlName + " #" + optionListCtrl).css("display", "none");
                e.target.checked = false;
            } else {
                e.target.checked = false;
                $(ctrlName + " ." + checkBoxAllCssClass)[0].checked = false;
                var cntr = $(ctrlName + " ." + checkBoxSingleCssClass + ":checked").length;
                if (cntr == 0) {
                    $(ctrlName + " #" + optionListCtrl).css("display", "none");
                }
            }
        }

        //update batch operations label
        var checkedItems = BatchOperationsKendoGrid.getSelectedDataItems(gridName, "checkSingle");
        if (checkedItems.length > 0) {
            var totalAmountSelected = 0;
            var numOfItemsSelected = checkedItems.length;
            if (aggregateFieldName != null) {
                for (var i = 0; i < numOfItemsSelected; i++) {

                    totalAmountSelected += checkedItems[i][aggregateFieldName];
                }
            }
            var itemText = "items";
            if (numOfItemsSelected == 1) {
                itemText = "item";
            }
            var totalSelectedString = "";
            if (totalAmountSelected != 0) {
                totalSelectedString = kendo.toString(totalAmountSelected, 'c2') + " ";
            }
            $("#" + gridName + " .spanGridSelectionSummary").text(numOfItemsSelected + " " + itemText + " selected " + totalSelectedString);

        }

    }; // Run loop on on selected Itmes into grid and execute the supplied function.
    var RunFunctionOnSelected = function (e, gridName, checkBoxSingleCssClass, checkBoxAllCssClass, optionListCtrl, functionName, suppliedParameterNames) {
        var ctrlName = '#' + gridName;
        var cntr = $(ctrlName + " ." + checkBoxSingleCssClass + ":checked").length;
        var data = $(ctrlName).data().kendoGrid.dataSource.view();

        var current = 0;
        var currentIndex = 0;
        $(ctrlName + " ." + checkBoxSingleCssClass).each(function (index, element) {
            if (element.checked == true) {
                var paramNames = suppliedParameterNames.split(',');
                var params = [];
                params.push(e);
                $(paramNames).each(function (elemIndex, element) {
                    params.push(data[index][element]);
                });
                current++;
                setTimeout(function () {
                    currentIndex++;
                    App.blockUI({
                        target: "#" + gridName,
                        boxed: true,
                        message: 'Please wait.... ' + currentIndex + '/' + cntr
                    });
                    CallFunc(functionName, params);
                    if (currentIndex == cntr) {
                        setTimeout(function () {
                            App.unblockUI('#' + gridName);
                        }, 1000);
                    }
                }, (current - 1) * 1000);
            }
        });

        $(ctrlName + " ." + checkBoxAllCssClass)[0].checked = false;
        $(ctrlName + " #" + optionListCtrl).css("display", "none");
    }; //Call the dynamic function with parameter
    var CallFunc = function (func) {
        func = (typeof func == "function") ? func : window[func];
        var args = Array.prototype.slice.call(arguments, 1);
        func.apply(null, args[0]);
    };
    return {
        // Init Function 
        init: function (gridName, optionListCtrl, checkBoxSingleCssClass, checkBoxAllCssClass, callDynamicFunctions, aggregateFieldName) {
            //make sure we have translations ready
            // Binded Select All check box and select single check box independently because of propogation issue. Need a better solution.
            $('#' + gridName + ' .' + checkBoxAllCssClass).bind("click", function (e) { checkUnchek(e, gridName, optionListCtrl, checkBoxSingleCssClass, checkBoxAllCssClass, aggregateFieldName); });
            $('#' + gridName).on("click", ' .' + checkBoxSingleCssClass, function (e) {
                e.stopPropagation();
                checkUnchek(e, gridName, optionListCtrl, checkBoxSingleCssClass, checkBoxAllCssClass, aggregateFieldName);
            });
            // bind Funtions to elements on click
            if (callDynamicFunctions != null) {
                $(callDynamicFunctions).each(function (index, element) {
                    if (element.type != 'Delete') {
                        $('#' + gridName + " #" + element.ctrlName).bind("click",
                            function (e) {
                                RunFunctionOnSelected(e,
                                    gridName,
                                    checkBoxSingleCssClass,
                                    checkBoxAllCssClass,
                                    optionListCtrl,
                                    element.func.Name,
                                    element.func.Params);
                            });
                    } else {
                        //Bind the delete functionality based of type for confirmation
                        $('#' + gridName + " #" + element.ctrlName).bind("click",
                            function (e) {
                                var evt = e;
                                SparkConfirmationDialog(element.sparkMessage,
                                    function () {
                                        RunFunctionOnSelected(evt,
                                            gridName,
                                            checkBoxSingleCssClass,
                                            checkBoxAllCssClass,
                                            optionListCtrl,
                                            element.func.Name,
                                            element.func.Params);
                                    });
                            });
                    }
                });
            }
        },
        gridAjaxRequestComplete: function (gridName) {
            //if (current >= TotalChecked) {
            //    setTimeout(function () {
            //        App.unblockUI('#' + gridName);
            //    }, 500);
            //    current = 1;
            //} else {
            //    current = parseInt(current) + 1;
            //    App.blockUI({
            //        target: "#" + gridName,
            //        boxed: true,
            //        message: 'Please wait.... ' + current + '/' + TotalChecked
            //    });
            //}
        },
        getSelectedDataItems: function (gridName, checkBoxSingleCssClass) {
            var ctrlName = '#' + gridName;            
            var dataItems = [];
            $(ctrlName + " ." + checkBoxSingleCssClass + ":checked").each(function (index, element) {                
                    var item = $(ctrlName).data("kendoGrid").dataItem($(ctrlName + " ." + checkBoxSingleCssClass + ":checked")[index].closest("[data-uid]"))                    
                    dataItems.push(item);
            });
            return dataItems;
        },
        initTextService: function (successMessage, cancelMessage, errorMessage, confirmationMessage, processingMessage, cancelConfirmationMessage, progressBarSuccess) {

        },
        
        /*
            Vallidat the ajax form and start the batch operation
            @param form: the ajax form to validate
        */
        validateFormAndRunBatchOperation: function (form, functionToCall, gridName, action, savedSuccessMessage, savedErrorMessage, successPromise) {
            var isValid = BatchOperationsKendoGrid.validateForm(form);
            var batchEditFormSerialized = "";

            if (isValid) {
                batchEditFormSerialized = $("#" + form).serialize();
                $('#create-modal').modal('hide');

                BatchOperationsKendoGrid.runBatchOperation(functionToCall, gridName, batchEditFormSerialized, action, savedSuccessMessage, savedErrorMessage, successPromise);
            }
        },
        runBatchOperation: function (functionToCall, gridName, batchEditFormSerialized, action, savedSuccessMessage, savedErrorMessage, successPromise) {

            var successMessage = PantherTextService.BatchSuccess;
            var cancelMessage = PantherTextService.BatchCancel;
            var errorMessage = PantherTextService.BatchError;
            var confirmationMessage = PantherTextService.BatchConfirmation;
            var processingMessage = PantherTextService.BatchProcessing;
            var cancelConfirmationMessage = PantherTextService.BatchCancelConfirmation;
            var progressBarSuccess = PantherTextService.ProgressBarSuccess;
            var modalSuccessMessage = PantherTextService.ProgressBarSuccess;
            var modalheader = PantherTextService.BatchProcessingHeader;
            var modalRedirectButton = PantherTextService.BatchProcessingRedirect;
            
            SparkConfirmationDialog(confirmationMessage.replace('[total]', BatchOperationsKendoGrid.getSelectedDataItems(gridName, "checkSingle").length),
                function () {

                    
                    BatchOperationsKendoGrid.setConfirmUnload(true);
                    BatchOperationsKendoGrid.isBatchOperationgCurrentlyRunning = true;
                    BatchOperationsKendoGrid.isLastBatchItem = false;
                    //Create Progress Bar Modal Dialog
                    $("#create-modal-content").html(
                        "<style>.progress {background: rgba(255, 255, 255, 1); border: 1px solid rgba(203, 203, 203, 1); border-radius: 0px; height: 29px;}.progress-bar-custom {background: rgba(49, 182, 122, 1);}" +
                        "</style>" +
                        "<div class='progress-modal'><div class='modal-header'><span class='pull-right' aria-hidden='true'><a id='cancelBatchOperation' href='javascript:void (0)'><i class='modal-header-button fa fa-times'></i></a></span>" +
                        "<h4><i class='pp-icon-rocket'></i> <span class='modal-title'>" +
                        modalheader +
                        "</span></h4>" +
                        "</div><div class='modal-body'><div class='progress'><div class='progress-bar progress-bar-custom' id='deleteProgress' role='progressbar' aria-valuenow='40' aria-valuemin='0' aria-valuemax='100' style='width: 1%'>" +
                        + "<span class='sr-only'>40% Complete (success)</span>" +
                        "</div></div>" +
                        "<div class='row'>" +
                        "<div class='col-md-8'><p class='process-stats'></p></div>" +
                        "<div class='col-md-4' style='margin-top:-5px'><a href='" +
                        document.location.href +
                        "' target='_blank' class='btn green btn-sm btn-block'>" +
                        modalRedirectButton +
                        "</a></div></div>" +
                        "</div></div>");
                    var percentageToIncreaseBy = 0;
                    var currentIndex = 0;
                    var cancel = false;

                    var TotalChecked = $("#" + gridName + " .checkSingle:checked").length;
                    percentageToIncreaseBy = 100 / TotalChecked;

                    //this line is added to make sure we reset the modal data once its been opened to allow static backdrop
                    $('#create-modal').data('bs.modal', null);
                    $("#create-modal").modal({
                        show: true,
                        backdrop: 'static',
                        keyboard: 'false'
                    });
                    $('.progress-modal .progress-bar').html("");
                    $(".progress-modal .process-stats").html(processingMessage.replace('[current]', currentIndex + 1)
                        .replace('[total]', TotalChecked));

                    $('#cancelBatchOperation').bind("click",
                        function (e) {
                            SparkConfirmationDialog(cancelConfirmationMessage,
                                function () {
                                    e.stopPropagation();
                                    BatchOperationsKendoGrid.setConfirmUnload(false);
                                    BatchOperationsKendoGrid.isLastBatchItem = true;
                                    cancel = true;
                                    toastr.error(cancelMessage.replace('[current]', currentIndex + 1));
                                    $('#create-modal').modal('hide');
                                });
                        });

                    var selectedDataItems = BatchOperationsKendoGrid.getSelectedDataItems(gridName, "checkSingle");

                    function next() {
                        //if this is the last item being processed, set the variable isBatchOperationgCurrentlyRunning to 
                        //false so that the calling method functionToCall can perform special logic once it finishes, such as refreshing the grid
                        if (currentIndex + 1 === TotalChecked) {
                            BatchOperationsKendoGrid.isLastBatchItem = true;
                        }
                        var guid = selectedDataItems[currentIndex].Guid;

                        var promise = functionToCall(guid, action, gridName, batchEditFormSerialized, savedSuccessMessage, savedErrorMessage);

                        function promiseCompleted(result) {
                            currentIndex++;

                            if (TotalChecked > currentIndex && !cancel) {
                                guid = selectedDataItems[0].Guid;

                                $('.progress-modal .progress-bar').css("width", percentageToIncreaseBy * (currentIndex) + "%");
                                $(".progress-modal .process-stats").html(processingMessage.replace('[current]', currentIndex + 1).replace('[total]', TotalChecked));

                                next();

                            } else {
                                if (!cancel) {
                                    $(".progress-modal .process-stats").html(processingMessage.replace('[current]', currentIndex).replace('[total]', TotalChecked));
                                }

                                $('.progress-modal .progress-bar').css("width", "100%");
                                $(".modal-title").html(modalSuccessMessage);
                                $(".progress-modal .process-stats").html(modalSuccessMessage);
                                setTimeout(function () {
                                    $('#create-modal').modal('hide');
                                }, 1000);
                                BatchOperationsKendoGrid.resetVariables();
                                //Once all the promises are completed then request to generate the zip file. 
                                if (successPromise) {
                                    successPromise();
                                }
                            }

                            console.log(result); // "Stuff worked!"
                        }

                        promise.then(function (result) {
                            promiseCompleted();
                        },
                            function (err) {
                                var currErrorMessage = errorMessage.replace('[current]', currentIndex+1);
                                if (err != null) {
                                    if (err.message) {
                                        currErrorMessage += " - " + err.message;
                                    }
                                }
                                toastr.options = {
                                    timeOut: 0,
                                    extendedTimeOut: 0,
                                };
                                toastr.error(currErrorMessage);
                                promiseCompleted();
                                pantherResetToastrOptions();
                            });
                    }
                    next();

                });
        },
        BatchEdit: function (guid, url, gridName, batchEditFormSerialized, successMsg, errorMsg) {
            var parameters = batchEditFormSerialized + '&' + $.param({ guid: guid });
            return BatchOperationsKendoGrid.processBatchOperationPromise(gridName, url, parameters, successMsg, errorMsg);
        },
        processBatchOperationPromise: function (gridName, url, parameters, successMsg, errorMsg) {
            var promise = new Promise(function (resolve, reject) {
                $.post(url, parameters)
                    .done(function (data) {
                        var isSuccess = data.status;
                        if (isSuccess) {
                            BatchOperationsKendoGrid.handlePromiseResolve(gridName,
                                data,
                                resolve,
                                successMsg);
                        } else {
                            BatchOperationsKendoGrid.handlePromiseReject(gridName,
                                data,
                                reject,
                                errorMsg);

                        }
                    })
                    .fail(function (jqXhr, textStatus, errorThrown) {
                        var unexpectedError = { message: "Unexpected error" };
                        BatchOperationsKendoGrid.handlePromiseReject(gridName,
                            unexpectedError,
                            reject,
                            errorMsg);
                    });
            });

            return promise;
        },
        handlePromiseResolve: function(gridName, data, resolve, successMessage) {
            if (!BatchOperationsKendoGrid.isBatchOperationgCurrentlyRunning) {
                $('#' + gridName).data("kendoGrid").dataSource.read();
                toastr.success(successMessage);
            }
            if (BatchOperationsKendoGrid.isLastBatchItem) {
                $('#' + gridName).data("kendoGrid").dataSource.read();
                if (typeof RefreshPage == 'function') {
                    RefreshPage();
                }
            }
            resolve(data);
        },      
        handlePromiseReject: function(gridName, data, reject, errorMessage) {
            $('#' + gridName).data("kendoGrid").dataSource.read();
            var dataErrorMessage = "";
            if (data && data.message) {
                dataErrorMessage = data.message;
            }
            if (!BatchOperationsKendoGrid.isBatchOperationgCurrentlyRunning) {
                if (dataErrorMessage) {
                    dataErrorMessage = " - " + dataErrorMessage;
                }
                toastr.error(errorMessage + dataErrorMessage);
            }
           
            reject(Error(dataErrorMessage));
        },
        resetVariables: function () {
            BatchOperationsKendoGrid.isBatchOperationgCurrentlyRunning = false;
            BatchOperationsKendoGrid.isLastBatchItem = false;
            BatchOperationsKendoGrid.setConfirmUnload(false);
            $(_ctrlName + " #" + _optionListCtrl).css("display", "none");
        },
        validateForm: function(form) {
            var canContinueWithBatch = false;

            if ($('#' + form).valid()) {
                canContinueWithBatch = true;

            } else {
                $(".validation-summary-errors").remove();
                //deep clone the object
                var copyOfErrorList = jQuery.extend({}, $('#' + form).validate().errorList);
                $.each(copyOfErrorList,
                    function (index, value) {
                        if (!$(value.element).closest(".toggle-content").is(":visible")) {
                            $('#' + form).validate().errorList
                                .splice($.inArray(value, $('#' + form).validate().errorList), 1);
                        }
                    });
                if ($('#' + form).validate().errorList.length === 0) {
                    canContinueWithBatch = true;
                }
            }
            if ($(".batch-edit-check-box").length > 0 && !$(".batch-edit-check-box").is(':checked')) {
                $(".batch-edit-check-box-section").pulsate({ color: "#e7191b", repeat: 2 });
                canContinueWithBatch = false;
            }

            return canContinueWithBatch;
        },
        setBootstrapSwitchChangeEvent: function (switchClass) {
            $(".batch-edit-save-button").attr("disabled", "disabled");

            $('.' + switchClass).on('switchChange.bootstrapSwitch', function (event, state) {
                if (state) {
                    if ($(this).closest(".toggle-content-container").find(".toggle-content-group").length > 0) {
                        $(this).closest(".toggle-content-container").find(".toggle-content-group").show();
                    } else {
                        $(this).closest(".toggle-content-container").find(".toggle-content").show();
                    }
                } else {
                    if ($(this).closest(".toggle-content-container").find(".toggle-content-group").length > 0) {
                        $(this).closest(".toggle-content-container").find(".toggle-content-group").hide();
                    } else {
                        $(this).closest(".toggle-content-container").find(".toggle-content").hide();
                    }
                }
                $(".batch-edit-save-button").attr("disabled", "disabled");
                $('.' + switchClass).map(function (index) {
                    if ($(this).bootstrapSwitch('state')) {
                        $(".batch-edit-save-button").prop("disabled", false);
                    }
                });

            });
        },
        setConfirmUnload: function (on) {
            window.onbeforeunload = (on) ? BatchOperationsKendoGrid.unloadMessage : null;
        },

        unloadMessage: function () {
            return 'We are not done yet!' +
                ' Please keep this window open until' +
                ' the operation is complete.';
        }
    };
}();;
"use strict";
var BatchOperationsKendoGridReact = function () {

    // Implement header check box or grid check box click event.

    var current = 0;
    var actionType = '';
    var TotalChecked = 0;
    var isBatchOperationgCurrentlyRunning = false;
    var isLastBatchItem = false;
    var _optionListCtrl = "";
    var _ctrlName = "";
    var _checkBoxSingleCssClass = "";
    var _checkBoxAllCssClass = "";
    var _gridName = "";
    var checkUnchek = function (e, gridName, optionListCtrl, checkBoxSingleCssClass, checkBoxAllCssClass, aggregateFieldName) {
        var ctrlName = '#' + gridName;
        _gridName = gridName;
        _ctrlName = ctrlName;
        _optionListCtrl = optionListCtrl;
        _checkBoxAllCssClass = checkBoxAllCssClass;
        _checkBoxSingleCssClass = checkBoxSingleCssClass;
        //e.stopPropagation();
        if ($(e.target).is(":checked")) {
            $(ctrlName + " #" + optionListCtrl).css("display", "block");
            e.target.checked = true;
            if ($(e.target).hasClass(checkBoxAllCssClass)) {
                $(ctrlName + " ." + checkBoxSingleCssClass).each(function (index, element) {
                    this.checked = true;
                });
            } else {
                var cntr = $(ctrlName + " ." + checkBoxSingleCssClass + ":checked").length;
                if (cntr == $(ctrlName + " ." + checkBoxSingleCssClass).length) {
                    $(ctrlName + " ." + checkBoxAllCssClass)[0].checked = true;
                }
            }
        } else {
            if ($(e.target).hasClass(checkBoxAllCssClass)) {
                $(ctrlName + " ." + checkBoxSingleCssClass).each(function (index, element) {
                    this.checked = false;
                });
                $(ctrlName + " #" + optionListCtrl).css("display", "none");
                e.target.checked = false;
            } else {
                e.target.checked = false;
                $(ctrlName + " ." + checkBoxAllCssClass)[0].checked = false;
                var cntr = $(ctrlName + " ." + checkBoxSingleCssClass + ":checked").length;
                if (cntr == 0) {
                    $(ctrlName + " #" + optionListCtrl).css("display", "none");
                }
            }
        }

        //update batch operations label
        var checkedItems = BatchOperationsKendoGridReact.getSelectedDataItems(gridName, "checkSingle");
        if (checkedItems.length > 0) {
            var totalAmountSelected = 0;
            var numOfItemsSelected = checkedItems.length;
            if (aggregateFieldName != null) {
                for (var i = 0; i < numOfItemsSelected; i++) {

                    totalAmountSelected += checkedItems[i][aggregateFieldName];
                }
            }
            var itemText = "items";
            if (numOfItemsSelected == 1) {
                itemText = "item";
            }
            var totalSelectedString = "";
            if (totalAmountSelected != 0) {
                totalSelectedString = kendo.toString(totalAmountSelected, 'c2') + " ";
            }
            $("#" + gridName + " .spanGridSelectionSummary").text(numOfItemsSelected + " " + itemText + " selected " + totalSelectedString);

        }

    }; // Run loop on on selected Itmes into grid and execute the supplied function.
    var RunFunctionOnSelected = function (e, gridName, checkBoxSingleCssClass, checkBoxAllCssClass, optionListCtrl, functionName, suppliedParameterNames) {
        var ctrlName = '#' + gridName;
        var cntr = $(ctrlName + " ." + checkBoxSingleCssClass + ":checked").length;
        var data = $(ctrlName).data().kendoGrid.dataSource.view();

        var current = 0;
        var currentIndex = 0;
        $(ctrlName + " ." + checkBoxSingleCssClass).each(function (index, element) {
            if (element.checked == true) {
                var paramNames = suppliedParameterNames.split(',');
                var params = [];
                params.push(e);
                $(paramNames).each(function (elemIndex, element) {
                    params.push(data[index][element]);
                });
                current++;
                setTimeout(function () {
                    currentIndex++;
                    App.blockUI({
                        target: "#" + gridName,
                        boxed: true,
                        message: 'Please wait.... ' + currentIndex + '/' + cntr
                    });
                    CallFunc(functionName, params);
                    if (currentIndex == cntr) {
                        setTimeout(function () {
                            App.unblockUI('#' + gridName);
                        }, 1000);
                    }
                }, (current - 1) * 1000);
            }
        });

        $(ctrlName + " ." + checkBoxAllCssClass)[0].checked = false;
        $(ctrlName + " #" + optionListCtrl).css("display", "none");
    }; //Call the dynamic function with parameter
    var CallFunc = function (func) {
        func = (typeof func == "function") ? func : window[func];
        var args = Array.prototype.slice.call(arguments, 1);
        func.apply(null, args[0]);
    };
    return {
        batchRowDataList: [],
        // Init Function 
        init: function (gridName, optionListCtrl, checkBoxSingleCssClass, checkBoxAllCssClass, callDynamicFunctions, aggregateFieldName) {
            //make sure we have translations ready
            // Binded Select All check box and select single check box independently because of propogation issue. Need a better solution.
            $('#' + gridName + ' .' + checkBoxAllCssClass).bind("click", function (e) { checkUnchek(e, gridName, optionListCtrl, checkBoxSingleCssClass, checkBoxAllCssClass, aggregateFieldName); });
            $('#' + gridName).on("click", ' .' + checkBoxSingleCssClass, function (e) {
                e.stopPropagation();
                checkUnchek(e, gridName, optionListCtrl, checkBoxSingleCssClass, checkBoxAllCssClass, aggregateFieldName);
            });
            // bind Funtions to elements on click
            if (callDynamicFunctions != null) {
                $(callDynamicFunctions).each(function (index, element) {
                    if (element.type != 'Delete') {
                        $('#' + gridName + " #" + element.ctrlName).bind("click",
                            function (e) {
                                RunFunctionOnSelected(e,
                                    gridName,
                                    checkBoxSingleCssClass,
                                    checkBoxAllCssClass,
                                    optionListCtrl,
                                    element.func.Name,
                                    element.func.Params);
                            });
                    } else {
                        //Bind the delete functionality based of type for confirmation
                        $('#' + gridName + " #" + element.ctrlName).bind("click",
                            function (e) {
                                var evt = e;
                                SparkConfirmationDialog(element.sparkMessage,
                                    function () {
                                        RunFunctionOnSelected(evt,
                                            gridName,
                                            checkBoxSingleCssClass,
                                            checkBoxAllCssClass,
                                            optionListCtrl,
                                            element.func.Name,
                                            element.func.Params);
                                    });
                            });
                    }
                });
            }
        },
        gridAjaxRequestComplete: function (gridName) {
            //if (current >= TotalChecked) {
            //    setTimeout(function () {
            //        App.unblockUI('#' + gridName);
            //    }, 500);
            //    current = 1;
            //} else {
            //    current = parseInt(current) + 1;
            //    App.blockUI({
            //        target: "#" + gridName,
            //        boxed: true,
            //        message: 'Please wait.... ' + current + '/' + TotalChecked
            //    });
            //}
        },
        getSelectedDataItems: function (gridName, checkBoxSingleCssClass) {
            var ctrlName = '#' + gridName;            
            var dataItems = [];
            $(ctrlName + " ." + checkBoxSingleCssClass + ":checked").each(function (index, element) {                
                    var item = $(ctrlName).data("kendoGrid").dataItem($(ctrlName + " ." + checkBoxSingleCssClass + ":checked")[index].closest("[data-uid]"))                    
                    dataItems.push(item);
            });
            return dataItems;
        },
        initTextService: function (successMessage, cancelMessage, errorMessage, confirmationMessage, processingMessage, cancelConfirmationMessage, progressBarSuccess) {

        },
        
        /*
            Vallidat the ajax form and start the batch operation
            @param form: the ajax form to validate
        */
        validateFormAndRunBatchOperationReact: function (form, functionToCall, action, savedSuccessMessage, savedErrorMessage, successPromise) {
            var isValid = BatchOperationsKendoGridReact.validateForm(form);
            var batchEditFormSerialized = "";

            if (isValid) {
                batchEditFormSerialized = $("#" + form).serialize();
                $('#create-modal').modal('hide');

                BatchOperationsKendoGridReact.runBatchOperationReact(functionToCall, batchEditFormSerialized, action, savedSuccessMessage, savedErrorMessage, successPromise);
            }
        },
        runBatchOperationReact: function (functionToCall, batchEditFormSerialized, action, savedSuccessMessage, savedErrorMessage, successPromise) {
            actionType = action;
            var successMessage = PantherTextService.BatchSuccess;
            var cancelMessage = PantherTextService.BatchCancel;
            var errorMessage = PantherTextService.BatchError;
            var confirmationMessage = PantherTextService.BatchConfirmation;
            var processingMessage = PantherTextService.BatchProcessing;
            var cancelConfirmationMessage = PantherTextService.BatchCancelConfirmation;
            var progressBarSuccess = PantherTextService.ProgressBarSuccess;
            var modalSuccessMessage = PantherTextService.ProgressBarSuccess;
            var modalheader = PantherTextService.BatchProcessingHeader;
            var modalRedirectButton = PantherTextService.BatchProcessingRedirect;
            

            SparkConfirmationDialog(confirmationMessage.replace('[total]', BatchOperationsKendoGridReact.batchRowDataList.length),
                function () {

                    
                    BatchOperationsKendoGridReact.setConfirmUnload(true);
                    BatchOperationsKendoGridReact.isBatchOperationgCurrentlyRunning = true;
                    BatchOperationsKendoGridReact.isLastBatchItem = false;
                    //Create Progress Bar Modal Dialog
                    $("#create-modal-content").html(
                        "<style>.progress {background: rgba(255, 255, 255, 1); border: 1px solid rgba(203, 203, 203, 1); border-radius: 0px; height: 29px;}.progress-bar-custom {background: rgba(49, 182, 122, 1);}" +
                        "</style>" +
                        "<div class='progress-modal'><div class='modal-header'><span class='pull-right' aria-hidden='true'><a id='cancelBatchOperation' href='javascript:void (0)'><i class='modal-header-button fa fa-times'></i></a></span>" +
                        "<h4><i class='pp-icon-rocket'></i> <span class='modal-title'>" +
                        modalheader +
                        "</span></h4>" +
                        "</div><div class='modal-body'><div class='progress'><div class='progress-bar progress-bar-custom' id='deleteProgress' role='progressbar' aria-valuenow='40' aria-valuemin='0' aria-valuemax='100' style='width: 1%'>" +
                        + "<span class='sr-only'>40% Complete (success)</span>" +
                        "</div></div>" +
                        "<div class='row'>" +
                        "<div class='col-md-8'><p class='process-stats'></p></div>" +
                        "<div class='col-md-4' style='margin-top:-5px'><a href='" +
                        document.location.href +
                        "' target='_blank' class='btn green btn-sm btn-block'>" +
                        modalRedirectButton +
                        "</a></div></div>" +
                        "</div></div>");
                    var percentageToIncreaseBy = 0;
                    var currentIndex = 0;
                    var cancel = false;

                    var TotalChecked = BatchOperationsKendoGridReact.batchRowDataList.length;
                    percentageToIncreaseBy = 100 / TotalChecked;

                    //this line is added to make sure we reset the modal data once its been opened to allow static backdrop
                    $('#create-modal').data('bs.modal', null);
                    $("#create-modal").modal({
                        show: true,
                        backdrop: 'static',
                        keyboard: 'false'
                    });
                    $('.progress-modal .progress-bar').html("");
                    $(".progress-modal .process-stats").html(processingMessage.replace('[current]', currentIndex + 1)
                        .replace('[total]', TotalChecked));

                    $('#cancelBatchOperation').bind("click",
                        function (e) {
                            SparkConfirmationDialog(cancelConfirmationMessage,
                                function () {
                                    e.stopPropagation();
                                    BatchOperationsKendoGridReact.setConfirmUnload(false);
                                    BatchOperationsKendoGridReact.isLastBatchItem = true;
                                    cancel = true;
                                    toastr.error(cancelMessage.replace('[current]', currentIndex + 1));
                                    $('#create-modal').modal('hide');
                                });
                        });

                    function next() {
                        //if this is the last item being processed, set the variable isBatchOperationgCurrentlyRunning to 
                        //false so that the calling method functionToCall can perform special logic once it finishes, such as refreshing the grid
                        if (currentIndex + 1 === TotalChecked) {
                            BatchOperationsKendoGridReact.isLastBatchItem = true;
                        }

                        var promise = functionToCall(BatchOperationsKendoGridReact.batchRowDataList[currentIndex], action, batchEditFormSerialized, savedSuccessMessage, savedErrorMessage);

                        function promiseCompleted(result) {
                            currentIndex++;

                            if (TotalChecked > currentIndex && !cancel) {
                                var guid = BatchOperationsKendoGridReact.batchRowDataList[0].matterId;

                                $('.progress-modal .progress-bar').css("width", percentageToIncreaseBy * (currentIndex) + "%");
                                $(".progress-modal .process-stats").html(processingMessage.replace('[current]', currentIndex + 1).replace('[total]', TotalChecked));

                                next();

                            } else {
                                if (!cancel) {
                                    $(".progress-modal .process-stats").html(processingMessage.replace('[current]', currentIndex).replace('[total]', TotalChecked));
                                }

                                $('.progress-modal .progress-bar').css("width", "100%");
                                $(".modal-title").html(modalSuccessMessage);
                                $(".progress-modal .process-stats").html(modalSuccessMessage);
                                setTimeout(function () {
                                    $('#create-modal').modal('hide');
                                }, 1000);
                                BatchOperationsKendoGridReact.resetVariables();
                                if (actionType === 'delete' || actionType === 'archived') {
                                    location.reload();
                                }
                                    
                                //Once all the promises are completed then request to generate the zip file. 
                                if (successPromise) {
                                    successPromise();
                                }
                            }

                            console.log(result); // "Stuff worked!"
                        }

                        promise.then(function (result) {
                            promiseCompleted();
                        },
                            function (err) {
                                var currErrorMessage = errorMessage.replace('[current]', currentIndex+1);
                                if (err != null) {
                                    if (err.message) {
                                        currErrorMessage += " - " + err.message;
                                    }
                                }
                                toastr.options = {
                                    timeOut: 0,
                                    extendedTimeOut: 0,
                                };
                                toastr.error(currErrorMessage);
                                promiseCompleted();
                                pantherResetToastrOptions();
                            });
                    }
                    next();

                });
        },
        BatchEdit: function (data, url, batchEditFormSerialized, successMsg, errorMsg) {
            var parameters = batchEditFormSerialized + '&' + $.param({ guid: data.matterId });
            return BatchOperationsKendoGridReact.processBatchOperationPromise(url, parameters, successMsg, errorMsg);
        },
        processBatchOperationPromise: function (url, parameters, successMsg, errorMsg) {
            var promise = new Promise(function (resolve, reject) {
                $.post(url, parameters)
                    .done(function (data) {
                        var isSuccess = data.status;
                        if (isSuccess) {

                            BatchOperationsKendoGridReact.handlePromiseResolve(
                                data,
                                resolve,
                                successMsg);
                        } else {
                            BatchOperationsKendoGridReact.handlePromiseReject(
                                data,
                                reject,
                                errorMsg);

                        }
                    })
                    .fail(function (jqXhr, textStatus, errorThrown) {
                        var unexpectedError = { message: "Unexpected error" };
                        BatchOperationsKendoGridReact.handlePromiseReject(
                            unexpectedError,
                            reject,
                            errorMsg);
                    });
            });

            return promise;
        },
        handlePromiseResolve: function (data, resolve, successMessage) {

            if (!BatchOperationsKendoGridReact.isBatchOperationgCurrentlyRunning) {
                //$('#' + gridName).data("kendoGrid").dataSource.read();
                toastr.success(successMessage);
            }

            resolve(data);

        },      
        handlePromiseReject: function(data, reject, errorMessage) {
            //$('#' + gridName).data("kendoGrid").dataSource.read();

            var dataErrorMessage = "";
            if (data && data.message) {
                dataErrorMessage = data.message;
            }
            if (!BatchOperationsKendoGridReact.isBatchOperationgCurrentlyRunning) {
                if (dataErrorMessage) {
                    dataErrorMessage = " - " + dataErrorMessage;
                }
                toastr.error(errorMessage + dataErrorMessage);
            }
           
            reject(Error(dataErrorMessage));
        },
        resetVariables: function () {
            BatchOperationsKendoGridReact.isBatchOperationgCurrentlyRunning = false;
            BatchOperationsKendoGridReact.isLastBatchItem = false;
            BatchOperationsKendoGridReact.setConfirmUnload(false);

        },
        validateForm: function(form) {
            var canContinueWithBatch = false;

            if ($('#' + form).valid()) {
                canContinueWithBatch = true;

            } else {
                $(".validation-summary-errors").remove();
                //deep clone the object
                var copyOfErrorList = jQuery.extend({}, $('#' + form).validate().errorList);
                $.each(copyOfErrorList,
                    function (index, value) {
                        if (!$(value.element).closest(".toggle-content").is(":visible")) {
                            $('#' + form).validate().errorList
                                .splice($.inArray(value, $('#' + form).validate().errorList), 1);
                        }
                    });
                if ($('#' + form).validate().errorList.length === 0) {
                    canContinueWithBatch = true;
                }
            }
            if ($(".batch-edit-check-box").length > 0 && !$(".batch-edit-check-box").is(':checked')) {
                $(".batch-edit-check-box-section").pulsate({ color: "#e7191b", repeat: 2 });
                canContinueWithBatch = false;
            }

            return canContinueWithBatch;
        },
        setBootstrapSwitchChangeEvent: function (switchClass) {
            $(".batch-edit-save-button").attr("disabled", "disabled");

            $('.' + switchClass).on('switchChange.bootstrapSwitch', function (event, state) {
                if (state) {
                    if ($(this).closest(".toggle-content-container").find(".toggle-content-group").length > 0) {
                        $(this).closest(".toggle-content-container").find(".toggle-content-group").show();
                    } else {
                        $(this).closest(".toggle-content-container").find(".toggle-content").show();
                    }
                } else {
                    if ($(this).closest(".toggle-content-container").find(".toggle-content-group").length > 0) {
                        $(this).closest(".toggle-content-container").find(".toggle-content-group").hide();
                    } else {
                        $(this).closest(".toggle-content-container").find(".toggle-content").hide();
                    }
                }
                $(".batch-edit-save-button").attr("disabled", "disabled");
                $('.' + switchClass).map(function (index) {
                    if ($(this).bootstrapSwitch('state')) {
                        $(".batch-edit-save-button").prop("disabled", false);
                    }
                });

            });
        },
        setConfirmUnload: function (on) {
            window.onbeforeunload = (on) ? BatchOperationsKendoGridReact.unloadMessage : null;
        }, 

        unloadMessage: function () {
            return 'We are not done yet!' +
                ' Please keep this window open until' +
                ' the operation is complete.';
        }
    };
}();;

function SparkConfirmationDialog(text, retFunction, cancelFuntion) {
    var kendoWindow = $("<div />").kendoWindow({
        title: "Confirmation",
        resizable: false,
        modal: true
    });

    kendoWindow.data("kendoWindow")
        .content(
            "<p class=\"delete-message well\">" + text + "</p>" +
            "</br>" +
            "<button class=\"delete-confirm btn green\"><i class=\"fa fa-check \"></i> Yes</button>" +
            "<button class=\"delete-cancel btn default\"><i class=\"fa fa-times\"></i> No</button>"
        )
        .center().open();

    kendoWindow
        .find(".delete-confirm, .delete-cancel")
        .click(function() {
            kendoWindow.data("kendoWindow").close();
            if ($(this).hasClass("delete-confirm")) {
                retFunction();
            } else if ($(this).hasClass("delete-cancel") && cancelFuntion) {
                cancelFuntion();
            }

        })
        .end();
}

function SparkNotificationDialog(text, retFunction) {
    var kendoWindow = $("<div />").kendoWindow({
        title: "Notification",
        resizable: false,
        modal: true
    });

    kendoWindow.data("kendoWindow")
        .content(
            "<p class=\"delete-message well\">" + text + "</p>" +
            "<button class=\"delete-confirm btn green\"><i class=\"fa fa-check \"></i> Ok</button>"
        )
        .center().open();

    kendoWindow
        .find(".delete-confirm")
        .click(function() {
            kendoWindow.data("kendoWindow").close();
            if ($(this).hasClass("delete-confirm")) {
                retFunction();
            }

        })
        .end();
}

function SparkConfirmationDialogOkCancel(text, retFunction) {
    var kendoWindow = $("<div />").kendoWindow({
        title: "Confirmation",
        resizable: false,
        modal: true
    });

    kendoWindow.data("kendoWindow")
        .content(
            "<p class=\"delete-message well\">" + text + "</p>" +
            "</br>" +
            "<button class=\"delete-confirm btn green\"><i class=\"fa fa-check \"></i> OK</button>" +
            "<button class=\"delete-cancel btn default\"><i class=\"fa fa-times\"></i> Cancel</button>"
        )
        .center().open();

    kendoWindow
        .find(".delete-confirm, .delete-cancel")
        .click(function () {
            kendoWindow.data("kendoWindow").close();
            if ($(this).hasClass("delete-confirm")) {
                retFunction();
            }

        })
        .end();
};
/**
* Handles the functions that are responsible for generating a zip file composed of various types of files such as .docx
*/
"use strict"

function getFileNameExtension(oReq) {
    var fileType = oReq.getResponseHeader("Content-Type");
    var fileExtension = "";
    switch (fileType) {
        case "application/vnd.openxmlformats-officedocument.wordprocessingml.document":
            fileExtension = '.docx';
            break;
        case "text/csv":
            fileExtension = '.csv';
            break;
        case "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":
            fileExtension = '.xlsx';
            break;
        case "application/vnd.ms-excel.template.macroEnabled.12":
            fileExtension = '.xltm';
            break;
        default:
            fileExtension = '.docx';
            break;
    }

    return fileExtension;
};

var ZipFileLogic = function () {
    var docxZipFile = JSZip();
    
    return {
        /**
         * Generate and Download all the current files added to the zip object. This function will only be called when the batch operation has completed entirely.
         *
         */
        GenerateAndDownloadZipFromTemplateBatchCompletion: function () {
            docxZipFile.generateAsync({ type: "blob" })
                .then(function (blob) {
                    saveAs(blob, "practicePantherDocx.zip");
                    docxZipFile = JSZip();
                });
        },
        /**
         *  Generate docx and add to the current zip file in memory.
         * (guid) - current guid of the selected grid item.
         * (parameters) - the query string that will be passed to the action method
         * returns -  A promise of each batch operation.
         */
        AddTemplateDocxToZipCommon: function (guid, gridName, parameters) {
            var fileName = "";
            var selectedRow = $("#" + gridName).getKendoGrid().dataSource.get(guid);

            if (selectedRow) {
                fileName = selectedRow.NameAndNumber;
            }
            return new Promise(function (resolve, reject) {
                var oReq = new XMLHttpRequest();
                oReq.open("POST", "/DocumentTemplate/Apply?" + parameters, true);
                oReq.responseType = "arraybuffer";
                oReq.onload = function (oEvent) {
                    var arrayBuffer = oReq.response; // Note: not oReq.responseText
                    if (arrayBuffer) {
                        var byteArray = new Uint8Array(arrayBuffer);
                        var fileExtension = getFileNameExtension(oReq);
                        docxZipFile.file(fileName.replace(/[!@#$%^&*()_+-={}\[\]\\|:;"',.><>?]/g, "")  + fileExtension, byteArray);
                    }
                    resolve(arrayBuffer);
                };
                oReq.send(null);
            });
        },
        AddTemplateDocxToZipCommonReact: function (data, action, parameters) {            

            var fileName = "";

            fileName = data.matterName;

            if (data.accountId !== null && data.accountId.length > 0)
                parameters += "&accountGuid=" + data.accountId;

            if (data.matterId !== null && data.matterId.length > 0)
                parameters += "&projectGuid=" + data.matterId;

            return new Promise(function (resolve, reject) {
                var oReq = new XMLHttpRequest();                

                oReq.open("POST", "/DocumentTemplate/Apply?" + parameters, true);
                oReq.responseType = "arraybuffer";
                oReq.onload = function (oEvent) {                    
                    var arrayBuffer = oReq.response; // Note: not oReq.responseText
                    if (arrayBuffer) {
                        var byteArray = new Uint8Array(arrayBuffer);
                        var fileExtension = getFileNameExtension(oReq);
                        docxZipFile.file(fileName.replace(/[!@#$%^&*()_+-={}\[\]\\|:;"',.><>?]/g, "") + fileExtension, byteArray);
                    }
                    resolve(arrayBuffer);
                };
                oReq.send(null);
            });
        }
    };
}();;
;
function AddRowToGrid(gridName) {
    $("#" + gridName).data("kendoGrid").addRow();
}

function GetHashCode(val) {
    var hash = 0, i, chr;
    if (val.length === 0) return hash;
    for (i = 0; i < val.length; i++) {
        chr = val.charCodeAt(i);
        hash = ((hash << 5) - hash) + chr;
        hash |= 0; // Convert to 32bit integer
    }
    return hash;

}

function GetIndexForGrid(dataItem, gridName, startingIndex) {
    var selector = "#" + gridName;
    var data = $(selector).data("kendoGrid").dataSource.data();

    var index = data.indexOf(dataItem);

    if (startingIndex !== undefined) {
        index += startingIndex;
    }

    return index;
}

function GridErrorHandler(e, status) {
    if (e.errors) {
        var message = "Errors:\n";
        $.each(e.errors, function (key, value) {
            if (value.errors) {
                message += value.errors.join("\n");
            }
        });
        alert(message);
    }
}

function GetContactMailSyncAddressForGrid(email, guid){
    return "mailto:"+email+"?bcc=contact%2b"+guid+"@mailsync.practicepanther.com";
}

function GetRowByGridNameAndRowUid(gridName, rowUid) {
    var selector = "#" + gridName;
    return $(selector).find("tbody>tr[data-uid=" + rowUid + "]");
}

function FixTextValuesForGrid(text) {
    if (text) {
        text = text.replace(/\'/g, "&apos;"); // global replace
        text = text.replace(/\"/g, "&quot;"); // global replace

    } else {
        text = "";
    }

    return text;
}

function GetStringForKendoGrid(text, calledFrom = "") {
    if (text == null || text == 'null') {
        return calledFrom;
    } else return text;
}

function GetDateAsStringForKendoGrid(text, calledFrom = "") {
    if (text == null || text == 'null') {
        return calledFrom;
    }
    else {
        var dateOnly = text.split(" ");
        return dateOnly[0];
    }
}

function TurnicateStringForKendoGrid(text, stringLength) {
    var returnVal = "";
    if (text != null && text != 'null') {
        returnVal = text;

        if (text.length > stringLength) {
            returnVal = text.slice(0, stringLength);
            returnVal += "...";
        }
    }
    return returnVal;
}

function GetDecodedStringForKendoGrid(text, actionTrackingName) {
    if (text == null || text == 'null') {
        return "";
    } else {
        var regex = /(<([^>]+)>)/ig;
        text = text.replace(/<style([\S\s]*?)>([\S\s]*?)<\/style>/ig, '');
        text = text.replace(regex, ' ');
        text = text.replaceAll('&nbsp;', ' ');
        text = text.replaceAll('&amp;', ' ');
        text = text.replaceAll("'", " ");

        text = text.replace(/&/g, '&amp;')
            .replace(/>/g, '&gt;')
            .replace(/</g, '&lt;')
            .replace(/"/g, '&quot;');

        if (text.length > 200)
        {
            var actionTrackingAttributes = '';
            if (actionTrackingName) {
                actionTrackingAttributes = `data-action-tracking-name='${actionTrackingName}.ShowMore' data-action-tracking-kendogrid-onclick='true'`;
            }

            var randomGuid = jQuery.Guid.New();
            var newText = text.substring(0, 199);
            newText += `
                <a id='activityShowMore${randomGuid}'
                   href='javascript:$("#activityMore${randomGuid}").show(); $("#activityShowMore${randomGuid}").hide(); void(0);'
                   ${actionTrackingAttributes}>
                    more...
                </a>
                <span id='activityMore${randomGuid}' style='display:none;'>${text.substring(199, text.length - 1)}</span>`;
            return newText;
        }
        return text;
    }
}

function GetInitialsFromString(text)
{
    if (text != null && text != 'null') {
        text = text.replace(/\W*(\w)\w*/g, '$1').toUpperCase();
    }
    return GetStringForKendoGrid(text);
}
function GetArchivedStatus(status) {
    if (status === 0)
        return "Active";
    else if (status === 1)
        return "Archived";
    //Default return value
    return "Active";
}

function GetAccountLinkForKendoGrid(account) {
    var guid = "";
    var name = "";
    if (account != null) {
        guid = account.Guid;
        name = account.NameAndNumber;
    }
    return "<a  data-toggle='single-page' href='/Account/Details/" + guid + "' data-action-tracking-name='AccountLink' data-action-tracking-kendogrid-onclick='true'>" + GetStringForKendoGrid(name) + "</a>";
}

function GetBankAccountLinkForKendoGrid(bankAccountName, BankAccountGuid) {
    var guid = "";
    var name = "";

    if (BankAccountGuid != null) {
        guid = BankAccountGuid;
        name = bankAccountName;
    }
    return "<a  data-toggle='single-page' href='/BankAccount/Details/" + guid + "'>" + GetStringForKendoGrid(name) + "</a>";
}

function GetContactLinkForKendoGrid(contact) {
    var guid = "";
    var name = "";
    if (contact != null) {
        guid = contact.Guid;
        name = contact.DisplayName;
    }
    return "<a data-toggle='single-page' href='/Contact/Details/" + guid + "'>" + GetStringForKendoGrid(name) + "</a>";
}

function GetSaleDocumentTemplateLinkForKendoGrid(saleDocumentTemplate) {
    var guid = "";
    var name = "";
    var isDeleted = false;
    guid = saleDocumentTemplate.Guid;
    name = saleDocumentTemplate.Name;

    return "<a href='/SaleDocumentTemplate/Details/" + guid + "'>" + GetStringForKendoGrid(name) + "</a>";

}

function GetInvoiceLinkForKendoGrid(invoice) {
    if (invoice == null) return "";
    var guid = "";
    var name = "";
    if (invoice != null) {
        guid = invoice.Guid;
        name = invoice.Name;
    }
    return "<a data-toggle='single-page' href='/Invoice/Details/" + guid + "'>" + GetStringForKendoGrid(name) + "</a>"
}

function GetInvoiceItemLinkForKendoGrid(invoice) {
    if (invoice == null) return "";
    if (invoice.SaleDocument == null) return "";
    var guid = "";
    var name = "";
    if (invoice != null) {
        guid = invoice.SaleDocument.Guid;
        name = invoice.SaleDocument.Name;
    }
    return "<a data-toggle='single-page' class='grid-invoice-link' href='/Invoice/Details/" + guid + "'>" + GetStringForKendoGrid(name) + "</a>"
}

function GetProjectLinkForKendoGrid(project) {
    var guid = "";
    var name = "";
    if (project != null && !jQuery.Guid.IsEmpty(project.Guid)) {
        guid = project.Guid;
        name = project.NameAndNumber;
    }
    return "<a data-toggle='single-page' href='/Project/Details/" + guid + "' data-action-tracking-name='ProjectLink' data-action-tracking-kendogrid-onclick='true'>" + name + "</a>"
}

function GetUtbmsCodeForKendoGrid(utbmsCode) {
    var code = "";
    var name = "";
    if (utbmsCode != null) {
        code = utbmsCode.Code;
        name = utbmsCode.Name;
    }
    return "<span>" + code + " " + name + "</span>";
}

function GetProductForKendoGrid(product) {
    var guid = "";
    var name = "";
    var code = "";
    if (product != null && !jQuery.Guid.IsEmpty(product.Guid)) {
        guid = product.Guid;
        name = product.Name;
        if (product.Code != null && product.Code != "")
            code = product.Code + " ";
    }
    return "<a data-toggle='single-page' href='/Item/Details/" + guid + "'>" +code + name + "</a>"
}

function GetProductCodeForKendoGrid(product) {
    var guid = "";
    var name = "";
    var code = "";
    if (product != null && !jQuery.Guid.IsEmpty(product.Guid)) {
        guid = product.Guid;
        name = product.Name;
        if (product.Code != null && product.Code != "")
            code = product.Code;
    }
    return "<a data-toggle='single-page' href='/Item/Details/" + guid + "'>" + code + "</a>"
}

function GetUserLinkForKendoGrid(user) {
    var guid = "";
    var name = "";
    if (user != null) {
        guid = user.Guid;
        name = user.DisplayName;
        var res = "<ul class='assigned-to-list'>";

        res += "<li><a class='avatar-circle' data-toggle='single-page' href='/User/Details/" + guid + "'><span class='initials'>" + GetInitialsFromString(name) + "</span></a></li>";


        res += "</ul>";
        return res;
    }
    else return "";

    return "<a  data-toggle='single-page' href='/User/Details/" + guid + "'>" + GetStringForKendoGrid(name) + "</a>"
}

function GetUserLinkForKendoGridNoAvatar(user) {
    var guid = "";
    var name = "";
    if (user != null) {
        guid = user.Guid;
        name = user.DisplayName;
    }
    return "<a  data-toggle='single-page' href='/User/Details/" + guid + "'>" + GetStringForKendoGrid(name) + "</a>"
}

function GetParticipantLinksForKendoGrid(participants, type, firmTextPhoneNumber) {
    var res = "<ul class='assigned-to-list conversation-participants-list' style='display:block;'>";
    for (var i = 0; i < participants.length; i++) {
        var participant = participants[i];
        //var readIcon = "<i title='Read on " + GetStringForKendoGrid(kendo.toString(participant.LastReadDate, 'g')) + "' class='fa fa-check message-read'></i>";
        var readIcon = "<i data-original-title='Read' data-placement='bottom' class='fa fa-check message-read tooltips'></i>";
        res += "<li>";

        if (participant.Contact != null) {
            res += GetContactLinkForKendoGrid(participant.Contact);
        }

        if (participant.User != null) {
            res += GetUserLinkForKendoGridNoAvatar(participant.User);
        }
        else if (participant.Contact != null && participants.length == 1 && firmTextPhoneNumber != null && firmTextPhoneNumber != "") {
            res += "<br>" + firmTextPhoneNumber;
        }

        if (participant.Status == 1 && type != 0) { //read
            res += readIcon;
        }
        res += "</li>";
    }
    res += "</ul>";
    return res;
}

function GetParticipantLinksForKendoGridForPortal(participants, type, firmTextPhoneNumber) {
    var res = "<ul class='assigned-to-list conversation-participants-list' style='display:block;'>";
    for (var i = 0; i < participants.length; i++) {
        var participant = participants[i];
        //var readIcon = "<i title='Read on " + GetStringForKendoGrid(kendo.toString(participant.LastReadDate, 'g')) + "' class='fa fa-check message-read'></i>";
        var readIcon = "<i data-original-title='Read' data-placement='bottom' class='fa fa-check message-read tooltips'></i>";
        res += "<li>";

        if (participant.Contact != null) {
            res += GetStringForKendoGrid(participant.Contact.DisplayName);
        }

        if (participant.User != null) {
            res += GetStringForKendoGrid(participant.User.DisplayName);
        }
        else if (participant.Contact != null && participants.length == 1 && firmTextPhoneNumber != null && firmTextPhoneNumber != "") {
            res += "<br>" + firmTextPhoneNumber;
        }

        if (participant.Status == 1 && type != 0) { //read
            res += readIcon;
        }
        res += "</li>";
    }
    res += "</ul>";
    return res;
}

function GetAssignedToLinkForKendoGrid(assignedTo) {

    var res = "<ul class='assigned-to-list'>";

    for (var i = 0; i < assignedTo.length; i++) {
        res += "<li><a class='avatar-circle' data-toggle='single-page' href='/User/Details/" + assignedTo[i].Guid + "' data-action-tracking-name='AssignedToLink' data-action-tracking-kendogrid-onclick='true'><span class='initials'>" + GetInitialsFromString(assignedTo[i].DisplayName) + "</span></a></li>";
    }

    res += "</ul>";

    return res;

}

function GetUserAssignedToLinkForKendoGrid(assignedTo) {

    var res = "<ul class='assigned-to-list'>";

    for (var i = 0; i < assignedTo.length; i++) {
        res += "<li><a class='avatar-circle' data-toggle='single-page' href='/User/Details/" + assignedTo[i].UserGUID + "'><span class='initials'>" + GetInitialsFromString(assignedTo[i].UserDisplayName) + "</span></a></li>";
    }

    res += "</ul>";

    return res;

}

function GetAssignedToContactLinkForKendoGrid(assignedTo) {

    if (assignedTo.length > 0) {
        var res = "<ul class='assigned-to-list'>";

        for (var i = 0; i < assignedTo.length; i++) {
            res += "<li><a data-toggle='single-page' href='/Contact/Details/" + assignedTo[i].Guid + "' data-action-tracking-name='AssignedToContactLink' data-action-tracking-kendogrid-onclick='true'>" + GetStringForKendoGrid(assignedTo[i].DisplayName) + " (contact)</li>";
        }

        res += "</ul>";

        return res;
    }
    else return "";

}

function GetAssignedToContactLinkAndNameForKendoGrid(assignedTo, statusText, errorText, signatureRequestGuid) {
    if (assignedTo.length > 0) {

        var res = "<ul class='assigned-to-list'>";
        for (var i = 0; i < assignedTo.length; i++) {

            //Limit the amount of contact can be seeing in that column
            if (i === 5) {
                res += "<li><a data-toggle='single-page' href='/SignatureRequest/Details/" + signatureRequestGuid + "'>View more</a></li>";
                break;
            }
            res += "<li>";
            if (assignedTo[i].IsAttorneySigner === true) {
                res += "<a data-toggle='single-page' href='/User/Details/" + assignedTo[i].Guid + "'>";
            } else {
                res += "<a data-toggle='single-page' href='/Account/Details/" + assignedTo[i].Guid + "'>";
            }

            res += GetStringForKendoGrid(assignedTo[i].ContactName).trim();
            res += "</a>";
            res += "&nbsp;<label class='tooltips' data-original-title='";
            res += TextTooltip(assignedTo[i].StatusCode, statusText, errorText);
            res += "' data-placement='top'>&nbsp;";
            res += IconSignerStatus(assignedTo[i].StatusCode);
            res += "</label>";
            res += "</li></br>";
        }
        res += "</ul>";
        return res;
    }
    else return "";
}

function TextTooltip(statusCode, statusText, errorText) {
    var text = statusText.Fail;
    switch (statusCode) {
        case 0:
            return statusText.Sign;
        case 1:
            return statusText.Pending;
        case 2:
            return (errorText.Declined != undefined ? text.replace("[error]", errorText.Declined) : "");

        case 4:
            return "";
        case 5:
        case 7:
            return (errorText.Unknown != undefined ? text.replace("[error]", errorText.Unknown) : "");
        case 6:
            return (errorText.File != undefined ? text.replace("[error]", errorText.File) : "");
        case 10:
            return statusText.Viewed;
        case 8:
        case 11:
            return (errorText.ErrorTag != undefined ? text.replace("[error]", errorText.ErrorTag) : "");
        case 12:
            return (errorText.Canceled != undefined ? text.replace("[error]", errorText.Canceled) : "");

    }
}

function IconSignerStatus(statusCode) {
    switch (statusCode) {
        case 0:
            return "<img style='width:15px;' src='/Content/images/green_Checkmark.png'/>";
        case 1:
            return "<img style='width:20px;' src='/Content/images/eSign_pending.svg'/>";
        case 2:
        case 12:
            return "<i style='color:red !important;' class='fa fa-times' aria-hidden='true'></i>";
        case 4:

            return "<i style='color:white !important;' class='icon-sign-blank' aria-hidden='true'></i>";
        case 5:
        case 6:
        case 7:
        case 8:
        case 11:
            return "<i style='color:red !important;' class='fa fa-exclamation' aria-hidden='true'></i>";
        case 10:
            return "<img style='width:20px;' src='/Content/images/eSign_viewed.svg'/>";
        case 20:
            return "<i style='color:white !important;' class='icon-sign-blank' aria-hidden='true'></i>";
        default:
            return "";
    }
}

function GetContactNameForKendoGrid(contact) {
    var isFirstName = false;
    var isLastName = false;
    var isMiddleName = false;
    var fullName = "";
    if (contact != null) {
        if (contact.FirstName != null && contact.FirstName.length > 0) {
            fullName += contact.FirstName;
            isFirstName = true;
        }

        if (contact.MiddleName != null && contact.MiddleName.length > 0) {
            if (isFirstName) {
                fullName += " ";
            }
            fullName += contact.MiddleName;
            isMiddleName = true;
        }


        if (contact.LastName != null && contact.LastName.length > 0) {
            if (isFirstName || isMiddleName) {
                fullName += " ";
            }
            fullName += contact.LastName;
            isLastName = true;
        }



        if (!isFirstName && !isLastName) {
            fullName = contact.Email;
        }
    }

    return GetStringForKendoGrid(fullName);
}

function GetPaymentSourceLinkForKendoGrid(source) {
    var guid = "";
    var name = "";
    if (source != null) {
        guid = source.Guid;
        name = source.DisplayName;
    }
    return "<a data-toggle='single-page' href='/PaymentSource/Details/" + guid + "'>" + GetStringForKendoGrid(name) + "</a>";
}

function OnKendoGridExcelExport(e) {
    var doesGridContainCustomFields = e.sender.element !== undefined && e.sender.element.context !== undefined && (e.sender.element.context.id === "accountsGrid" || e.sender.element.context.id === "contactsGrid" || e.sender.element.context.id === "projectsGrid");
    if (doesGridContainCustomFields) {
        var lastVisibleColumn;
        var emptyIndexes = [];
        for (var c = 0; c < this.columns.length; c++) {
            if (this.columns[c].field !== undefined && (this.columns[c].hidden === undefined || this.columns[c].hidden === false)) {
                lastVisibleColumn = this.columns[c];
            }
            if (this.columns[c].field === undefined && this.columns[c].template !== undefined && (this.columns[c].hidden === undefined || this.columns[c].hidden === false)) {
                lastVisibleCellIndex = e.workbook.sheets[0].rows[0].cells.findIndex(x => x.value == lastVisibleColumn.title);
                emptyIndexes.push(lastVisibleCellIndex);
                e.workbook.sheets[0].rows[0].cells.splice(lastVisibleCellIndex + 1, 0, { background: "#7a7a7a", color: "#fff", value: this.columns[c].title, colSpan: 1, rowSpan: 1 });
                lastVisibleColumn = this.columns[c];
            }
        }
    }

    var rows = e.workbook.sheets[0].rows;
    var dataItemIndex = -1;
    for (var ri = 0; ri < rows.length; ri++) {
        var worksheetRow = rows[ri];
        if (worksheetRow.type == "header")
            continue;

        if (doesGridContainCustomFields) {
            $.each(emptyIndexes, function (index, value) {
                worksheetRow.cells.splice(value + 1, 0, { value: 0 });
            });
        }

        var cell;
        if (worksheetRow.type == "group-footer" || worksheetRow.type == "footer" || worksheetRow.type == "group-header") {
            for (var wsIndex = 0; wsIndex < worksheetRow.cells.length; wsIndex++) {
                cell = worksheetRow.cells[wsIndex];
                if (cell.value) {
                    // Use jQuery.fn.text to remove the HTML and get only the text
                    cell.value = $(cell.value).text();
                    // Set the alignment
                    cell.hAlign = worksheetRow.type.endsWith("footer") ? "right" : "left";
                }
            }
        }
        else
            dataItemIndex++; // Normal row, increase index

        var dataItem = e.data[dataItemIndex];
        var worksheetColumnIndex = -1;

        var fields = [
            "Account", "Project", "PaymentSource", "LastModifiedBy", "Status", "BankAccount", "Type", "Invoice",
            "Payment", "CustomFieldValues", "AssignedTo", "Product", "UtbmsCode", "AssignedToUsers", "OriginatedBy",
            "AccountAssignedToUsers", "ProjectAssignedToUsers", "CheckPayee"
        ];

        // Go over the dataSource columns, and match datasource columns to worksheet columns
        for (var ci = 0; ci < this.columns.length; ci++) {
            var column = this.columns[ci];
            if (column == null || column.hidden)
                continue;

            worksheetColumnIndex++; // Increase column index only for visible columns.

            // Avoid rendering data in the footer row for columns that are not total or other aggregate values.
            if (worksheetRow.type.endsWith("footer") && !column.aggregates)
                continue;

            if (column.template == null)
                continue;

            var template = kendo.template(column.template);
            cell = worksheetRow.cells[worksheetColumnIndex];
            if (cell == null)
                continue;

            if (column.field !== undefined) {
                if (fields.includes(column.field)) {
                    cell.value = template(dataItem);
                    cell.value = $(cell.value).text();
                }
                else if (column.field === "CreatedBy" ) {
                    var createdby = " ";
                    if (dataItem.CreatedBy != null) {
                        createdby = dataItem.CreatedBy.DisplayName;
                    }
                    cell.value = createdby;
                }
                else if (column.field === "User") {
                    var user = " ";
                    if (dataItem.User != null) {
                        user = dataItem.User.DisplayName;
                    }
                    cell.value = user;
                }
                else if (column.field === "AccountingAccount") {
                    var accountingAccountName = "Uncategorized";
                    if (dataItem.AccountingAccount.Name != null){
                        accountingAccountName = dataItem.AccountingAccount.Name;
                    }
                    cell.value = accountingAccountName;
                }
                else if (column.field.includes("Date") || column.field.includes("Next")) {
                    cell.value = template(dataItem);
                    cell.value = GetDecodedStringForKendoGrid(cell.value).replace(/(\r\n|\n|\r)/gm, " ");;
                }
                else if (column.field.includes("FeeAmountInCents")) {
                    cell.value = cell.value / 100;
                }
            } else if (doesGridContainCustomFields) {
                if ((column.hidden === undefined || column.hidden === false) && column.template !== undefined) {
                    cell.value = template(dataItem);
                    if (typeof cell.value == "string") {
                        cell.value = cell.value.trim();
                    }
                }
            }
        }
    }
}

function GetCurrencySymbolFromCurrencyCode(currencyCode) {
    var data = {
        "USD": {
            "symbol": "$",
            "name": "US Dollar",
            "symbol_native": "$",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "USD",
            "name_plural": "US dollars"
        },
        "CAD": {
            "symbol": "CA$",
            "name": "Canadian Dollar",
            "symbol_native": "$",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "CAD",
            "name_plural": "Canadian dollars"
        },
        "EUR": {
            "symbol": "€",
            "name": "Euro",
            "symbol_native": "€",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "EUR",
            "name_plural": "euros"
        },
        "AED": {
            "symbol": "AED",
            "name": "United Arab Emirates Dirham",
            "symbol_native": "د.إ.‏",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "AED",
            "name_plural": "UAE dirhams"
        },
        "AFN": {
            "symbol": "Af",
            "name": "Afghan Afghani",
            "symbol_native": "؋",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "AFN",
            "name_plural": "Afghan Afghanis"
        },
        "ALL": {
            "symbol": "ALL",
            "name": "Albanian Lek",
            "symbol_native": "Lek",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "ALL",
            "name_plural": "Albanian lekë"
        },
        "AMD": {
            "symbol": "AMD",
            "name": "Armenian Dram",
            "symbol_native": "դր.",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "AMD",
            "name_plural": "Armenian drams"
        },
        "ARS": {
            "symbol": "AR$",
            "name": "Argentine Peso",
            "symbol_native": "$",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "ARS",
            "name_plural": "Argentine pesos"
        },
        "AUD": {
            "symbol": "AU$",
            "name": "Australian Dollar",
            "symbol_native": "$",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "AUD",
            "name_plural": "Australian dollars"
        },
        "AZN": {
            "symbol": "man.",
            "name": "Azerbaijani Manat",
            "symbol_native": "ман.",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "AZN",
            "name_plural": "Azerbaijani manats"
        },
        "BAM": {
            "symbol": "KM",
            "name": "Bosnia-Herzegovina Convertible Mark",
            "symbol_native": "KM",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "BAM",
            "name_plural": "Bosnia-Herzegovina convertible marks"
        },
        "BDT": {
            "symbol": "Tk",
            "name": "Bangladeshi Taka",
            "symbol_native": "৳",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "BDT",
            "name_plural": "Bangladeshi takas"
        },
        "BGN": {
            "symbol": "BGN",
            "name": "Bulgarian Lev",
            "symbol_native": "лв.",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "BGN",
            "name_plural": "Bulgarian leva"
        },
        "BHD": {
            "symbol": "BD",
            "name": "Bahraini Dinar",
            "symbol_native": "د.ب.‏",
            "decimal_digits": 3,
            "rounding": 0,
            "code": "BHD",
            "name_plural": "Bahraini dinars"
        },
        "BIF": {
            "symbol": "FBu",
            "name": "Burundian Franc",
            "symbol_native": "FBu",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "BIF",
            "name_plural": "Burundian francs"
        },
        "BND": {
            "symbol": "BN$",
            "name": "Brunei Dollar",
            "symbol_native": "$",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "BND",
            "name_plural": "Brunei dollars"
        },
        "BOB": {
            "symbol": "Bs",
            "name": "Bolivian Boliviano",
            "symbol_native": "Bs",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "BOB",
            "name_plural": "Bolivian bolivianos"
        },
        "BRL": {
            "symbol": "R$",
            "name": "Brazilian Real",
            "symbol_native": "R$",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "BRL",
            "name_plural": "Brazilian reals"
        },
        "BWP": {
            "symbol": "BWP",
            "name": "Botswanan Pula",
            "symbol_native": "P",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "BWP",
            "name_plural": "Botswanan pulas"
        },
        "BYR": {
            "symbol": "BYR",
            "name": "Belarusian Ruble",
            "symbol_native": "BYR",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "BYR",
            "name_plural": "Belarusian rubles"
        },
        "BZD": {
            "symbol": "BZ$",
            "name": "Belize Dollar",
            "symbol_native": "$",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "BZD",
            "name_plural": "Belize dollars"
        },
        "CDF": {
            "symbol": "CDF",
            "name": "Congolese Franc",
            "symbol_native": "FrCD",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "CDF",
            "name_plural": "Congolese francs"
        },
        "CHF": {
            "symbol": "CHF",
            "name": "Swiss Franc",
            "symbol_native": "CHF",
            "decimal_digits": 2,
            "rounding": 0.05,
            "code": "CHF",
            "name_plural": "Swiss francs"
        },
        "CLP": {
            "symbol": "CL$",
            "name": "Chilean Peso",
            "symbol_native": "$",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "CLP",
            "name_plural": "Chilean pesos"
        },
        "CNY": {
            "symbol": "CN¥",
            "name": "Chinese Yuan",
            "symbol_native": "CN¥",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "CNY",
            "name_plural": "Chinese yuan"
        },
        "COP": {
            "symbol": "CO$",
            "name": "Colombian Peso",
            "symbol_native": "$",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "COP",
            "name_plural": "Colombian pesos"
        },
        "CRC": {
            "symbol": "₡",
            "name": "Costa Rican Colón",
            "symbol_native": "₡",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "CRC",
            "name_plural": "Costa Rican colóns"
        },
        "CVE": {
            "symbol": "CV$",
            "name": "Cape Verdean Escudo",
            "symbol_native": "CV$",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "CVE",
            "name_plural": "Cape Verdean escudos"
        },
        "CZK": {
            "symbol": "Kč",
            "name": "Czech Republic Koruna",
            "symbol_native": "Kč",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "CZK",
            "name_plural": "Czech Republic korunas"
        },
        "DJF": {
            "symbol": "Fdj",
            "name": "Djiboutian Franc",
            "symbol_native": "Fdj",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "DJF",
            "name_plural": "Djiboutian francs"
        },
        "DKK": {
            "symbol": "Dkr",
            "name": "Danish Krone",
            "symbol_native": "kr",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "DKK",
            "name_plural": "Danish kroner"
        },
        "DOP": {
            "symbol": "RD$",
            "name": "Dominican Peso",
            "symbol_native": "RD$",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "DOP",
            "name_plural": "Dominican pesos"
        },
        "DZD": {
            "symbol": "DA",
            "name": "Algerian Dinar",
            "symbol_native": "د.ج.‏",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "DZD",
            "name_plural": "Algerian dinars"
        },
        "EEK": {
            "symbol": "Ekr",
            "name": "Estonian Kroon",
            "symbol_native": "kr",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "EEK",
            "name_plural": "Estonian kroons"
        },
        "EGP": {
            "symbol": "EGP",
            "name": "Egyptian Pound",
            "symbol_native": "ج.م.‏",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "EGP",
            "name_plural": "Egyptian pounds"
        },
        "ERN": {
            "symbol": "Nfk",
            "name": "Eritrean Nakfa",
            "symbol_native": "Nfk",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "ERN",
            "name_plural": "Eritrean nakfas"
        },
        "ETB": {
            "symbol": "Br",
            "name": "Ethiopian Birr",
            "symbol_native": "Br",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "ETB",
            "name_plural": "Ethiopian birrs"
        },
        "GBP": {
            "symbol": "£",
            "name": "British Pound Sterling",
            "symbol_native": "£",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "GBP",
            "name_plural": "British pounds sterling"
        },
        "GEL": {
            "symbol": "GEL",
            "name": "Georgian Lari",
            "symbol_native": "GEL",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "GEL",
            "name_plural": "Georgian laris"
        },
        "GHS": {
            "symbol": "GH₵",
            "name": "Ghanaian Cedi",
            "symbol_native": "GH₵",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "GHS",
            "name_plural": "Ghanaian cedis"
        },
        "GNF": {
            "symbol": "FG",
            "name": "Guinean Franc",
            "symbol_native": "FG",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "GNF",
            "name_plural": "Guinean francs"
        },
        "GTQ": {
            "symbol": "GTQ",
            "name": "Guatemalan Quetzal",
            "symbol_native": "Q",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "GTQ",
            "name_plural": "Guatemalan quetzals"
        },
        "HKD": {
            "symbol": "HK$",
            "name": "Hong Kong Dollar",
            "symbol_native": "$",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "HKD",
            "name_plural": "Hong Kong dollars"
        },
        "HNL": {
            "symbol": "HNL",
            "name": "Honduran Lempira",
            "symbol_native": "L",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "HNL",
            "name_plural": "Honduran lempiras"
        },
        "HRK": {
            "symbol": "kn",
            "name": "Croatian Kuna",
            "symbol_native": "kn",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "HRK",
            "name_plural": "Croatian kunas"
        },
        "HUF": {
            "symbol": "Ft",
            "name": "Hungarian Forint",
            "symbol_native": "Ft",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "HUF",
            "name_plural": "Hungarian forints"
        },
        "IDR": {
            "symbol": "Rp",
            "name": "Indonesian Rupiah",
            "symbol_native": "Rp",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "IDR",
            "name_plural": "Indonesian rupiahs"
        },
        "ILS": {
            "symbol": "₪",
            "name": "Israeli New Sheqel",
            "symbol_native": "₪",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "ILS",
            "name_plural": "Israeli new sheqels"
        },
        "INR": {
            "symbol": "Rs",
            "name": "Indian Rupee",
            "symbol_native": "টকা",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "INR",
            "name_plural": "Indian rupees"
        },
        "IQD": {
            "symbol": "IQD",
            "name": "Iraqi Dinar",
            "symbol_native": "د.ع.‏",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "IQD",
            "name_plural": "Iraqi dinars"
        },
        "IRR": {
            "symbol": "IRR",
            "name": "Iranian Rial",
            "symbol_native": "﷼",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "IRR",
            "name_plural": "Iranian rials"
        },
        "ISK": {
            "symbol": "Ikr",
            "name": "Icelandic Króna",
            "symbol_native": "kr",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "ISK",
            "name_plural": "Icelandic krónur"
        },
        "JMD": {
            "symbol": "J$",
            "name": "Jamaican Dollar",
            "symbol_native": "$",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "JMD",
            "name_plural": "Jamaican dollars"
        },
        "JOD": {
            "symbol": "JD",
            "name": "Jordanian Dinar",
            "symbol_native": "د.أ.‏",
            "decimal_digits": 3,
            "rounding": 0,
            "code": "JOD",
            "name_plural": "Jordanian dinars"
        },
        "JPY": {
            "symbol": "¥",
            "name": "Japanese Yen",
            "symbol_native": "￥",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "JPY",
            "name_plural": "Japanese yen"
        },
        "KES": {
            "symbol": "Ksh",
            "name": "Kenyan Shilling",
            "symbol_native": "Ksh",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "KES",
            "name_plural": "Kenyan shillings"
        },
        "KHR": {
            "symbol": "KHR",
            "name": "Cambodian Riel",
            "symbol_native": "៛",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "KHR",
            "name_plural": "Cambodian riels"
        },
        "KMF": {
            "symbol": "CF",
            "name": "Comorian Franc",
            "symbol_native": "FC",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "KMF",
            "name_plural": "Comorian francs"
        },
        "KRW": {
            "symbol": "₩",
            "name": "South Korean Won",
            "symbol_native": "₩",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "KRW",
            "name_plural": "South Korean won"
        },
        "KWD": {
            "symbol": "KD",
            "name": "Kuwaiti Dinar",
            "symbol_native": "د.ك.‏",
            "decimal_digits": 3,
            "rounding": 0,
            "code": "KWD",
            "name_plural": "Kuwaiti dinars"
        },
        "KZT": {
            "symbol": "KZT",
            "name": "Kazakhstani Tenge",
            "symbol_native": "тңг.",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "KZT",
            "name_plural": "Kazakhstani tenges"
        },
        "LBP": {
            "symbol": "LB£",
            "name": "Lebanese Pound",
            "symbol_native": "ل.ل.‏",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "LBP",
            "name_plural": "Lebanese pounds"
        },
        "LKR": {
            "symbol": "SLRs",
            "name": "Sri Lankan Rupee",
            "symbol_native": "SL Re",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "LKR",
            "name_plural": "Sri Lankan rupees"
        },
        "LTL": {
            "symbol": "Lt",
            "name": "Lithuanian Litas",
            "symbol_native": "Lt",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "LTL",
            "name_plural": "Lithuanian litai"
        },
        "LVL": {
            "symbol": "Ls",
            "name": "Latvian Lats",
            "symbol_native": "Ls",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "LVL",
            "name_plural": "Latvian lati"
        },
        "LYD": {
            "symbol": "LD",
            "name": "Libyan Dinar",
            "symbol_native": "د.ل.‏",
            "decimal_digits": 3,
            "rounding": 0,
            "code": "LYD",
            "name_plural": "Libyan dinars"
        },
        "MAD": {
            "symbol": "MAD",
            "name": "Moroccan Dirham",
            "symbol_native": "د.م.‏",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "MAD",
            "name_plural": "Moroccan dirhams"
        },
        "MDL": {
            "symbol": "MDL",
            "name": "Moldovan Leu",
            "symbol_native": "MDL",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "MDL",
            "name_plural": "Moldovan lei"
        },
        "MGA": {
            "symbol": "MGA",
            "name": "Malagasy Ariary",
            "symbol_native": "MGA",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "MGA",
            "name_plural": "Malagasy Ariaries"
        },
        "MKD": {
            "symbol": "MKD",
            "name": "Macedonian Denar",
            "symbol_native": "MKD",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "MKD",
            "name_plural": "Macedonian denari"
        },
        "MMK": {
            "symbol": "MMK",
            "name": "Myanma Kyat",
            "symbol_native": "K",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "MMK",
            "name_plural": "Myanma kyats"
        },
        "MOP": {
            "symbol": "MOP$",
            "name": "Macanese Pataca",
            "symbol_native": "MOP$",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "MOP",
            "name_plural": "Macanese patacas"
        },
        "MUR": {
            "symbol": "MURs",
            "name": "Mauritian Rupee",
            "symbol_native": "MURs",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "MUR",
            "name_plural": "Mauritian rupees"
        },
        "MXN": {
            "symbol": "MX$",
            "name": "Mexican Peso",
            "symbol_native": "$",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "MXN",
            "name_plural": "Mexican pesos"
        },
        "MYR": {
            "symbol": "RM",
            "name": "Malaysian Ringgit",
            "symbol_native": "RM",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "MYR",
            "name_plural": "Malaysian ringgits"
        },
        "MZN": {
            "symbol": "MTn",
            "name": "Mozambican Metical",
            "symbol_native": "MTn",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "MZN",
            "name_plural": "Mozambican meticals"
        },
        "NAD": {
            "symbol": "N$",
            "name": "Namibian Dollar",
            "symbol_native": "N$",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "NAD",
            "name_plural": "Namibian dollars"
        },
        "NGN": {
            "symbol": "₦",
            "name": "Nigerian Naira",
            "symbol_native": "₦",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "NGN",
            "name_plural": "Nigerian nairas"
        },
        "NIO": {
            "symbol": "C$",
            "name": "Nicaraguan Córdoba",
            "symbol_native": "C$",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "NIO",
            "name_plural": "Nicaraguan córdobas"
        },
        "NOK": {
            "symbol": "Nkr",
            "name": "Norwegian Krone",
            "symbol_native": "kr",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "NOK",
            "name_plural": "Norwegian kroner"
        },
        "NPR": {
            "symbol": "NPRs",
            "name": "Nepalese Rupee",
            "symbol_native": "नेरू",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "NPR",
            "name_plural": "Nepalese rupees"
        },
        "NZD": {
            "symbol": "NZ$",
            "name": "New Zealand Dollar",
            "symbol_native": "$",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "NZD",
            "name_plural": "New Zealand dollars"
        },
        "OMR": {
            "symbol": "OMR",
            "name": "Omani Rial",
            "symbol_native": "ر.ع.‏",
            "decimal_digits": 3,
            "rounding": 0,
            "code": "OMR",
            "name_plural": "Omani rials"
        },
        "PAB": {
            "symbol": "B/.",
            "name": "Panamanian Balboa",
            "symbol_native": "B/.",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "PAB",
            "name_plural": "Panamanian balboas"
        },
        "PEN": {
            "symbol": "S/.",
            "name": "Peruvian Nuevo Sol",
            "symbol_native": "S/.",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "PEN",
            "name_plural": "Peruvian nuevos soles"
        },
        "PHP": {
            "symbol": "₱",
            "name": "Philippine Peso",
            "symbol_native": "₱",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "PHP",
            "name_plural": "Philippine pesos"
        },
        "PKR": {
            "symbol": "PKRs",
            "name": "Pakistani Rupee",
            "symbol_native": "₨",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "PKR",
            "name_plural": "Pakistani rupees"
        },
        "PLN": {
            "symbol": "zł",
            "name": "Polish Zloty",
            "symbol_native": "zł",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "PLN",
            "name_plural": "Polish zlotys"
        },
        "PYG": {
            "symbol": "₲",
            "name": "Paraguayan Guarani",
            "symbol_native": "₲",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "PYG",
            "name_plural": "Paraguayan guaranis"
        },
        "QAR": {
            "symbol": "QR",
            "name": "Qatari Rial",
            "symbol_native": "ر.ق.‏",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "QAR",
            "name_plural": "Qatari rials"
        },
        "RON": {
            "symbol": "RON",
            "name": "Romanian Leu",
            "symbol_native": "RON",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "RON",
            "name_plural": "Romanian lei"
        },
        "RSD": {
            "symbol": "din.",
            "name": "Serbian Dinar",
            "symbol_native": "дин.",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "RSD",
            "name_plural": "Serbian dinars"
        },
        "RUB": {
            "symbol": "RUB",
            "name": "Russian Ruble",
            "symbol_native": "руб.",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "RUB",
            "name_plural": "Russian rubles"
        },
        "RWF": {
            "symbol": "RWF",
            "name": "Rwandan Franc",
            "symbol_native": "FR",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "RWF",
            "name_plural": "Rwandan francs"
        },
        "SAR": {
            "symbol": "SR",
            "name": "Saudi Riyal",
            "symbol_native": "ر.س.‏",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "SAR",
            "name_plural": "Saudi riyals"
        },
        "SDG": {
            "symbol": "SDG",
            "name": "Sudanese Pound",
            "symbol_native": "SDG",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "SDG",
            "name_plural": "Sudanese pounds"
        },
        "SEK": {
            "symbol": "Skr",
            "name": "Swedish Krona",
            "symbol_native": "kr",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "SEK",
            "name_plural": "Swedish kronor"
        },
        "SGD": {
            "symbol": "S$",
            "name": "Singapore Dollar",
            "symbol_native": "$",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "SGD",
            "name_plural": "Singapore dollars"
        },
        "SOS": {
            "symbol": "Ssh",
            "name": "Somali Shilling",
            "symbol_native": "Ssh",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "SOS",
            "name_plural": "Somali shillings"
        },
        "SYP": {
            "symbol": "SY£",
            "name": "Syrian Pound",
            "symbol_native": "ل.س.‏",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "SYP",
            "name_plural": "Syrian pounds"
        },
        "THB": {
            "symbol": "฿",
            "name": "Thai Baht",
            "symbol_native": "฿",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "THB",
            "name_plural": "Thai baht"
        },
        "TND": {
            "symbol": "DT",
            "name": "Tunisian Dinar",
            "symbol_native": "د.ت.‏",
            "decimal_digits": 3,
            "rounding": 0,
            "code": "TND",
            "name_plural": "Tunisian dinars"
        },
        "TOP": {
            "symbol": "T$",
            "name": "Tongan Paʻanga",
            "symbol_native": "T$",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "TOP",
            "name_plural": "Tongan paʻanga"
        },
        "TRY": {
            "symbol": "TL",
            "name": "Turkish Lira",
            "symbol_native": "TL",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "TRY",
            "name_plural": "Turkish Lira"
        },
        "TTD": {
            "symbol": "TT$",
            "name": "Trinidad and Tobago Dollar",
            "symbol_native": "$",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "TTD",
            "name_plural": "Trinidad and Tobago dollars"
        },
        "TWD": {
            "symbol": "NT$",
            "name": "New Taiwan Dollar",
            "symbol_native": "NT$",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "TWD",
            "name_plural": "New Taiwan dollars"
        },
        "TZS": {
            "symbol": "TSh",
            "name": "Tanzanian Shilling",
            "symbol_native": "TSh",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "TZS",
            "name_plural": "Tanzanian shillings"
        },
        "UAH": {
            "symbol": "₴",
            "name": "Ukrainian Hryvnia",
            "symbol_native": "₴",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "UAH",
            "name_plural": "Ukrainian hryvnias"
        },
        "UGX": {
            "symbol": "USh",
            "name": "Ugandan Shilling",
            "symbol_native": "USh",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "UGX",
            "name_plural": "Ugandan shillings"
        },
        "UYU": {
            "symbol": "$U",
            "name": "Uruguayan Peso",
            "symbol_native": "$",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "UYU",
            "name_plural": "Uruguayan pesos"
        },
        "UZS": {
            "symbol": "UZS",
            "name": "Uzbekistan Som",
            "symbol_native": "UZS",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "UZS",
            "name_plural": "Uzbekistan som"
        },
        "VEF": {
            "symbol": "Bs.F.",
            "name": "Venezuelan Bolívar",
            "symbol_native": "Bs.F.",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "VEF",
            "name_plural": "Venezuelan bolívars"
        },
        "VND": {
            "symbol": "₫",
            "name": "Vietnamese Dong",
            "symbol_native": "₫",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "VND",
            "name_plural": "Vietnamese dong"
        },
        "XAF": {
            "symbol": "FCFA",
            "name": "CFA Franc BEAC",
            "symbol_native": "FCFA",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "XAF",
            "name_plural": "CFA francs BEAC"
        },
        "XOF": {
            "symbol": "CFA",
            "name": "CFA Franc BCEAO",
            "symbol_native": "CFA",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "XOF",
            "name_plural": "CFA francs BCEAO"
        },
        "YER": {
            "symbol": "YR",
            "name": "Yemeni Rial",
            "symbol_native": "ر.ي.‏",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "YER",
            "name_plural": "Yemeni rials"
        },
        "ZAR": {
            "symbol": "R",
            "name": "South African Rand",
            "symbol_native": "R",
            "decimal_digits": 2,
            "rounding": 0,
            "code": "ZAR",
            "name_plural": "South African rand"
        },
        "ZMK": {
            "symbol": "ZK",
            "name": "Zambian Kwacha",
            "symbol_native": "ZK",
            "decimal_digits": 0,
            "rounding": 0,
            "code": "ZMK",
            "name_plural": "Zambian kwachas"
        }
    };

    var symbol = "";
    $.each(data, function (i, v) {
        if (i === currencyCode) {
            symbol = v.symbol;
            return symbol;
        }
        return symbol;
    });
}

function activateColumnChooserForKendoGrid(gridId, chooseColumnsText) {
    if (chooseColumnsText == null) {
        chooseColumnsText = "Choose Columns";
    }
    var gridColumnChooser = $("#" + gridId).getKendoGrid();
    $("#" + gridId + "-menu").kendoColumnMenu({
        filterable: false,
        sortable: false,
        dataSource: gridColumnChooser.dataSource,
        columns: gridColumnChooser.columns,
        owner: gridColumnChooser
    });

    $("#" + gridId + "-menu .k-header-column-menu").html("<i style='margin-right:5px;' class='fa fa-cog margin-right-5'></i><span>" + chooseColumnsText + "</span>");
    $("#" + gridId + "-menu").show();
}

// Keep in mind, status may not reflect directly from the database.
// The AutoMapper Configuration also mapped certain status and status reasons to different
// statuses. 
function buildRecurringPaymentStatusBadge(status, statusReason, headNoteId) {
    var statusText;
    var toolTipText;

    switch (status) {
        case 0:
            {
                statusText = "Hanging";
                break;
            }
        case 1:
            {
                statusText = "Active";
                break;
            }
        case 2:
            {
                statusText = "Completed";
                break;
            }
        case 3:
            {
                statusText = "Deleted";
                break;
            }
        case 4:
            {
                statusText = "Canceled";
                break;
            }
        case 5:
        default:
            {
                statusText = "Hanging";
                break;
            }
    }

    //Determine if this needs a ToolTip
    if (statusReason === 2) {
        if (headNoteId) {
            //Expired
            if (status === 0) {
                toolTipText =
                    "There was an issue creating this Payment Plan, please Cancel the Plan and create a new one";
            } else if (status === 4 || status === 5) {
                toolTipText =
                    "There was a problem deleting this plan. Please try again or contact support so it can be manually deleted.";
            }
        } else {
            toolTipText =
                "There was a problem deleting this plan. Please contact support so it can be manually deleted.";
        }
    } else {
        if (status >= 6) {
            toolTipText = "There was an issue creating this Payment Plan, please Cancel the Plan and create a new one";
        }
    }

    if (toolTipText) {
        return "<span class='grid-status grid-status-lg label label-" + getRecurringPaymentStatusBadgeColor(statusText) + " tooltips' data-original-title='" + toolTipText + "' data-placement='bottom'>" + statusText + "</span>";
    }

    return "<span class='grid-status grid-status-lg label label-" + getRecurringPaymentStatusBadgeColor(statusText) + "'>" + statusText + "</span>";
}

function getRecurringPaymentStatusBadgeColor(status) {
    if (status === "Active" || status === "Completed") {
        return "success";
    }

    return "danger";
}
function FormatPhoneNumber(phoneNumberString) {
    if (!phoneNumberString) {
        return '';
    }
    try {        
        var result = phoneNumberString.replace(/(\d*)\s*(\d{3})\s*(\d{3})\s*(\d{4})/g, '$1 ($2) $3-$4');
        return result.trim();
    }
    catch (e) {
        return phoneNumberString;
    }
};
//knockout and bootstrap radio/toggle buttons
ko.bindingHandlers.radio = {
    init: function(element, valueAccessor, allBindings, data, context) {
        var $buttons, $element, elementBindings, observable;
        observable = valueAccessor();
        if (!ko.isWriteableObservable(observable)) {
            throw "You must pass an observable or writeable computed";
        }
        $element = $(element);
        if ($element.hasClass("btn")) {
            $buttons = $element;
        } else {
            $buttons = $(".btn", $element);
        }
        elementBindings = allBindings();
        $buttons.each(function() {
            var $btn, btn, radioValue;
            btn = this;
            $btn = $(btn);
            radioValue = elementBindings.radioValue || $btn.attr("data-value") || $btn.attr("value") || $btn.text();
            $btn.on("click", function() {
                observable(ko.utils.unwrapObservable(radioValue));
            });
            return ko.computed({
                disposeWhenNodeIsRemoved: btn,
                read: function() {
                    $btn.toggleClass("active", observable() === ko.utils.unwrapObservable(radioValue));
                }
            });
        });
    }
};

ko.bindingHandlers.checkbox = {
    init: function(element, valueAccessor, allBindings, data, context) {
        var $element, observable;
        observable = valueAccessor();
        if (!ko.isWriteableObservable(observable)) {
            throw "You must pass an observable or writeable computed";
        }
        $element = $(element);
        $element.on("click", function() {
            observable(!observable());
        });
        ko.computed({
            disposeWhenNodeIsRemoved: element,
            read: function() {
                $element.toggleClass("active", observable());
            }
        });
    }
};


//------------------Date Picker Knockout Custom Binding
ko.bindingHandlers.kendoNumericTextBox = {
    init: function(element, valueAccessor, allBindingsAccessor, viewModel) {
        var unwrap = ko.utils.unwrapObservable;
        var dataSource = valueAccessor();
        var binding = allBindingsAccessor();
        var options = {};
        var source;

        if (binding.numericTextBoxOptions) {
            options = $.extend(options, binding.numericTextBoxOptions);
        }

        if (dataSource) {
            var handleValueChange = function() {
                //change the knockout model object with the specified value
                var changeModel = function(value) {
                    if (ko.isWriteableObservable(dataSource)) {
                        //Since this is an observable, the update part will fire and select the 
                        //  appropriate display values in the controls
                        dataSource(value);
                    } else { //write to non-observable
                        if (binding['_ko_property_writers'] && binding['_ko_property_writers']['kendoNumericTextBox']) {
                            binding['_ko_property_writers']['kendoNumericTextBox'](value);
                        }
                    }
                };

                //Get the selected Value from the Kendo ComboBox
                var selectedValue = this.value();
                //If they dont select anything, then there intent is to null out the value
                if (!selectedValue) {
                    changeModel(null);
                } else {
                    changeModel(selectedValue);
                }
                return false;
            };
            options.change = handleValueChange;
            //$(element).on('change', handleValueChange);
        }

        //handle the choices being updated in a Dependant Observable (DO), so the update function doesn't 
        // have to do it each time the value is updated. Since we are passing the dataSource in DO, if it is
        // an observable, when you change the dataSource, the dependentObservable will be re-evaluated
        // and its subscribe event will fire allowing us to update the autocomplete datasource
        var mappedSource = ko.dependentObservable(function() {
            return unwrap(dataSource);
        }, viewModel);
        //Subscribe to the knockout observable array to get new/remove items
        mappedSource.subscribe(function(newValue) {
            var numericText = $(element).data('kendoNumericTextBox');
            if (numericText.value() !== newValue)
                numericText.value(newValue);
        });

        options.value = mappedSource();
        $(element).kendoNumericTextBox(options);
    },
    update: function(element, valueAccessor, allBindingsAccessor, viewModel) {
        //update value based on a model change
        var unwrap = ko.utils.unwrapObservable;
        var dataSource = valueAccessor();
        var binding = allBindingsAccessor();
        var valueProp = unwrap(binding.optionsValue);
        var labelProp = unwrap(binding.optionsText) || valueProp;

        if (dataSource) {
            var currentModelValue = unwrap(dataSource);
            if (dataSource)
                $(element).data('kendoNumericTextBox').value(currentModelValue);
            else
                $(element).data('kendoNumericTextBox').value('');
        }
    }
};;
/**
 * @param {any} comboBox
 * @param {any} window
 * @param {any} name
 * @param {any} url
 * @param {any} tenantType
 * @param {any} isVirtualization
 * @param {any} hiddenFilter Represents the filter for the Account and Matter combo boxes.
                             The value of the element is extracted and passed to the controller.
                             The controller will get the value and parse it in order to
                             auto fill the first name, middle name and last name, accordingly, for the Account,
                             and the matter name for the Matter.
 */
function newFromComboBox(comboBox, window, name, url, tenantType, isVirtualization, hiddenFilter, beforeSend) {
    if (comboBox == undefined) {
        return;
    }

    var that = this;
    this.newId;
    this.forceComboBoxRefresh;
    this.isWindowOpened = false;

    this.windowClosed = function () {
        // the variable "that" is available and references the User instance
        if (that.isWindowOpened) {
            that.isWindowOpened = false;
        }
        else {
            return;
        }
        if (that.value == jQuery.Guid.Empty()) {
            that.value = null;
            comboBox.value("");
        }
        if (that.newId || that.forceComboBoxRefresh) {
            comboBox.dataSource.read().then(function () {
                comboBox.value(that.newId);
            });
        }
    };

    this.comboBoxClosed = function () {
        //check to see if we need to cascade from an accountId:    
        var accountComboBoxSelector = comboBox.element[0].id.replace("ProjectGuid", "AccountGuid");
        var accountComboBox = $("#" + accountComboBoxSelector).getKendoDropDownList();        
        var urlToUse = url;

        if (that.value == jQuery.Guid.Empty()) {
            if (url != null) {

                if (accountComboBox != null) {
                    //this is for cascading project combo box, which needs to create a project with a specific accountId

                    if (comboBox.element[0].id.indexOf("ProjectGuid") > -1) //this is a project combo box, need to make sure a contact is selected before creating anew project
                    {
                        var projectName = "project";
                        if (tenantType == "PracticePanther") {
                            projectName = "matter";
                        }

                        //make sure an account is selected
                        if (accountComboBox.dataItem() == null || accountComboBox.dataItem().Guid == jQuery.Guid.Empty() || accountComboBox.dataItem().Guid == "") {
                            //no account is selected
                            alert("Please select a contact before creating a new " + projectName + ".");
                            comboBox.value("");
                            return;
                        }
                        else {
                            urlToUse = urlToUse + "?AccountGuid=" + accountComboBox.value();
                        }
                    }
                }
            }
            that.isWindowOpened = true;

            var filterValue = "";
            if ($("#" + hiddenFilter).val()) {
                var separator = "&";
                if (urlToUse && urlToUse.indexOf('?') === -1) {
                    separator = "?";
                }
                filterValue = separator + "filterValue=" + $("#" + hiddenFilter).val();
                $("#" + hiddenFilter).val("");
            }

            var urlToUse = urlToUse + filterValue;

            pantherModalOpenUrl(urlToUse, window[0].id, false, beforeSend);
        }
		// If issues appear in the future, try calling window.modal as an else
    }

    var isFirstVirtualizationChange = true;
    this.comboBoxChanged = function () {
        //if (isVirtualization && isFirstVirtualizationChange)
        //{
        //    isFirstVirtualizationChange = false;
        //    return;
        //}
        if (this.dataItem() != null && this.dataItem().Guid === jQuery.Guid.Empty()) {
                that.value = jQuery.Guid.Empty();//used to trigger the open window event in combo box closed
                comboBox.value("");
            } else {
                that.value = undefined;
            }
        
    };
    this.comboBoxDataBound = function () {
        isComboBoxDataBound = true;
        if (!isVirtualization) { //no need to add a data item when loading from a virtualized dropdownlist
            if (!this._adding) {
                //add the "ADD NEW" entry
                if (comboBox.dataSource.data()[0] == null || !jQuery.Guid.IsEmpty(comboBox.dataSource.data()[0].Guid)) {
                    this._adding = true;
                    comboBox.dataSource.insert(0, {
                        "Guid": jQuery.Guid.Empty(),
                        "Name": "New " + name,
                        "Type": ""
                    });
                    this._adding = false;
                }
            }
        }
    };

    this.comboBoxDataSourceChanged = function () {

        if (!isVirtualization) {
            if (that.newId != jQuery.Guid.Empty() && that.newId != undefined && that.newId != comboBox.value()) {
                comboBox.select(function (dataItem) {
                    return dataItem.Guid === that.newId;
                });
                comboBox.focus();
            } else if (that.newId != undefined && jQuery.Guid.IsEmpty(that.newId)) {
                comboBox.select(null);
            }
        }        
    }

    comboBox.bind('close', this.comboBoxClosed);
    comboBox.bind('change', this.comboBoxChanged);
    comboBox.bind('dataBound', this.comboBoxDataBound);

    comboBox.dataSource.bind('change', this.comboBoxDataSourceChanged);

    //window.bind('deactivate', this.windowDeactivated);
    window = $("#create-from-combobox-modal");//override windows to only show the master window
    window.on('hidden.bs.modal', this.windowClosed);
};
//https://github.com/tborychowski/formparams


function pantherSaveFormFilters(formName) {
    try {
        localStorage.setItem("filter-" + formName + "-" + stripQueryStringAndHashFromPath(), JSON.stringify($("#" + formName).formParams()));
        console.log('saved form data');
    }
    catch (e) {
        try {
            localStorage.clear();
        }
        catch (e) {
            console.log("Unable to access local storage");
        }
        console.log('error saving form data');
    }
}

function pantherLoadFormFilters(formName) {
    try {
        var item = localStorage.getItem("filter-" + formName + "-" + stripQueryStringAndHashFromPath());
        var formParams = JSON.parse(item);
        if (formParams == null) {
            console.log('form data was not loaded');
            return;
        }
        //$("#" + formName).formParams(formParams);
        //try
        //{
        //    //update date range picker
        //    if (formParams.StartDate != null && formParams.StartDate != "") 
        //    {                
        //        $("#" + formName + " .date-range-picker").data('daterangepicker').setStartDate(formParams.StartDate);
        //        $("#" + formName + " .date-range-picker").data('daterangepicker').setEndDate(formParams.EndDate);

        //        var start = $("#" + formName + " .date-range-picker").data('daterangepicker').startDate;
        //        var label = $("#" + formName + " .date-range-picker").data('daterangepicker').chosenLabel;
        //        if (start._d.toDateString() === moment().startOf('year').subtract('year', 10)._d.toDateString()) {
        //            $("#" + formName + " .date-range-picker span").html(label);
        //        }
        //        else {
        //            $("#" + formName + " .date-range-picker span").text(formParams.StartDate + " - " + formParams.EndDate);
        //        }
        //    }
        //}
        //catch (e) {

        //}
        console.log('loaded form data');

        return formParams;
    }
    catch (e) {
        console.log('Error loading form data');
    }
}

var stripQueryStringAndHashFromPath = function () {

    return document.location.href.split("?")[0].split("#")[0];
}
;
"use strict";
var PreserveKendoGrid = function () {

    var isIgnoreGridStateChanges = false;
    var g_saveGridState = function (gridName) { 
        try {
            //using a setTimeout so we can have the latest changes on the grid avaiable 
            setTimeout(function () {
                if (isIgnoreGridStateChanges) return;
                var grid = $("#" + gridName).getKendoGrid();
                var options = grid.getOptions();
                try {
                    localStorage["kendo-grid-options-" + gridName + "-" + stripQueryStringAndHashFromPath()] = kendo.stringify(options);
                    try {
                        //set page size and fix bug with Kendo
                        var pageSize = 25;
                        var currentPageSize = grid.dataSource.pageSize();
                        if (currentPageSize > 25 && currentPageSize <= 50) {
                            pageSize = 50;
                        }
                        else if (currentPageSize > 51 && currentPageSize <= 100) {
                            pageSize = 100;
                        }
                        else if (currentPageSize > 101 && currentPageSize <= 200) {
                            pageSize = 200;
                        }
                        else if (currentPageSize > 201 && currentPageSize <= 500) {
                            pageSize = 500;
                        }
                        else if (currentPageSize > 501 && currentPageSize <= 1000) {
                            pageSize = 1000;
                        }
                        else if (currentPageSize > 1001) {
                            pageSize = 1000;
                        }                        

                        $.cookie("kendo-grid-page-size-" + gridName, pageSize, { expires: 365, path: '/', secure: true });
                    }
                    catch (e) {
                        console.log("Unable to save page size");
                    }
          
            }
            catch (e) {
                console.log("Unable to access local storage");
                }
            });
        }
        catch (e) {
            //local storage over quota
            localStorage.clear();
        }
        $(function () {
            pantherModalsInit();
            pantherSinglePageInit();
        });
    }

    var g_dataBound = function (e) {

        //localStorage.clear();
    }

    var stripQueryStringAndHashFromPath = function () {
        var stripped = document.location.href.split("?")[0].split("#")[0].replace("http://", "").replace("https://", "");
        var splitSlash = stripped.split("/");
        var res = "";
        if (splitSlash.length > 0) {
            res += "/" + splitSlash[0];
        }
        if (splitSlash.length > 1) {
            res += "/" + splitSlash[1];
        }
        if (splitSlash.length > 2) {
            res += "/" + splitSlash[2];
        }
        return res;
    }
    //Reordering Column based on the last state that was saved in the local storage.
    // Using Kendo UI grid .Data instead of getKendoGrid. .Data didn't give exceptions when using reorderColumn
    // gridName - Name of the current grid being reordered
    // options - Grid options
    var loadColumnReorderState = function (gridName, options) {
        try {
            var gridByData = $('#' + gridName).data("kendoGrid");
            if (options != null && options != "null") {
                var savedOptions = JSON.parse(options);
                var currentColumns = $.extend(true, [], gridByData.columns);
                //loop through all the original columns.
                for (var i = 1; i < currentColumns.length; i++) {
                    var currentColumn = currentColumns[i];
                    var currentColumnField = currentColumns[i].field;
                    var col = $.grep(gridByData.columns, function (item) { return item.field == currentColumnField; });
                    //Find the new index of the save state of the column.
                    var newIndex = savedOptions.columns.findIndex(function (e) { return e.field == currentColumnField; })
                    //Reorder column if it's in position 0 or greater. Anything under zero will crash the grid.
                    if (newIndex >= 0) {
                        gridByData.reorderColumn(newIndex, col[0]);
                    }
                    
                }
            }
        } catch (e) {
            console.log("Unable to reorder column.");
        }

    }

    function setColumnWidths(grid, savedOptions, gridName) {
        try {
            if (savedOptions != null && savedOptions != "null") {
                var options = JSON.parse(savedOptions);
                var lockedCount = 0;
                var hiddenCount = 0;
                for (var i = 0; i < options.columns.length; i++) {

                    if (options.columns[i].hasOwnProperty('locked')) {
                        if (options.columns[i].locked) {
                            lockedCount++;
                        }
                    }
                }

                for (var i = 0; i < options.columns.length; i++) {
                    var width = options.columns[i].width;
                    if (grid.columns[i] === undefined) continue;
                    grid.columns[i].width = width;
                    if (options.columns[i].hidden) {
                        hiddenCount++;
                        continue;
                    }
                    if (options.columns[i].hasOwnProperty('locked') && options.columns[i].locked) {
                        $("#" + gridName + "  .k-grid-header-locked").find("colgroup col").eq(i - hiddenCount).width(width);
                        $("#" + gridName + " .k-grid-content-locked").find("colgroup col").eq(i - hiddenCount).width(width);

                    } else {
                        $("#" + gridName + "  .k-grid-header-wrap").find("colgroup col").eq(i - lockedCount - hiddenCount).width(width);
                        $("#" + gridName + "  .k-grid-content").find("colgroup col").eq(i - lockedCount - hiddenCount).width(width);
                    }
                }
                // Hack to refresh grid visual state
                //grid.reorderColumn(1, grid.columns[0]);
                //grid.reorderColumn(1, grid.columns[0]);
            }
        } catch (e) {
            console.log("Unable to set columns width.");
        }
    }

    var g_error = function (gridName) {
        //delete cookies on error
        try {

            localStorage["kendo-grid-options-" + gridName + "-" + stripQueryStringAndHashFromPath()] = null;

        }
        catch (e) {
            console.log("Unable to access local storage");
        }
    };
    return {
        init: function (gridName) {
            isIgnoreGridStateChanges = true;
            var gridName = gridName;
            var grid = $('#' + gridName).getKendoGrid();

            try { 
                if (localStorage["lastResetDate"] == null) {
                    //localStorage.clear();
                    var d = new Date();
                    localStorage["lastResetDate"] = d.toString();
                }
                if (grid) {
          
                    //var pageSize = localStorage["kendo-grid-page-size-" + gridName + "-" + stripQueryStringAndHashFromPath()];
                    //if (pageSize != null && pageSize != "null") {
                    //    grid.dataSource.pageSize(pageSize);
                    //}


                    grid.bind("columnShow", function (e) { g_saveGridState(gridName) });
                    grid.bind("columnHide", function (e) { g_saveGridState(gridName) });
                    grid.bind("columnReorder", function (e) { g_saveGridState(gridName) });
                    grid.bind("columnResize", function (e) { g_saveGridState(gridName) });
                    grid.bind("dataBound", function (e) { g_saveGridState(gridName) });
                    grid.bind("change", function (e) { g_saveGridState(gridName) });
                    grid.dataSource.bind("error", function (e) { g_error(gridName) });


                    var options = localStorage["kendo-grid-options-" + gridName + "-" + stripQueryStringAndHashFromPath()];


                    if (options != null && options != "null") {

                        var savedOptions = JSON.parse(options);
                        var currentOptions = grid.getOptions();

                           
                        //handle columns visibility. make sure saved columns exist.
                        for (var i = 0; i < currentOptions.columns.length; i++) {
                            var currentColumn = currentOptions.columns[i];
                            for (var x = 1; x < savedOptions.columns.length; x++) {//skip the first column (checkbox column) to make sure we do not override the mincolumnwidth setting
                                var savedColumn = savedOptions.columns[x];
                                if (currentColumn.title == savedColumn.title) {
                                    if (savedColumn.hidden) {
                                        grid.hideColumn(i);
                                    }
                                    else {
                                        grid.showColumn(i);
                                        if (x != i) {
                                            //save column different than current column #
                                            //grid.reorderColumn(x, grid.columns[i]);
                                        }
                                    }
                                }
                            }
                        }

                        //handle sort, make sure the column saved exists in the grid
                        var gridSort = [];
                        if (savedOptions.dataSource.sort != null) {
                            for (var si = 0; si < savedOptions.dataSource.sort.length; si++) {
                                var savedSort = savedOptions.dataSource.sort[si];
                                for (var ci = 0; ci < currentOptions.columns.length; ci++) {
                                    if (currentOptions.columns[ci].field == savedSort.field) {
                                        gridSort.push({ field: savedSort.field, dir: savedSort.dir });
                                    }
                                }
                            }
                            loadColumnReorderState(gridName, options);
                            setColumnWidths(grid, options, gridName);

                            grid.dataSource.sort(gridSort);                     
                            isIgnoreGridStateChanges = false;
                            return; // do not call READ it will load twice!
                        }

                        loadColumnReorderState(gridName, options); 

                        setColumnWidths(grid, options, gridName);
                    }
                    
                    grid.dataSource.read();
                    //localStorage.clear();
                }
            }
            catch (e) {
                g_error(gridName);
            }

            isIgnoreGridStateChanges = false;
        }
    };
}();;
"use strict";

var PantherPrivacyToggle = function () {
    return {
        
        toggle: function () {
            if (window.localStorage.getItem('privacy_mode') === '1') {
                $(".privacy-toggle").addClass("privacy-on");
                $(".privacy-toggle-hide").addClass("privacy-on");                
                PantherPrivacyToggle.reactCallBack(true);
            } else {
                $(".privacy-toggle").removeClass("privacy-on");
                $(".privacy-toggle-hide").removeClass("privacy-on");                
                PantherPrivacyToggle.reactCallBack(false);
            }
        },        
        reactCallBack: function () { },
        addCallback: function (_reactCallBack) {
            this.reactCallBack = _reactCallBack;
            this.toggle();
        }
    };
}();

;
String.prototype.replaceAll = function (str1, str2, ignore) {
    return this.replace(new RegExp(str1.replace(/([\/\,\!\\\^\$\{\}\[\]\(\)\.\*\+\?\|\<\>\-\&])/g, "\\$&"), (ignore ? "gi" : "g")), (typeof (str2) == "string") ? str2.replace(/\$/g, "$$$$") : str2);
};
function arraymove(arr, fromIndex, toIndex) {
    var element = arr[fromIndex];
    arr.splice(fromIndex, 1);
    arr.splice(toIndex, 0, element);
}

function pantherAddRecentItem(name, icon, url) {
    var recentItems = pantherGetRecentItems();
    for (var i = 0; i < recentItems.length; i++) {
        if (recentItems[i].name == name) {
            arraymove(recentItems, i, 0);
            $.cookie("pantherRecentItems_"+tenantGuid, JSON.stringify(recentItems), { expires: 365, path: '/', secure: true });
            return;
        }
    }
    var newRecentItem = { name: $('<div />').html(name).text(), icon: icon, url: url };
    recentItems.unshift(newRecentItem);

    if (recentItems.length > 10) {
        recentItems.splice(10, recentItems.length - 10);
    }

    $.cookie("pantherRecentItems_" + tenantGuid, JSON.stringify(recentItems), { expires: 365, path: '/', secure: true });
    //pantherLoadRecentItems();
}

function pantherClearRecentItems() {
    $.cookie("pantherRecentItems_" + tenantGuid, null, { expires: 365, path: '/', secure: true });
    //pantherLoadRecentItems();
}

function pantherGetRecentItems() {
    var recentItems = $.cookie("pantherRecentItems_" + tenantGuid);
    if (recentItems == null || recentItems == 'null') {
        recentItems = new Array();
    }
    else {
        recentItems = JSON.parse(recentItems);
    }
    return recentItems;
}



function pantherLoadRecentItems() {
    var recentItemsViewModel = function () {
        this.recentItems = ko.observableArray(pantherGetRecentItems());
    }

    //ko.cleanNode(document.getElementById("recentItems"));
    ko.applyBindings(recentItemsViewModel, document.getElementById("recentItems"));
}

$(function () {
    pantherLoadRecentItems();
});

;
function SaleDocument(locationId, accountId) {
    var subtotal = 0;
    var tax = 0;
    var total = 0;
    var numOfItems = 0;
    var preTaxDiscount = 0;
    var postTaxDiscount = 0;

};
;
;
;
/// <reference path="kendo/2013.1.401/kendo.all.min.js" />
/// <reference path="kendo/2013.1.401/kendo.all.min.js" />
function ResizeGridFitScreen(pixelsToDeduct) {

    function SetGridSize() {
        $(".k-grid-content").css('max-height', Math.max($(this).height(), document.documentElement.scrollHeight) - pixelsToDeduct - 25);
        $(".k-grid-content").css('height', '100%');
    }

    $(function() {
        SetGridSize();
    });
    $(window).resize(
        function() {
            SetGridSize();
        }).resize();

}

function NotYetImplemented() {
    alert("Not implemented yet...");
}

function PreventDefault(event) {
    event.preventDefault();
}

function hidePlaceholder(element) {
    $(element).hide();
    $(element).siblings().show();
    setTimeout(function () { $(element).siblings().find("input").focus(); }, 50);
}

//http://docs.telerik.com/kendo-ui/controls/editors/dropdownlist/how-to/prevent-close-on-scroll
function kendoStopScroll(element) {
    //var activeElement;

    //$(document).bind('mousewheel DOMMouseScroll', function (e) {
    //    var scrollTo = null;

    //    if (!$(activeElement).closest(".k-popup").length) {
    //        return;
    //    }

    //    if (e.type == 'mousewheel') {
    //        scrollTo = (e.originalEvent.wheelDelta * -1);
    //    }
    //    else if (e.type == 'DOMMouseScroll') {
    //        scrollTo = 40 * e.originalEvent.detail;
    //    }

    //    if (scrollTo) {
    //        e.preventDefault();
    //        element.scrollTop(scrollTo + element.scrollTop());
    //    }
    //});

    //$(document).on('mouseover', function (e) {
    //    activeElement = e.target;
    //});
};
//var numOfCalls = 0;
//$(function () {
//    numOfCalls++;
//    if (numOfCalls == 1) {
//        return;
//    }    

//    $("[data-val-required]").not("[type='hidden']").not("[type='checkbox']").not("[data-role='dropdownlist']").not("[data-role='numerictextbox']").not("[data-role='combobox']").not("[data-role='datepicker']").after('<span class="required">*</span>');
//    $("[data-val-required][data-role='combobox']").not("[type='hidden']").parent().after('<span class="required">*</span>');
//    $("[data-val-required][data-role='datepicker']").not("[type='hidden']").parent().parent().after('<span class="required">*</span>');
//    $("[data-role='combobox'][data-val-number]").attr("data-val-number", $("[data-role='combobox'][data-val-number]").data("val-required"));
//    //$("[data-val-number]").remove();
//});


$.validator.unobtrusive.adapters.add('requiredif', ['dependentproperty', 'desiredvalue'], function (options) {
    options.rules['requiredif'] = options.params;
    options.messages['requiredif'] = options.message;
});

$.validator.addMethod('requiredif', function (value, element, parameters) {
    var desiredvalue = parameters.desiredvalue;
    desiredvalue = (desiredvalue == null ? '' : desiredvalue).toString();
    var controlType = $("input[id$='" + parameters.dependentproperty + "']").attr("type");
    var actualvalue = {}
    if (controlType == "checkbox" || controlType == "radio") {
        var control = $("input[id$='" + parameters.dependentproperty + "']:checked");
        actualvalue = control.val();
    } else {
        actualvalue = $("#" + parameters.dependentproperty).val();
    }
    if ($.trim(desiredvalue).toLowerCase() === $.trim(actualvalue).toLocaleLowerCase()) {
        var isValid = $.validator.methods.required.call(this, value, element, parameters);
        return isValid;
    }
    return true;
});;
/*! Copyright (c) 2011 Piotr Rochala (http://rocha.la)
 * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
 * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
 *
 * Version: 1.3.8
 *
 */
(function(e){e.fn.extend({slimScroll:function(f){var a=e.extend({width:"auto",height:"250px",size:"7px",color:"#000",position:"right",distance:"1px",start:"top",opacity:.4,alwaysVisible:!1,disableFadeOut:!1,railVisible:!1,railColor:"#333",railOpacity:.2,railDraggable:!0,railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",allowPageScroll:!1,wheelStep:20,touchScrollStep:200,borderRadius:"7px",railBorderRadius:"7px"},f);this.each(function(){function v(d){if(r){d=d||window.event;
var c=0;d.wheelDelta&&(c=-d.wheelDelta/120);d.detail&&(c=d.detail/3);e(d.target||d.srcTarget||d.srcElement).closest("."+a.wrapperClass).is(b.parent())&&n(c,!0);d.preventDefault&&!k&&d.preventDefault();k||(d.returnValue=!1)}}function n(d,e,f){k=!1;var g=d,h=b.outerHeight()-c.outerHeight();e&&(g=parseInt(c.css("top"))+d*parseInt(a.wheelStep)/100*c.outerHeight(),g=Math.min(Math.max(g,0),h),g=0<d?Math.ceil(g):Math.floor(g),c.css({top:g+"px"}));l=parseInt(c.css("top"))/(b.outerHeight()-c.outerHeight());
g=l*(b[0].scrollHeight-b.outerHeight());f&&(g=d,d=g/b[0].scrollHeight*b.outerHeight(),d=Math.min(Math.max(d,0),h),c.css({top:d+"px"}));b.scrollTop(g);b.trigger("slimscrolling",~~g);w();q()}function x(){u=Math.max(b.outerHeight()/b[0].scrollHeight*b.outerHeight(),30);c.css({height:u+"px"});var a=u==b.outerHeight()?"none":"block";c.css({display:a})}function w(){x();clearTimeout(B);l==~~l?(k=a.allowPageScroll,C!=l&&b.trigger("slimscroll",0==~~l?"top":"bottom")):k=!1;C=l;u>=b.outerHeight()?k=!0:(c.stop(!0,
!0).fadeIn("fast"),a.railVisible&&m.stop(!0,!0).fadeIn("fast"))}function q(){a.alwaysVisible||(B=setTimeout(function(){a.disableFadeOut&&r||y||z||(c.fadeOut("slow"),m.fadeOut("slow"))},1E3))}var r,y,z,B,A,u,l,C,k=!1,b=e(this);if(b.parent().hasClass(a.wrapperClass)){var p=b.scrollTop(),c=b.siblings("."+a.barClass),m=b.siblings("."+a.railClass);x();if(e.isPlainObject(f)){if("height"in f&&"auto"==f.height){b.parent().css("height","auto");b.css("height","auto");var h=b.parent().parent().height();b.parent().css("height",
h);b.css("height",h)}else"height"in f&&(h=f.height,b.parent().css("height",h),b.css("height",h));if("scrollTo"in f)p=parseInt(a.scrollTo);else if("scrollBy"in f)p+=parseInt(a.scrollBy);else if("destroy"in f){c.remove();m.remove();b.unwrap();return}n(p,!1,!0)}}else if(!(e.isPlainObject(f)&&"destroy"in f)){a.height="auto"==a.height?b.parent().height():a.height;p=e("<div></div>").addClass(a.wrapperClass).css({position:"relative",overflow:"hidden",width:a.width,height:a.height});b.css({overflow:"hidden",
width:a.width,height:a.height});var m=e("<div></div>").addClass(a.railClass).css({width:a.size,height:"100%",position:"absolute",top:0,display:a.alwaysVisible&&a.railVisible?"block":"none","border-radius":a.railBorderRadius,background:a.railColor,opacity:a.railOpacity,zIndex:90}),c=e("<div></div>").addClass(a.barClass).css({background:a.color,width:a.size,position:"absolute",top:0,opacity:a.opacity,display:a.alwaysVisible?"block":"none","border-radius":a.borderRadius,BorderRadius:a.borderRadius,MozBorderRadius:a.borderRadius,
WebkitBorderRadius:a.borderRadius,zIndex:99}),h="right"==a.position?{right:a.distance}:{left:a.distance};m.css(h);c.css(h);b.wrap(p);b.parent().append(c);b.parent().append(m);a.railDraggable&&c.bind("mousedown",function(a){var b=e(document);z=!0;t=parseFloat(c.css("top"));pageY=a.pageY;b.bind("mousemove.slimscroll",function(a){currTop=t+a.pageY-pageY;c.css("top",currTop);n(0,c.position().top,!1)});b.bind("mouseup.slimscroll",function(a){z=!1;q();b.unbind(".slimscroll")});return!1}).bind("selectstart.slimscroll",
function(a){a.stopPropagation();a.preventDefault();return!1});m.hover(function(){w()},function(){q()});c.hover(function(){y=!0},function(){y=!1});b.hover(function(){r=!0;w();q()},function(){r=!1;q()});b.bind("touchstart",function(a,b){a.originalEvent.touches.length&&(A=a.originalEvent.touches[0].pageY)});b.bind("touchmove",function(b){k||b.originalEvent.preventDefault();b.originalEvent.touches.length&&(n((A-b.originalEvent.touches[0].pageY)/a.touchScrollStep,!0),A=b.originalEvent.touches[0].pageY)});
x();"bottom"===a.start?(c.css({top:b.outerHeight()-c.outerHeight()}),n(0,!0)):"top"!==a.start&&(n(e(a.start).position().top,null,!0),a.alwaysVisible||c.hide());window.addEventListener?(this.addEventListener("DOMMouseScroll",v,!1),this.addEventListener("mousewheel",v,!1)):document.attachEvent("onmousewheel",v)}});return this}});e.fn.extend({slimscroll:e.fn.slimScroll})})(jQuery);;
/*!
 * jQuery blockUI plugin
 * Version 2.66.0-2013.10.09
 * Requires jQuery v1.7 or later
 *
 * Examples at: http://malsup.com/jquery/block/
 * Copyright (c) 2007-2013 M. Alsup
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 *
 * Thanks to Amir-Hossein Sobhi for some excellent contributions!
 */

!function(){"use strict";function e(e){function t(t,n){var s,h,k=t==window,y=n&&void 0!==n.message?n.message:void 0;if(n=e.extend({},e.blockUI.defaults,n||{}),!n.ignoreIfBlocked||!e(t).data("blockUI.isBlocked")){if(n.overlayCSS=e.extend({},e.blockUI.defaults.overlayCSS,n.overlayCSS||{}),s=e.extend({},e.blockUI.defaults.css,n.css||{}),n.onOverlayClick&&(n.overlayCSS.cursor="pointer"),h=e.extend({},e.blockUI.defaults.themedCSS,n.themedCSS||{}),y=void 0===y?n.message:y,k&&p&&o(window,{fadeOut:0}),y&&"string"!=typeof y&&(y.parentNode||y.jquery)){var m=y.jquery?y[0]:y,v={};e(t).data("blockUI.history",v),v.el=m,v.parent=m.parentNode,v.display=m.style.display,v.position=m.style.position,v.parent&&v.parent.removeChild(m)}e(t).data("blockUI.onUnblock",n.onUnblock);var g,I,w,U,x=n.baseZ;g=r||n.forceIframe?e('<iframe class="blockUI" style="z-index:'+x++ +';display:none;border:none;margin:0;padding:0;position:absolute;width:100%;height:100%;top:0;left:0" src="'+n.iframeSrc+'"></iframe>'):e('<div class="blockUI" style="display:none"></div>'),I=n.theme?e('<div class="blockUI blockOverlay ui-widget-overlay" style="z-index:'+x++ +';display:none"></div>'):e('<div class="blockUI blockOverlay" style="z-index:'+x++ +';display:none;border:none;margin:0;padding:0;width:100%;height:100%;top:0;left:0"></div>'),n.theme&&k?(U='<div class="blockUI '+n.blockMsgClass+' blockPage ui-dialog ui-widget ui-corner-all" style="z-index:'+(x+10)+';display:none;position:fixed">',n.title&&(U+='<div class="ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle">'+(n.title||"&nbsp;")+"</div>"),U+='<div class="ui-widget-content ui-dialog-content"></div>',U+="</div>"):n.theme?(U='<div class="blockUI '+n.blockMsgClass+' blockElement ui-dialog ui-widget ui-corner-all" style="z-index:'+(x+10)+';display:none;position:absolute">',n.title&&(U+='<div class="ui-widget-header ui-dialog-titlebar ui-corner-all blockTitle">'+(n.title||"&nbsp;")+"</div>"),U+='<div class="ui-widget-content ui-dialog-content"></div>',U+="</div>"):U=k?'<div class="blockUI '+n.blockMsgClass+' blockPage" style="z-index:'+(x+10)+';display:none;position:fixed"></div>':'<div class="blockUI '+n.blockMsgClass+' blockElement" style="z-index:'+(x+10)+';display:none;position:absolute"></div>',w=e(U),y&&(n.theme?(w.css(h),w.addClass("ui-widget-content")):w.css(s)),n.theme||I.css(n.overlayCSS),I.css("position",k?"fixed":"absolute"),(r||n.forceIframe)&&g.css("opacity",0);var C=[g,I,w],S=k?e("body"):e(t);e.each(C,function(){this.appendTo(S)}),n.theme&&n.draggable&&e.fn.draggable&&w.draggable({handle:".ui-dialog-titlebar",cancel:"li"});var O=f&&(!e.support.boxModel||e("object,embed",k?null:t).length>0);if(u||O){if(k&&n.allowBodyStretch&&e.support.boxModel&&e("html,body").css("height","100%"),(u||!e.support.boxModel)&&!k)var E=d(t,"borderTopWidth"),T=d(t,"borderLeftWidth"),M=E?"(0 - "+E+")":0,B=T?"(0 - "+T+")":0;e.each(C,function(e,t){var o=t[0].style;if(o.position="absolute",2>e)k?o.setExpression("height","Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.support.boxModel?0:"+n.quirksmodeOffsetHack+') + "px"'):o.setExpression("height",'this.parentNode.offsetHeight + "px"'),k?o.setExpression("width",'jQuery.support.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"'):o.setExpression("width",'this.parentNode.offsetWidth + "px"'),B&&o.setExpression("left",B),M&&o.setExpression("top",M);else if(n.centerY)k&&o.setExpression("top",'(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"'),o.marginTop=0;else if(!n.centerY&&k){var i=n.css&&n.css.top?parseInt(n.css.top,10):0,s="((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "+i+') + "px"';o.setExpression("top",s)}})}if(y&&(n.theme?w.find(".ui-widget-content").append(y):w.append(y),(y.jquery||y.nodeType)&&e(y).show()),(r||n.forceIframe)&&n.showOverlay&&g.show(),n.fadeIn){var j=n.onBlock?n.onBlock:c,H=n.showOverlay&&!y?j:c,z=y?j:c;n.showOverlay&&I._fadeIn(n.fadeIn,H),y&&w._fadeIn(n.fadeIn,z)}else n.showOverlay&&I.show(),y&&w.show(),n.onBlock&&n.onBlock();if(i(1,t,n),k?(p=w[0],b=e(n.focusableElements,p),n.focusInput&&setTimeout(l,20)):a(w[0],n.centerX,n.centerY),n.timeout){var W=setTimeout(function(){k?e.unblockUI(n):e(t).unblock(n)},n.timeout);e(t).data("blockUI.timeout",W)}}}function o(t,o){var s,l=t==window,a=e(t),d=a.data("blockUI.history"),c=a.data("blockUI.timeout");c&&(clearTimeout(c),a.removeData("blockUI.timeout")),o=e.extend({},e.blockUI.defaults,o||{}),i(0,t,o),null===o.onUnblock&&(o.onUnblock=a.data("blockUI.onUnblock"),a.removeData("blockUI.onUnblock"));var r;r=l?e("body").children().filter(".blockUI").add("body > .blockUI"):a.find(">.blockUI"),o.cursorReset&&(r.length>1&&(r[1].style.cursor=o.cursorReset),r.length>2&&(r[2].style.cursor=o.cursorReset)),l&&(p=b=null),o.fadeOut?(s=r.length,r.stop().fadeOut(o.fadeOut,function(){0===--s&&n(r,d,o,t)})):n(r,d,o,t)}function n(t,o,n,i){var s=e(i);if(!s.data("blockUI.isBlocked")){t.each(function(){this.parentNode&&this.parentNode.removeChild(this)}),o&&o.el&&(o.el.style.display=o.display,o.el.style.position=o.position,o.parent&&o.parent.appendChild(o.el),s.removeData("blockUI.history")),s.data("blockUI.static")&&s.css("position","static"),"function"==typeof n.onUnblock&&n.onUnblock(i,n);var l=e(document.body),a=l.width(),d=l[0].style.width;l.width(a-1).width(a),l[0].style.width=d}}function i(t,o,n){var i=o==window,l=e(o);if((t||(!i||p)&&(i||l.data("blockUI.isBlocked")))&&(l.data("blockUI.isBlocked",t),i&&n.bindEvents&&(!t||n.showOverlay))){var a="mousedown mouseup keydown keypress keyup touchstart touchend touchmove";t?e(document).bind(a,n,s):e(document).unbind(a,s)}}function s(t){if("keydown"===t.type&&t.keyCode&&9==t.keyCode&&p&&t.data.constrainTabKey){var o=b,n=!t.shiftKey&&t.target===o[o.length-1],i=t.shiftKey&&t.target===o[0];if(n||i)return setTimeout(function(){l(i)},10),!1}var s=t.data,a=e(t.target);return a.hasClass("blockOverlay")&&s.onOverlayClick&&s.onOverlayClick(t),a.parents("div."+s.blockMsgClass).length>0?!0:0===a.parents().children().filter("div.blockUI").length}function l(e){if(b){var t=b[e===!0?b.length-1:0];t&&t.focus()}}function a(e,t,o){var n=e.parentNode,i=e.style,s=(n.offsetWidth-e.offsetWidth)/2-d(n,"borderLeftWidth"),l=(n.offsetHeight-e.offsetHeight)/2-d(n,"borderTopWidth");t&&(i.left=s>0?s+"px":"0"),o&&(i.top=l>0?l+"px":"0")}function d(t,o){return parseInt(e.css(t,o),10)||0}e.fn._fadeIn=e.fn.fadeIn;var c=e.noop||function(){},r=/MSIE/.test(navigator.userAgent),u=/MSIE 6.0/.test(navigator.userAgent)&&!/MSIE 8.0/.test(navigator.userAgent),f=(document.documentMode||0,e.isFunction(document.createElement("div").style.setExpression));e.blockUI=function(e){t(window,e)},e.unblockUI=function(e){o(window,e)},e.growlUI=function(t,o,n,i){var s=e('<div class="growlUI"></div>');t&&s.append("<h1>"+t+"</h1>"),o&&s.append("<h2>"+o+"</h2>"),void 0===n&&(n=3e3);var l=function(t){t=t||{},e.blockUI({message:s,fadeIn:"undefined"!=typeof t.fadeIn?t.fadeIn:700,fadeOut:"undefined"!=typeof t.fadeOut?t.fadeOut:1e3,timeout:"undefined"!=typeof t.timeout?t.timeout:n,centerY:!1,showOverlay:!1,onUnblock:i,css:e.blockUI.defaults.growlCSS})};l();s.css("opacity");s.mouseover(function(){l({fadeIn:0,timeout:3e4});var t=e(".blockMsg");t.stop(),t.fadeTo(300,1)}).mouseout(function(){e(".blockMsg").fadeOut(1e3)})},e.fn.block=function(o){if(this[0]===window)return e.blockUI(o),this;var n=e.extend({},e.blockUI.defaults,o||{});return this.each(function(){var t=e(this);n.ignoreIfBlocked&&t.data("blockUI.isBlocked")||t.unblock({fadeOut:0})}),this.each(function(){"static"==e.css(this,"position")&&(this.style.position="relative",e(this).data("blockUI.static",!0)),this.style.zoom=1,t(this,o)})},e.fn.unblock=function(t){return this[0]===window?(e.unblockUI(t),this):this.each(function(){o(this,t)})},e.blockUI.version=2.66,e.blockUI.defaults={message:"<h1>Please wait...</h1>",title:null,draggable:!0,theme:!1,css:{padding:0,margin:0,width:"30%",top:"40%",left:"35%",textAlign:"center",color:"#000",border:"3px solid #aaa",backgroundColor:"#fff",cursor:"wait"},themedCSS:{width:"30%",top:"40%",left:"35%"},overlayCSS:{backgroundColor:"#000",opacity:.6,cursor:"wait"},cursorReset:"default",growlCSS:{width:"350px",top:"10px",left:"",right:"10px",border:"none",padding:"5px",opacity:.6,cursor:"default",color:"#fff",backgroundColor:"#000","-webkit-border-radius":"10px","-moz-border-radius":"10px","border-radius":"10px"},iframeSrc:/^https/i.test(window.location.href||"")?"javascript:false":"about:blank",forceIframe:!1,baseZ:1e3,centerX:!0,centerY:!0,allowBodyStretch:!0,bindEvents:!0,constrainTabKey:!0,fadeIn:200,fadeOut:400,timeout:0,showOverlay:!0,focusInput:!0,focusableElements:":input:enabled:visible",onBlock:null,onUnblock:null,onOverlayClick:null,quirksmodeOffsetHack:4,blockMsgClass:"blockMsg",ignoreIfBlocked:!1};var p=null,b=[]}"function"==typeof define&&define.amd&&define.amd.jQuery?define(["jquery"],e):e(jQuery)}();;
/*!
 * jQuery Cookie Plugin v1.3.1
 * https://github.com/carhartl/jquery-cookie
 *
 * Copyright 2013 Klaus Hartl
 * Released under the MIT license
 */
(function(a){if(typeof define==="function"&&define.amd){define(["jquery"],a)}else{a(jQuery)}}(function(e){var a=/\+/g;function d(g){return g}function b(g){return decodeURIComponent(g.replace(a," "))}function f(g){if(g.indexOf('"')===0){g=g.slice(1,-1).replace(/\\"/g,'"').replace(/\\\\/g,"\\")}try{return c.json?JSON.parse(g):g}catch(h){}}var c=e.cookie=function(p,o,u){if(o!==undefined){u=e.extend({},c.defaults,u);if(typeof u.expires==="number"){var q=u.expires,s=u.expires=new Date();s.setDate(s.getDate()+q)}o=c.json?JSON.stringify(o):String(o);return(document.cookie=[c.raw?p:encodeURIComponent(p),"=",c.raw?o:encodeURIComponent(o),u.expires?"; expires="+u.expires.toUTCString():"",u.path?"; path="+u.path:"",u.domain?"; domain="+u.domain:"",u.secure?"; secure":""].join(""))}var g=c.raw?d:b;var r=document.cookie.split("; ");var v=p?undefined:{};for(var n=0,k=r.length;n<k;n++){var m=r[n].split("=");var h=g(m.shift());var j=g(m.join("="));if(p&&p===h){v=f(j);break}if(!p){v[h]=f(j)}}return v};c.defaults={};e.removeCookie=function(h,g){if(e.cookie(h)!==undefined){e.cookie(h,"",e.extend({},g,{expires:-1}));return true}return false}}));;
!function(e,t,n){"use strict";function s(e){var t=Array.prototype.slice.call(arguments,1);return e.prop?e.prop.apply(e,t):e.attr.apply(e,t)}function a(e,t,n){var s,a;for(s in n)n.hasOwnProperty(s)&&(a=s.replace(/ |$/g,t.eventNamespace),e.bind(a,n[s]))}function r(e,t,n){a(e,n,{focus:function(){t.addClass(n.focusClass)},blur:function(){t.removeClass(n.focusClass),t.removeClass(n.activeClass)},mouseenter:function(){t.addClass(n.hoverClass)},mouseleave:function(){t.removeClass(n.hoverClass),t.removeClass(n.activeClass)},"mousedown touchbegin":function(){e.is(":disabled")||t.addClass(n.activeClass)},"mouseup touchend":function(){t.removeClass(n.activeClass)}})}function i(e,t){e.removeClass(t.hoverClass+" "+t.focusClass+" "+t.activeClass)}function l(e,t,n){n?e.addClass(t):e.removeClass(t)}function u(e,t,n){var s="checked",a=t.is(":"+s);t.prop?t.prop(s,a):a?t.attr(s,s):t.removeAttr(s),l(e,n.checkedClass,a)}function o(e,t,n){l(e,n.disabledClass,t.is(":disabled"))}function c(e,t,n){switch(n){case"after":return e.after(t),e.next();case"before":return e.before(t),e.prev();case"wrap":return e.wrap(t),e.parent()}return null}function d(e,n,a){var r,i,l;return a||(a={}),a=t.extend({bind:{},divClass:null,divWrap:"wrap",spanClass:null,spanHtml:null,spanWrap:"wrap"},a),r=t("<div />"),i=t("<span />"),n.autoHide&&e.is(":hidden")&&"none"===e.css("display")&&r.hide(),a.divClass&&r.addClass(a.divClass),n.wrapperClass&&r.addClass(n.wrapperClass),a.spanClass&&i.addClass(a.spanClass),l=s(e,"id"),n.useID&&l&&s(r,"id",n.idPrefix+"-"+l),a.spanHtml&&i.html(a.spanHtml),r=c(e,r,a.divWrap),i=c(e,i,a.spanWrap),o(r,e,n),{div:r,span:i}}function f(e,n){var s;return n.wrapperClass?(s=t("<span />").addClass(n.wrapperClass),s=c(e,s,"wrap")):null}function p(){var n,s,a,r;return r="rgb(120,2,153)",s=t('<div style="width:0;height:0;color:'+r+'">'),t("body").append(s),a=s.get(0),n=e.getComputedStyle?e.getComputedStyle(a,"").color:(a.currentStyle||a.style||{}).color,s.remove(),n.replace(/ /g,"")!==r}function m(e){return e?t("<span />").text(e).html():""}function v(){return navigator.cpuClass&&!navigator.product}function h(){return void 0!==e.XMLHttpRequest}function C(e){var t;return e[0].multiple?!0:(t=s(e,"size"),!(!t||1>=t))}function b(e,t){var n="none";a(e,t,{"selectstart dragstart mousedown":returnFalse}),e.css({MozUserSelect:n,msUserSelect:n,webkitUserSelect:n,userSelect:n})}function y(e,t,n){var s=e.val();""===s?s=n.fileDefaultHtml:(s=s.split(/[\/\\]+/),s=s[s.length-1]),t.text(s)}function w(e,t,n){var s,a;for(s=[],e.each(function(){var e;for(e in t)Object.prototype.hasOwnProperty.call(t,e)&&(s.push({el:this,name:e,old:this.style[e]}),this.style[e]=t[e])}),n();s.length;)a=s.pop(),a.el.style[a.name]=a.old}function g(e,t){var n;n=e.parents(),n.push(e[0]),n=n.not(":visible"),w(n,{visibility:"hidden",display:"block",position:"absolute"},t)}function k(e,t){return function(){e.unwrap().unwrap().unbind(t.eventNamespace)}}var x=!0,H=!1,A=[{match:function(e){return e.is("a, button, :submit, :reset, input[type='button']")},apply:function(t,n){var l,u,c,f,p;return u=n.submitDefaultHtml,t.is(":reset")&&(u=n.resetDefaultHtml),f=t.is("a, button")?function(){return t.html()||u}:function(){return m(s(t,"value"))||u},c=d(t,n,{divClass:n.buttonClass,spanHtml:f()}),l=c.div,r(t,l,n),p=!1,a(l,n,{"click touchend":function(){var n,a,r,i;p||t.is(":disabled")||(p=!0,t[0].dispatchEvent?(n=document.createEvent("MouseEvents"),n.initEvent("click",!0,!0),a=t[0].dispatchEvent(n),t.is("a")&&a&&(r=s(t,"target"),i=s(t,"href"),r&&"_self"!==r?e.open(i,r):document.location.href=i)):t.click(),p=!1)}}),b(l,n),{remove:function(){return l.after(t),l.remove(),t.unbind(n.eventNamespace),t},update:function(){i(l,n),o(l,t,n),t.detach(),c.span.html(f()).append(t)}}}},{match:function(e){return e.is(":checkbox")},apply:function(e,t){var n,s,l;return n=d(e,t,{divClass:t.checkboxClass}),s=n.div,l=n.span,r(e,s,t),a(e,t,{"click touchend":function(){u(l,e,t)}}),u(l,e,t),{remove:k(e,t),update:function(){i(s,t),l.removeClass(t.checkedClass),u(l,e,t),o(s,e,t)}}}},{match:function(e){return e.is(":file")},apply:function(e,n){function l(){y(e,p,n)}var u,f,p,m;return u=d(e,n,{divClass:n.fileClass,spanClass:n.fileButtonClass,spanHtml:n.fileButtonHtml,spanWrap:"after"}),f=u.div,m=u.span,p=t("<span />").html(n.fileDefaultHtml),p.addClass(n.filenameClass),p=c(e,p,"after"),s(e,"size")||s(e,"size",f.width()/10),r(e,f,n),l(),v()?a(e,n,{click:function(){e.trigger("change"),setTimeout(l,0)}}):a(e,n,{change:l}),b(p,n),b(m,n),{remove:function(){return p.remove(),m.remove(),e.unwrap().unbind(n.eventNamespace)},update:function(){i(f,n),y(e,p,n),o(f,e,n)}}}},{match:function(e){if(e.is("input")){var t=(" "+s(e,"type")+" ").toLowerCase(),n=" color date datetime datetime-local email month number password search tel text time url week ";return n.indexOf(t)>=0}return!1},apply:function(e,t){var n,a;return n=s(e,"type"),e.addClass(t.inputClass),a=f(e,t),r(e,e,t),t.inputAddTypeAsClass&&e.addClass(n),{remove:function(){e.removeClass(t.inputClass),t.inputAddTypeAsClass&&e.removeClass(n),a&&e.unwrap()},update:!1}}},{match:function(e){return e.is(":radio")},apply:function(e,n){var l,c,f;return l=d(e,n,{divClass:n.radioClass}),c=l.div,f=l.span,r(e,c,n),a(e,n,{"click touchend":function(){t.uniform.update(t(':radio[name="'+s(e,"name")+'"]'))}}),u(f,e,n),{remove:k(e,n),update:function(){i(c,n),u(f,e,n),o(c,e,n)}}}},{match:function(e){return!(!e.is("select")||C(e))},apply:function(e,n){var s,l,u,c;return n.selectAutoWidth&&g(e,function(){c=e.width()}),s=d(e,n,{divClass:n.selectClass,spanHtml:(e.find(":selected:first")||e.find("option:first")).html(),spanWrap:"before"}),l=s.div,u=s.span,n.selectAutoWidth?g(e,function(){w(t([u[0],l[0]]),{display:"block"},function(){var e;e=u.outerWidth()-u.width(),l.width(c+e),u.width(c)})}):l.addClass("fixedWidth"),r(e,l,n),a(e,n,{change:function(){u.html(e.find(":selected").html()),l.removeClass(n.activeClass)},"click touchend":function(){var t=e.find(":selected").html();u.html()!==t&&e.trigger("change")},keyup:function(){u.html(e.find(":selected").html())}}),b(u,n),{remove:function(){return u.remove(),e.unwrap().unbind(n.eventNamespace),e},update:function(){n.selectAutoWidth?(t.uniform.restore(e),e.uniform(n)):(i(l,n),e[0].selectedIndex=e[0].selectedIndex,u.html(e.find(":selected").html()),o(l,e,n))}}}},{match:function(e){return!(!e.is("select")||!C(e))},apply:function(e,t){var n;return e.addClass(t.selectMultiClass),n=f(e,t),r(e,e,t),{remove:function(){e.removeClass(t.selectMultiClass),n&&e.unwrap()},update:!1}}},{match:function(e){return e.is("textarea")},apply:function(e,t){var n;return e.addClass(t.textareaClass),n=f(e,t),r(e,e,t),{remove:function(){e.removeClass(t.textareaClass),n&&e.unwrap()},update:!1}}}];v()&&!h()&&(x=!1),t.uniform={defaults:{activeClass:"active",autoHide:!0,buttonClass:"button",checkboxClass:"checker",checkedClass:"checked",disabledClass:"disabled",eventNamespace:".uniform",fileButtonClass:"action",fileButtonHtml:"Choose File",fileClass:"uploader",fileDefaultHtml:"No file selected",filenameClass:"filename",focusClass:"focus",hoverClass:"hover",idPrefix:"uniform",inputAddTypeAsClass:!0,inputClass:"uniform-input",radioClass:"radio",resetDefaultHtml:"Reset",resetSelector:!1,selectAutoWidth:!0,selectClass:"selector",selectMultiClass:"uniform-multiselect",submitDefaultHtml:"Submit",textareaClass:"uniform",useID:!0,wrapperClass:null},elements:[]},t.fn.uniform=function(n){var s=this;return n=t.extend({},t.uniform.defaults,n),H||(H=!0,p()&&(x=!1)),x?(n.resetSelector&&t(n.resetSelector).mouseup(function(){e.setTimeout(function(){t.uniform.update(s)},10)}),this.each(function(){var e,s,a,r=t(this);if(r.data("uniformed"))return void t.uniform.update(r);for(e=0;e<A.length;e+=1)if(s=A[e],s.match(r,n))return a=s.apply(r,n),r.data("uniformed",a),void t.uniform.elements.push(r.get(0))})):this},t.uniform.restore=t.fn.uniform.restore=function(e){e===n&&(e=t.uniform.elements),t(e).each(function(){var e,n,s=t(this);n=s.data("uniformed"),n&&(n.remove(),e=t.inArray(this,t.uniform.elements),e>=0&&t.uniform.elements.splice(e,1),s.removeData("uniformed"))})},t.uniform.update=t.fn.uniform.update=function(e){e===n&&(e=t.uniform.elements),t(e).each(function(){var e,n=t(this);e=n.data("uniformed"),e&&e.update(n,e.options)})}}(this,jQuery);;
(function(c){var j={init:function(a){var b={color:c(this).css("background-color"),reach:20,speed:1E3,pause:0,glow:!0,repeat:!0,onHover:!1};c(this).css({"-moz-outline-radius":c(this).css("border-top-left-radius"),"-webkit-outline-radius":c(this).css("border-top-left-radius"),"outline-radius":c(this).css("border-top-left-radius")});a&&c.extend(b,a);b.color=c("<div style='background:"+b.color+"'></div>").css("background-color");!0!==b.repeat&&(!isNaN(b.repeat)&&0<b.repeat)&&(b.repeat-=1);return this.each(function(){b.onHover?
c(this).bind("mouseover",function(){g(b,this,0)}).bind("mouseout",function(){c(this).pulsate("destroy")}):g(b,this,0)})},destroy:function(){return this.each(function(){clearTimeout(this.timer);c(this).css("outline",0)})}},g=function(a,b,d){var f=a.reach;d=d>f?0:d;var h=(f-d)/f,e=a.color.split(","),h="rgba("+e[0].split("(")[1]+","+e[1]+","+e[2].split(")")[0]+","+h+")",e={outline:"2px solid "+h};a.glow?(e["box-shadow"]="0px 0px "+parseInt(d/1.5)+"px "+h,userAgent=navigator.userAgent||"",/(chrome)[ \/]([\w.]+)/.test(userAgent.toLowerCase())&&
(e["outline-offset"]=d+"px",e["outline-radius"]="100 px")):e["outline-offset"]=d+"px";c(b).css(e);b.timer=setTimeout(function(){if(d>=f&&!a.repeat)return c(b).pulsate("destroy"),!1;if(d>=f&&!0!==a.repeat&&!isNaN(a.repeat)&&0<a.repeat)a.repeat-=1;else if(a.pause&&d>=f){var e=d+1;innerfunc=function(){g(a,b,e)};setTimeout(innerfunc,a.pause);return!1}g(a,b,d+1)},a.speed/f)};c.fn.pulsate=function(a){if(j[a])return j[a].apply(this,Array.prototype.slice.call(arguments,1));if("object"===typeof a||!a)return j.init.apply(this,
arguments);c.error("Method "+a+" does not exist on jQuery.pulsate")}})(jQuery);;
(function(b){b.gritter={};b.gritter.options={position:"",class_name:"",fade_in_speed:"medium",fade_out_speed:1000,time:6000};b.gritter.add=function(f){try{return a.add(f||{})}catch(d){var c="Gritter Error: "+d;(typeof(console)!="undefined"&&console.error)?console.error(c,f):alert(c)}};b.gritter.remove=function(d,c){a.removeSpecific(d,c||{})};b.gritter.removeAll=function(c){a.stop(c||{})};var a={position:"",fade_in_speed:"",fade_out_speed:"",time:"",_custom_timer:0,_item_count:0,_is_setup:0,_tpl_close:'<div class="gritter-close"></div>',_tpl_title:'<span class="gritter-title">[[title]]</span>',_tpl_item:'<div id="gritter-item-[[number]]" class="gritter-item-wrapper [[item_class]]" style="display:none"><div class="gritter-top"></div><div class="gritter-item">[[close]][[image]]<div class="[[class_name]]">[[title]]<p>[[text]]</p></div><div style="clear:both"></div></div><div class="gritter-bottom"></div></div>',_tpl_wrap:'<div id="gritter-notice-wrapper"></div>',add:function(g){if(typeof(g)=="string"){g={text:g}}if(!g.text){throw'You must supply "text" parameter.'}if(!this._is_setup){this._runSetup()}var k=g.title,n=g.text,e=g.image||"",l=g.sticky||false,m=g.class_name||b.gritter.options.class_name,j=b.gritter.options.position,d=g.time||"";this._verifyWrapper();this._item_count++;var f=this._item_count,i=this._tpl_item;b(["before_open","after_open","before_close","after_close"]).each(function(p,q){a["_"+q+"_"+f]=(b.isFunction(g[q]))?g[q]:function(){}});this._custom_timer=0;if(d){this._custom_timer=d}var c=(e!="")?'<img src="'+e+'" class="gritter-image" />':"",h=(e!="")?"gritter-with-image":"gritter-without-image";if(k){k=this._str_replace("[[title]]",k,this._tpl_title)}else{k=""}i=this._str_replace(["[[title]]","[[text]]","[[close]]","[[image]]","[[number]]","[[class_name]]","[[item_class]]"],[k,n,this._tpl_close,c,this._item_count,h,m],i);if(this["_before_open_"+f]()===false){return false}b("#gritter-notice-wrapper").addClass(j).append(i);var o=b("#gritter-item-"+this._item_count);o.fadeIn(this.fade_in_speed,function(){a["_after_open_"+f](b(this))});if(!l){this._setFadeTimer(o,f)}b(o).bind("mouseenter mouseleave",function(p){if(p.type=="mouseenter"){if(!l){a._restoreItemIfFading(b(this),f)}}else{if(!l){a._setFadeTimer(b(this),f)}}a._hoverState(b(this),p.type)});b(o).find(".gritter-close").click(function(){a.removeSpecific(f,{},null,true)});return f},_countRemoveWrapper:function(c,d,f){d.remove();this["_after_close_"+c](d,f);if(b(".gritter-item-wrapper").length==0){b("#gritter-notice-wrapper").remove()}},_fade:function(g,d,j,f){var j=j||{},i=(typeof(j.fade)!="undefined")?j.fade:true,c=j.speed||this.fade_out_speed,h=f;this["_before_close_"+d](g,h);if(f){g.unbind("mouseenter mouseleave")}if(i){g.animate({opacity:0},c,function(){g.animate({height:0},300,function(){a._countRemoveWrapper(d,g,h)})})}else{this._countRemoveWrapper(d,g)}},_hoverState:function(d,c){if(c=="mouseenter"){d.addClass("hover");d.find(".gritter-close").show()}else{d.removeClass("hover");d.find(".gritter-close").hide()}},removeSpecific:function(c,g,f,d){if(!f){var f=b("#gritter-item-"+c)}this._fade(f,c,g||{},d)},_restoreItemIfFading:function(d,c){clearTimeout(this["_int_id_"+c]);d.stop().css({opacity:"",height:""})},_runSetup:function(){for(opt in b.gritter.options){this[opt]=b.gritter.options[opt]}this._is_setup=1},_setFadeTimer:function(f,d){var c=(this._custom_timer)?this._custom_timer:this.time;this["_int_id_"+d]=setTimeout(function(){a._fade(f,d)},c)},stop:function(e){var c=(b.isFunction(e.before_close))?e.before_close:function(){};var f=(b.isFunction(e.after_close))?e.after_close:function(){};var d=b("#gritter-notice-wrapper");c(d);d.fadeOut(function(){b(this).remove();f()})},_str_replace:function(v,e,o,n){var k=0,h=0,t="",m="",g=0,q=0,l=[].concat(v),c=[].concat(e),u=o,d=c instanceof Array,p=u instanceof Array;u=[].concat(u);if(n){this.window[n]=0}for(k=0,g=u.length;k<g;k++){if(u[k]===""){continue}for(h=0,q=l.length;h<q;h++){t=u[k]+"";m=d?(c[h]!==undefined?c[h]:""):c[0];u[k]=(t).split(l[h]).join(m);if(n&&u[k]!==t){this.window[n]+=(t.length-u[k].length)/l[h].length}}}return p?u:u[0]},_verifyWrapper:function(){if(b("#gritter-notice-wrapper").length==0){b("body").append(this._tpl_wrap)}}}})(jQuery);;
// Generated by CoffeeScript 1.7.1

/*
Easy pie chart is a jquery plugin to display simple animated pie charts for only one value

Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.

Built on top of the jQuery library (http://jquery.com)

@source: http://github.com/rendro/easy-pie-chart/
@autor: Robert Fleischmann
@version: 1.0.1

Inspired by: http://dribbble.com/shots/631074-Simple-Pie-Charts-II?list=popular&offset=210
Thanks to Philip Thrasher for the jquery plugin boilerplate for coffee script
 */

(function() {
    (function($) {
        $.easyPieChart = function(el, options) {
            var addScaleLine, animateLine, drawLine, easeInOutQuad, renderBackground, renderScale, renderTrack;
            this.el = el;
            this.$el = $(el);
            this.$el.data("easyPieChart", this);
            this.init = (function(_this) {
                return function() {
                    var percent, scaleBy;
                    _this.options = $.extend({}, $.easyPieChart.defaultOptions, options);
                    percent = parseInt(_this.$el.data('percent'), 10);
                    _this.percentage = 0;
                    _this.canvas = $("<canvas width='" + _this.options.size + "' height='" + _this.options.size + "'></canvas>").get(0);
                    _this.$el.append(_this.canvas);
                    if (typeof G_vmlCanvasManager !== "undefined" && G_vmlCanvasManager !== null) {
                        G_vmlCanvasManager.initElement(_this.canvas);
                    }
                    _this.ctx = _this.canvas.getContext('2d');
                    if (window.devicePixelRatio > 1) {
                        scaleBy = window.devicePixelRatio;
                        $(_this.canvas).css({
                            width: _this.options.size,
                            height: _this.options.size
                        });
                        _this.canvas.width *= scaleBy;
                        _this.canvas.height *= scaleBy;
                        _this.ctx.scale(scaleBy, scaleBy);
                    }
                    _this.ctx.translate(_this.options.size / 2, _this.options.size / 2);
                    _this.$el.addClass('easyPieChart');
                    _this.$el.css({
                        width: _this.options.size,
                        height: _this.options.size,
                        lineHeight: "" + _this.options.size + "px"
                    });
                    _this.update(percent);
                    return _this;
                };
            })(this);
            this.update = (function(_this) {
                return function(percent) {
                    if (_this.options.animate === false) {
                        return drawLine(percent);
                    } else {
                        return animateLine(_this.percentage, percent);
                    }
                };
            })(this);
            renderScale = (function(_this) {
                return function() {
                    var i, _i, _results;
                    _this.ctx.fillStyle = _this.options.scaleColor;
                    _this.ctx.lineWidth = 1;
                    _results = [];
                    for (i = _i = 0; _i <= 24; i = ++_i) {
                        _results.push(addScaleLine(i));
                    }
                    return _results;
                };
            })(this);
            addScaleLine = (function(_this) {
                return function(i) {
                    var offset;
                    offset = i % 6 === 0 ? 0 : _this.options.size * 0.017;
                    _this.ctx.save();
                    _this.ctx.rotate(i * Math.PI / 12);
                    _this.ctx.fillRect(_this.options.size / 2 - offset, 0, -_this.options.size * 0.05 + offset, 1);
                    return _this.ctx.restore();
                };
            })(this);
            renderTrack = (function(_this) {
                return function() {
                    var offset;
                    offset = _this.options.size / 2 - _this.options.lineWidth / 2;
                    if (_this.options.scaleColor !== false) {
                        offset -= _this.options.size * 0.08;
                    }
                    _this.ctx.beginPath();
                    _this.ctx.arc(0, 0, offset, 0, Math.PI * 2, true);
                    _this.ctx.closePath();
                    _this.ctx.strokeStyle = _this.options.trackColor;
                    _this.ctx.lineWidth = _this.options.lineWidth;
                    return _this.ctx.stroke();
                };
            })(this);
            renderBackground = (function(_this) {
                return function() {
                    if (_this.options.scaleColor !== false) {
                        renderScale();
                    }
                    if (_this.options.trackColor !== false) {
                        return renderTrack();
                    }
                };
            })(this);
            drawLine = (function(_this) {
                return function(percent) {
                    var offset;
                    renderBackground();
                    _this.ctx.strokeStyle = $.isFunction(_this.options.barColor) ? _this.options.barColor(percent) : _this.options.barColor;
                    _this.ctx.lineCap = _this.options.lineCap;
                    _this.ctx.lineWidth = _this.options.lineWidth;
                    offset = _this.options.size / 2 - _this.options.lineWidth / 2;
                    if (_this.options.scaleColor !== false) {
                        offset -= _this.options.size * 0.08;
                    }
                    _this.ctx.save();
                    _this.ctx.rotate(-Math.PI / 2);
                    _this.ctx.beginPath();
                    _this.ctx.arc(0, 0, offset, 0, Math.PI * 2 * percent / 100, false);
                    _this.ctx.stroke();
                    return _this.ctx.restore();
                };
            })(this);
            animateLine = (function(_this) {
                return function(from, to) {
                    var currentStep, fps, steps;
                    fps = 30;
                    steps = fps * _this.options.animate / 1000;
                    currentStep = 0;
                    _this.options.onStart.call(_this);
                    _this.percentage = to;
                    if (_this.animation) {
                        clearInterval(_this.animation);
                        _this.animation = false;
                    }
                    return _this.animation = setInterval(function() {
                        _this.ctx.clearRect(-_this.options.size / 2, -_this.options.size / 2, _this.options.size, _this.options.size);
                        renderBackground.call(_this);
                        drawLine.call(_this, [easeInOutQuad(currentStep, from, to - from, steps)]);
                        currentStep++;
                        if ((currentStep / steps) > 1) {
                            clearInterval(_this.animation);
                            _this.animation = false;
                            return _this.options.onStop.call(_this);
                        }
                    }, 1000 / fps);
                };
            })(this);
            easeInOutQuad = function(t, b, c, d) {
                var easeIn, easing;
                easeIn = function(t) {
                    return Math.pow(t, 2);
                };
                easing = function(t) {
                    if (t < 1) {
                        return easeIn(t);
                    } else {
                        return 2 - easeIn((t / 2) * -2 + 2);
                    }
                };
                t /= d / 2;
                return c / 2 * easing(t) + b;
            };
            return this.init();
        };
        $.easyPieChart.defaultOptions = {
            barColor: '#ef1e25',
            trackColor: '#f2f2f2',
            scaleColor: '#dfe0e0',
            lineCap: 'round',
            size: 110,
            lineWidth: 3,
            animate: false,
            onStart: $.noop,
            onStop: $.noop
        };
        $.fn.easyPieChart = function(options) {
            return $.each(this, function(i, el) {
                var $el;
                $el = $(el);
                if (!$el.data('easyPieChart')) {
                    return $el.data('easyPieChart', new $.easyPieChart(el, options));
                }
            });
        };
        return void 0;
    })(jQuery);

}).call(this);

//# sourceMappingURL=jquery.easy-pie-chart.map;
(function(a,b){if(typeof module!=="undefined"&&module.exports){module.exports=b(require("jquery")(a))}else{if(typeof define==="function"&&define.amd){define("bootstrap-dialog",["jquery"],function(c){return b(c)})}else{a.BootstrapDialog=b(a.jQuery)}}}(this,function(b){var a=function(c){this.defaultOptions=b.extend(true,{id:a.newGuid(),buttons:[],data:{},onshow:null,onshown:null,onhide:null,onhidden:null},a.defaultOptions);this.indexedButtons={};this.registeredButtonHotkeys={};this.draggableData={isMouseDown:false,mouseOffset:{}};this.realized=false;this.opened=false;this.initOptions(c);this.holdThisInstance()};a.NAMESPACE="bootstrap-dialog";a.TYPE_DEFAULT="type-default";a.TYPE_INFO="type-info";a.TYPE_PRIMARY="type-primary";a.TYPE_SUCCESS="type-success";a.TYPE_WARNING="type-warning";a.TYPE_DANGER="type-danger";a.DEFAULT_TEXTS={};a.DEFAULT_TEXTS[a.TYPE_DEFAULT]="Information";a.DEFAULT_TEXTS[a.TYPE_INFO]="Information";a.DEFAULT_TEXTS[a.TYPE_PRIMARY]="Information";a.DEFAULT_TEXTS[a.TYPE_SUCCESS]="Success";a.DEFAULT_TEXTS[a.TYPE_WARNING]="Warning";a.DEFAULT_TEXTS[a.TYPE_DANGER]="Danger";a.DEFAULT_TEXTS.OK="OK";a.DEFAULT_TEXTS.CANCEL="Cancel";a.SIZE_NORMAL="size-normal";a.SIZE_WIDE="size-wide";a.SIZE_LARGE="size-large";a.BUTTON_SIZES={};a.BUTTON_SIZES[a.SIZE_NORMAL]="";a.BUTTON_SIZES[a.SIZE_WIDE]="";a.BUTTON_SIZES[a.SIZE_LARGE]="btn-lg";a.ICON_SPINNER="glyphicon glyphicon-asterisk";a.ZINDEX_BACKDROP=1040;a.ZINDEX_MODAL=1050;a.defaultOptions={type:a.TYPE_PRIMARY,size:a.SIZE_NORMAL,cssClass:"",title:null,message:null,nl2br:true,closable:true,closeByBackdrop:true,closeByKeyboard:true,spinicon:a.ICON_SPINNER,autodestroy:true,draggable:false,animate:true,description:""};a.configDefaultOptions=function(c){a.defaultOptions=b.extend(true,a.defaultOptions,c)};a.dialogs={};a.openAll=function(){b.each(a.dialogs,function(d,c){c.open()})};a.closeAll=function(){b.each(a.dialogs,function(d,c){c.close()})};a.moveFocus=function(){var c=null;b.each(a.dialogs,function(e,d){c=d});if(c!==null&&c.isRealized()){c.getModal().focus()}};a.showScrollbar=function(){var c=null;b.each(a.dialogs,function(f,e){c=e});if(c!==null&&c.isRealized()&&c.isOpened()){var d=c.getModal().data("bs.modal");d.checkScrollbar();b("body").addClass("modal-open");d.setScrollbar()}};a.prototype={constructor:a,initOptions:function(c){this.options=b.extend(true,this.defaultOptions,c);return this},holdThisInstance:function(){a.dialogs[this.getId()]=this;return this},initModalStuff:function(){this.setModal(this.createModal()).setModalDialog(this.createModalDialog()).setModalContent(this.createModalContent()).setModalHeader(this.createModalHeader()).setModalBody(this.createModalBody()).setModalFooter(this.createModalFooter());this.getModal().append(this.getModalDialog());this.getModalDialog().append(this.getModalContent());this.getModalContent().append(this.getModalHeader()).append(this.getModalBody()).append(this.getModalFooter());return this},createModal:function(){var c=b('<div class="modal" tabindex="-1" role="dialog" aria-hidden="true"></div>');c.prop("id",this.getId()).attr("aria-labelledby",this.getId()+"_title");return c},getModal:function(){return this.$modal},setModal:function(c){this.$modal=c;return this},createModalDialog:function(){return b('<div class="modal-dialog"></div>')},getModalDialog:function(){return this.$modalDialog},setModalDialog:function(c){this.$modalDialog=c;return this},createModalContent:function(){return b('<div class="modal-content"></div>')},getModalContent:function(){return this.$modalContent},setModalContent:function(c){this.$modalContent=c;return this},createModalHeader:function(){return b('<div class="modal-header"></div>')},getModalHeader:function(){return this.$modalHeader},setModalHeader:function(c){this.$modalHeader=c;return this},createModalBody:function(){return b('<div class="modal-body"></div>')},getModalBody:function(){return this.$modalBody},setModalBody:function(c){this.$modalBody=c;return this},createModalFooter:function(){return b('<div class="modal-footer"></div>')},getModalFooter:function(){return this.$modalFooter},setModalFooter:function(c){this.$modalFooter=c;return this},createDynamicContent:function(d){var c=null;if(typeof d==="function"){c=d.call(d,this)}else{c=d}if(typeof c==="string"){c=this.formatStringContent(c)}return c},formatStringContent:function(c){if(this.options.nl2br){return c.replace(/\r\n/g,"<br />").replace(/[\r\n]/g,"<br />")}return c},setData:function(c,d){this.options.data[c]=d;return this},getData:function(c){return this.options.data[c]},setId:function(c){this.options.id=c;return this},getId:function(){return this.options.id},getType:function(){return this.options.type},setType:function(c){this.options.type=c;this.updateType();return this},updateType:function(){if(this.isRealized()){var c=[a.TYPE_DEFAULT,a.TYPE_INFO,a.TYPE_PRIMARY,a.TYPE_SUCCESS,a.TYPE_WARNING,a.TYPE_DANGER];this.getModal().removeClass(c.join(" ")).addClass(this.getType())}return this},getSize:function(){return this.options.size},setSize:function(c){this.options.size=c;this.updateSize();return this},updateSize:function(){if(this.isRealized()){var c=this;this.getModal().removeClass(a.SIZE_NORMAL).removeClass(a.SIZE_WIDE).removeClass(a.SIZE_LARGE);this.getModal().addClass(this.getSize());this.getModalDialog().removeClass("modal-lg");if(this.getSize()===a.SIZE_WIDE){this.getModalDialog().addClass("modal-lg")}b.each(this.options.buttons,function(e,g){var i=c.getButton(g.id);var d=["btn-lg","btn-sm","btn-xs"];var h=false;if(typeof g.cssClass==="string"){var f=g.cssClass.split(" ");b.each(f,function(j,k){if(b.inArray(k,d)!==-1){h=true}})}if(!h){i.removeClass(d.join(" "));i.addClass(c.getButtonSize())}})}return this},getCssClass:function(){return this.options.cssClass},setCssClass:function(c){this.options.cssClass=c;return this},getTitle:function(){return this.options.title},setTitle:function(c){this.options.title=c;this.updateTitle();return this},updateTitle:function(){if(this.isRealized()){var c=this.getTitle()!==null?this.createDynamicContent(this.getTitle()):this.getDefaultText();this.getModalHeader().find("."+this.getNamespace("title")).html("").append(c).prop("id",this.getId()+"_title")}return this},getMessage:function(){return this.options.message},setMessage:function(c){this.options.message=c;this.updateMessage();return this},updateMessage:function(){if(this.isRealized()){var c=this.createDynamicContent(this.getMessage());this.getModalBody().find("."+this.getNamespace("message")).html("").append(c)}return this},isClosable:function(){return this.options.closable},setClosable:function(c){this.options.closable=c;this.updateClosable();return this},setCloseByBackdrop:function(c){this.options.closeByBackdrop=c;return this},canCloseByBackdrop:function(){return this.options.closeByBackdrop},setCloseByKeyboard:function(c){this.options.closeByKeyboard=c;return this},canCloseByKeyboard:function(){return this.options.closeByKeyboard},isAnimate:function(){return this.options.animate},setAnimate:function(c){this.options.animate=c;return this},updateAnimate:function(){if(this.isRealized()){this.getModal().toggleClass("fade",this.isAnimate())}return this},getSpinicon:function(){return this.options.spinicon},setSpinicon:function(c){this.options.spinicon=c;return this},addButton:function(c){this.options.buttons.push(c);return this},addButtons:function(d){var c=this;b.each(d,function(e,f){c.addButton(f)});return this},getButtons:function(){return this.options.buttons},setButtons:function(c){this.options.buttons=c;this.updateButtons();return this},getButton:function(c){if(typeof this.indexedButtons[c]!=="undefined"){return this.indexedButtons[c]}return null},getButtonSize:function(){if(typeof a.BUTTON_SIZES[this.getSize()]!=="undefined"){return a.BUTTON_SIZES[this.getSize()]}return""},updateButtons:function(){if(this.isRealized()){if(this.getButtons().length===0){this.getModalFooter().hide()}else{this.getModalFooter().find("."+this.getNamespace("footer")).html("").append(this.createFooterButtons())}}return this},isAutodestroy:function(){return this.options.autodestroy},setAutodestroy:function(c){this.options.autodestroy=c},getDescription:function(){return this.options.description},setDescription:function(c){this.options.description=c;return this},getDefaultText:function(){return a.DEFAULT_TEXTS[this.getType()]},getNamespace:function(c){return a.NAMESPACE+"-"+c},createHeaderContent:function(){var c=b("<div></div>");c.addClass(this.getNamespace("header"));c.append(this.createTitleContent());c.prepend(this.createCloseButton());return c},createTitleContent:function(){var c=b("<div></div>");c.addClass(this.getNamespace("title"));return c},createCloseButton:function(){var d=b("<div></div>");d.addClass(this.getNamespace("close-button"));var c=b('<button class="close">&times;</button>');d.append(c);d.on("click",{dialog:this},function(e){e.data.dialog.close()});return d},createBodyContent:function(){var c=b("<div></div>");c.addClass(this.getNamespace("body"));c.append(this.createMessageContent());return c},createMessageContent:function(){var c=b("<div></div>");c.addClass(this.getNamespace("message"));return c},createFooterContent:function(){var c=b("<div></div>");c.addClass(this.getNamespace("footer"));return c},createFooterButtons:function(){var c=this;var d=b("<div></div>");d.addClass(this.getNamespace("footer-buttons"));this.indexedButtons={};b.each(this.options.buttons,function(e,f){if(!f.id){f.id=a.newGuid()}var g=c.createButton(f);c.indexedButtons[f.id]=g;d.append(g)});return d},createButton:function(c){var d=b('<button class="btn"></button>');d.prop("id",c.id);if(typeof c.icon!=="undefined"&&b.trim(c.icon)!==""){d.append(this.createButtonIcon(c.icon))}if(typeof c.label!=="undefined"){d.append(c.label)}if(typeof c.cssClass!=="undefined"&&b.trim(c.cssClass)!==""){d.addClass(c.cssClass)}else{d.addClass("btn-default")}if(typeof c.hotkey!=="undefined"){this.registeredButtonHotkeys[c.hotkey]=d}d.on("click",{dialog:this,$button:d,button:c},function(g){var f=g.data.dialog;var h=g.data.$button;var e=g.data.button;if(typeof e.action==="function"){e.action.call(h,f)}if(e.autospin){h.toggleSpin(true)}});this.enhanceButton(d);return d},enhanceButton:function(c){c.dialog=this;c.toggleEnable=function(d){var e=this;if(typeof d!=="undefined"){e.prop("disabled",!d).toggleClass("disabled",!d)}else{e.prop("disabled",!e.prop("disabled"))}return e};c.enable=function(){var d=this;d.toggleEnable(true);return d};c.disable=function(){var d=this;d.toggleEnable(false);return d};c.toggleSpin=function(g){var f=this;var e=f.dialog;var d=f.find("."+e.getNamespace("button-icon"));if(typeof g==="undefined"){g=!(c.find(".icon-spin").length>0)}if(g){d.hide();c.prepend(e.createButtonIcon(e.getSpinicon()).addClass("icon-spin"))}else{d.show();c.find(".icon-spin").remove()}return f};c.spin=function(){var d=this;d.toggleSpin(true);return d};c.stopSpin=function(){var d=this;d.toggleSpin(false);return d};return this},createButtonIcon:function(d){var c=b("<span></span>");c.addClass(this.getNamespace("button-icon")).addClass(d);return c},enableButtons:function(c){b.each(this.indexedButtons,function(e,d){d.toggleEnable(c)});return this},updateClosable:function(){if(this.isRealized()){this.getModalHeader().find("."+this.getNamespace("close-button")).toggle(this.isClosable())}return this},onShow:function(c){this.options.onshow=c;return this},onShown:function(c){this.options.onshown=c;return this},onHide:function(c){this.options.onhide=c;return this},onHidden:function(c){this.options.onhidden=c;return this},isRealized:function(){return this.realized},setRealized:function(c){this.realized=c;return this},isOpened:function(){return this.opened},setOpened:function(c){this.opened=c;return this},handleModalEvents:function(){this.getModal().on("show.bs.modal",{dialog:this},function(d){var c=d.data.dialog;if(c.isModalEvent(d)&&typeof c.options.onshow==="function"){return c.options.onshow(c)}});this.getModal().on("shown.bs.modal",{dialog:this},function(d){var c=d.data.dialog;c.isModalEvent(d)&&typeof c.options.onshown==="function"&&c.options.onshown(c)});this.getModal().on("hide.bs.modal",{dialog:this},function(d){var c=d.data.dialog;if(c.isModalEvent(d)&&typeof c.options.onhide==="function"){return c.options.onhide(c)}});this.getModal().on("hidden.bs.modal",{dialog:this},function(d){var c=d.data.dialog;c.isModalEvent(d)&&typeof c.options.onhidden==="function"&&c.options.onhidden(c);c.isAutodestroy()&&b(this).remove();a.moveFocus()});this.getModal().on("click",{dialog:this},function(c){c.target===this&&c.data.dialog.isClosable()&&c.data.dialog.canCloseByBackdrop()&&c.data.dialog.close()});this.getModal().on("keyup",{dialog:this},function(c){c.which===27&&c.data.dialog.isClosable()&&c.data.dialog.canCloseByKeyboard()&&c.data.dialog.close()});this.getModal().on("keyup",{dialog:this},function(d){var c=d.data.dialog;if(typeof c.registeredButtonHotkeys[d.which]!=="undefined"){var e=b(c.registeredButtonHotkeys[d.which]);!e.prop("disabled")&&e.focus().trigger("click")}});return this},isModalEvent:function(c){return typeof c.namespace!=="undefined"&&c.namespace==="bs.modal"},makeModalDraggable:function(){if(this.options.draggable){this.getModalHeader().addClass(this.getNamespace("draggable")).on("mousedown",{dialog:this},function(e){var d=e.data.dialog;d.draggableData.isMouseDown=true;var c=d.getModalDialog().offset();d.draggableData.mouseOffset={top:e.clientY-c.top,left:e.clientX-c.left}});this.getModal().on("mouseup mouseleave",{dialog:this},function(c){c.data.dialog.draggableData.isMouseDown=false});b("body").on("mousemove",{dialog:this},function(d){var c=d.data.dialog;if(!c.draggableData.isMouseDown){return}c.getModalDialog().offset({top:d.clientY-c.draggableData.mouseOffset.top,left:d.clientX-c.draggableData.mouseOffset.left})})}return this},updateZIndex:function(){var e=0;b.each(a.dialogs,function(f,g){e++});var d=this.getModal();var c=d.data("bs.modal").$backdrop;d.css("z-index",a.ZINDEX_MODAL+(e-1)*20);c.css("z-index",a.ZINDEX_BACKDROP+(e-1)*20);return this},realize:function(){this.initModalStuff();this.getModal().addClass(a.NAMESPACE).addClass(this.getCssClass());this.updateSize();if(this.getDescription()){this.getModal().attr("aria-describedby",this.getDescription())}this.getModalFooter().append(this.createFooterContent());this.getModalHeader().append(this.createHeaderContent());this.getModalBody().append(this.createBodyContent());this.getModal().modal({backdrop:"static",keyboard:false,show:false});this.makeModalDraggable();this.handleModalEvents();this.setRealized(true);this.updateButtons();this.updateType();this.updateTitle();this.updateMessage();this.updateClosable();this.updateAnimate();this.updateSize();return this},open:function(){!this.isRealized()&&this.realize();this.getModal().modal("show");this.updateZIndex();this.setOpened(true);return this},close:function(){this.getModal().modal("hide");if(this.isAutodestroy()){delete a.dialogs[this.getId()]}this.setOpened(false);a.showScrollbar();return this}};a.newGuid=function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(f){var e=Math.random()*16|0,d=f==="x"?e:(e&3|8);return d.toString(16)})};a.show=function(c){return new a(c).open()};a.alert=function(){var d={};var c={type:a.TYPE_PRIMARY,title:null,message:null,closable:true,buttonLabel:a.DEFAULT_TEXTS.OK,callback:null};if(typeof arguments[0]==="object"&&arguments[0].constructor==={}.constructor){d=b.extend(true,c,arguments[0])}else{d=b.extend(true,c,{message:arguments[0],closable:false,buttonLabel:a.DEFAULT_TEXTS.OK,callback:typeof arguments[1]!=="undefined"?arguments[1]:null})}return new a({type:d.type,title:d.title,message:d.message,closable:d.closable,data:{callback:d.callback},onhide:function(e){!e.getData("btnClicked")&&e.isClosable()&&typeof e.getData("callback")==="function"&&e.getData("callback")(false)},buttons:[{label:d.buttonLabel,action:function(e){e.setData("btnClicked",true);typeof e.getData("callback")==="function"&&e.getData("callback")(true);e.close()}}]}).open()};a.confirm=function(c,d){return new a({title:"Confirmation",message:c,closable:false,data:{callback:d},buttons:[{label:a.DEFAULT_TEXTS.CANCEL,action:function(e){typeof e.getData("callback")==="function"&&e.getData("callback")(false);e.close()}},{label:a.DEFAULT_TEXTS.OK,cssClass:"btn-primary",action:function(e){typeof e.getData("callback")==="function"&&e.getData("callback")(true);e.close()}}]}).open()};a.warning=function(c,d){return new a({type:a.TYPE_WARNING,message:c}).open()};a.danger=function(c,d){return new a({type:a.TYPE_DANGER,message:c}).open()};a.success=function(c,d){return new a({type:a.TYPE_SUCCESS,message:c}).open()};return a}));;
/* ========================================================================
 * bootstrap-switch - v3.3.0
 * http://www.bootstrap-switch.org
 * ========================================================================
 * Copyright 2012-2013 Mattia Larentis
 *
 * ========================================================================
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ========================================================================
 */

(function(){var t=[].slice;!function(e,i){"use strict";var n;return n=function(){function t(t,n){var o;null==n&&(n={}),this.$element=e(t),this.options=e.extend({},e.fn.bootstrapSwitch.defaults,{state:this.$element.is(":checked"),size:this.$element.data("size"),animate:this.$element.data("animate"),disabled:this.$element.is(":disabled"),readonly:this.$element.is("[readonly]"),indeterminate:this.$element.data("indeterminate"),inverse:this.$element.data("inverse"),radioAllOff:this.$element.data("radio-all-off"),onColor:this.$element.data("on-color"),offColor:this.$element.data("off-color"),onText:this.$element.data("on-text"),offText:this.$element.data("off-text"),labelText:this.$element.data("label-text"),handleWidth:this.$element.data("handle-width"),labelWidth:this.$element.data("label-width"),baseClass:this.$element.data("base-class"),wrapperClass:this.$element.data("wrapper-class")},n),this.$wrapper=e("<div>",{"class":function(t){return function(){var e;return e=[""+t.options.baseClass].concat(t._getClasses(t.options.wrapperClass)),e.push(t.options.state?""+t.options.baseClass+"-on":""+t.options.baseClass+"-off"),null!=t.options.size&&e.push(""+t.options.baseClass+"-"+t.options.size),t.options.disabled&&e.push(""+t.options.baseClass+"-disabled"),t.options.readonly&&e.push(""+t.options.baseClass+"-readonly"),t.options.indeterminate&&e.push(""+t.options.baseClass+"-indeterminate"),t.options.inverse&&e.push(""+t.options.baseClass+"-inverse"),t.$element.attr("id")&&e.push(""+t.options.baseClass+"-id-"+t.$element.attr("id")),e.join(" ")}}(this)()}),this.$container=e("<div>",{"class":""+this.options.baseClass+"-container"}),this.$on=e("<span>",{html:this.options.onText,"class":""+this.options.baseClass+"-handle-on "+this.options.baseClass+"-"+this.options.onColor}),this.$off=e("<span>",{html:this.options.offText,"class":""+this.options.baseClass+"-handle-off "+this.options.baseClass+"-"+this.options.offColor}),this.$label=e("<span>",{html:this.options.labelText,"class":""+this.options.baseClass+"-label"}),this.$element.on("init.bootstrapSwitch",function(e){return function(){return e.options.onInit.apply(t,arguments)}}(this)),this.$element.on("switchChange.bootstrapSwitch",function(e){return function(){return e.options.onSwitchChange.apply(t,arguments)}}(this)),this.$container=this.$element.wrap(this.$container).parent(),this.$wrapper=this.$container.wrap(this.$wrapper).parent(),this.$element.before(this.options.inverse?this.$off:this.$on).before(this.$label).before(this.options.inverse?this.$on:this.$off),this.options.indeterminate&&this.$element.prop("indeterminate",!0),o=i.setInterval(function(t){return function(){return t.$wrapper.is(":visible")?(t._width(),t._containerPosition(null,function(){return t.options.animate?t.$wrapper.addClass(""+t.options.baseClass+"-animate"):void 0}),i.clearInterval(o)):void 0}}(this),50),this._elementHandlers(),this._handleHandlers(),this._labelHandlers(),this._formHandler(),this._externalLabelHandler(),this.$element.trigger("init.bootstrapSwitch")}return t.prototype._constructor=t,t.prototype.state=function(t,e){return"undefined"==typeof t?this.options.state:this.options.disabled||this.options.readonly?this.$element:this.options.state&&!this.options.radioAllOff&&this.$element.is(":radio")?this.$element:(this.options.indeterminate&&this.indeterminate(!1),t=!!t,this.$element.prop("checked",t).trigger("change.bootstrapSwitch",e),this.$element)},t.prototype.toggleState=function(t){return this.options.disabled||this.options.readonly?this.$element:this.options.indeterminate?(this.indeterminate(!1),this.state(!0)):this.$element.prop("checked",!this.options.state).trigger("change.bootstrapSwitch",t)},t.prototype.size=function(t){return"undefined"==typeof t?this.options.size:(null!=this.options.size&&this.$wrapper.removeClass(""+this.options.baseClass+"-"+this.options.size),t&&this.$wrapper.addClass(""+this.options.baseClass+"-"+t),this._width(),this._containerPosition(),this.options.size=t,this.$element)},t.prototype.animate=function(t){return"undefined"==typeof t?this.options.animate:(t=!!t,t===this.options.animate?this.$element:this.toggleAnimate())},t.prototype.toggleAnimate=function(){return this.options.animate=!this.options.animate,this.$wrapper.toggleClass(""+this.options.baseClass+"-animate"),this.$element},t.prototype.disabled=function(t){return"undefined"==typeof t?this.options.disabled:(t=!!t,t===this.options.disabled?this.$element:this.toggleDisabled())},t.prototype.toggleDisabled=function(){return this.options.disabled=!this.options.disabled,this.$element.prop("disabled",this.options.disabled),this.$wrapper.toggleClass(""+this.options.baseClass+"-disabled"),this.$element},t.prototype.readonly=function(t){return"undefined"==typeof t?this.options.readonly:(t=!!t,t===this.options.readonly?this.$element:this.toggleReadonly())},t.prototype.toggleReadonly=function(){return this.options.readonly=!this.options.readonly,this.$element.prop("readonly",this.options.readonly),this.$wrapper.toggleClass(""+this.options.baseClass+"-readonly"),this.$element},t.prototype.indeterminate=function(t){return"undefined"==typeof t?this.options.indeterminate:(t=!!t,t===this.options.indeterminate?this.$element:this.toggleIndeterminate())},t.prototype.toggleIndeterminate=function(){return this.options.indeterminate=!this.options.indeterminate,this.$element.prop("indeterminate",this.options.indeterminate),this.$wrapper.toggleClass(""+this.options.baseClass+"-indeterminate"),this._containerPosition(),this.$element},t.prototype.inverse=function(t){return"undefined"==typeof t?this.options.inverse:(t=!!t,t===this.options.inverse?this.$element:this.toggleInverse())},t.prototype.toggleInverse=function(){var t,e;return this.$wrapper.toggleClass(""+this.options.baseClass+"-inverse"),e=this.$on.clone(!0),t=this.$off.clone(!0),this.$on.replaceWith(t),this.$off.replaceWith(e),this.$on=t,this.$off=e,this.options.inverse=!this.options.inverse,this.$element},t.prototype.onColor=function(t){var e;return e=this.options.onColor,"undefined"==typeof t?e:(null!=e&&this.$on.removeClass(""+this.options.baseClass+"-"+e),this.$on.addClass(""+this.options.baseClass+"-"+t),this.options.onColor=t,this.$element)},t.prototype.offColor=function(t){var e;return e=this.options.offColor,"undefined"==typeof t?e:(null!=e&&this.$off.removeClass(""+this.options.baseClass+"-"+e),this.$off.addClass(""+this.options.baseClass+"-"+t),this.options.offColor=t,this.$element)},t.prototype.onText=function(t){return"undefined"==typeof t?this.options.onText:(this.$on.html(t),this._width(),this._containerPosition(),this.options.onText=t,this.$element)},t.prototype.offText=function(t){return"undefined"==typeof t?this.options.offText:(this.$off.html(t),this._width(),this._containerPosition(),this.options.offText=t,this.$element)},t.prototype.labelText=function(t){return"undefined"==typeof t?this.options.labelText:(this.$label.html(t),this._width(),this.options.labelText=t,this.$element)},t.prototype.handleWidth=function(t){return"undefined"==typeof t?this.options.handleWidth:(this.options.handleWidth=t,this._width(),this._containerPosition(),this.$element)},t.prototype.labelWidth=function(t){return"undefined"==typeof t?this.options.labelWidth:(this.options.labelWidth=t,this._width(),this._containerPosition(),this.$element)},t.prototype.baseClass=function(){return this.options.baseClass},t.prototype.wrapperClass=function(t){return"undefined"==typeof t?this.options.wrapperClass:(t||(t=e.fn.bootstrapSwitch.defaults.wrapperClass),this.$wrapper.removeClass(this._getClasses(this.options.wrapperClass).join(" ")),this.$wrapper.addClass(this._getClasses(t).join(" ")),this.options.wrapperClass=t,this.$element)},t.prototype.radioAllOff=function(t){return"undefined"==typeof t?this.options.radioAllOff:(t=!!t,t===this.options.radioAllOff?this.$element:(this.options.radioAllOff=t,this.$element))},t.prototype.onInit=function(t){return"undefined"==typeof t?this.options.onInit:(t||(t=e.fn.bootstrapSwitch.defaults.onInit),this.options.onInit=t,this.$element)},t.prototype.onSwitchChange=function(t){return"undefined"==typeof t?this.options.onSwitchChange:(t||(t=e.fn.bootstrapSwitch.defaults.onSwitchChange),this.options.onSwitchChange=t,this.$element)},t.prototype.destroy=function(){var t;return t=this.$element.closest("form"),t.length&&t.off("reset.bootstrapSwitch").removeData("bootstrap-switch"),this.$container.children().not(this.$element).remove(),this.$element.unwrap().unwrap().off(".bootstrapSwitch").removeData("bootstrap-switch"),this.$element},t.prototype._width=function(){var t,e;return t=this.$on.add(this.$off),t.add(this.$label).css("width",""),e="auto"===this.options.handleWidth?Math.max(this.$on.width(),this.$off.width()):this.options.handleWidth,t.width(e),this.$label.width(function(t){return function(i,n){return"auto"!==t.options.labelWidth?t.options.labelWidth:e>n?e:n}}(this)),this._handleWidth=this.$on.outerWidth(),this._labelWidth=this.$label.outerWidth(),this.$container.width(2*this._handleWidth+this._labelWidth),this.$wrapper.width(this._handleWidth+this._labelWidth)},t.prototype._containerPosition=function(t,e){return null==t&&(t=this.options.state),this.$container.css("margin-left",function(e){return function(){var i;return i=[0,"-"+e._handleWidth+"px"],e.options.indeterminate?"-"+e._handleWidth/2+"px":t?e.options.inverse?i[1]:i[0]:e.options.inverse?i[0]:i[1]}}(this)),e?setTimeout(function(){return e()},50):void 0},t.prototype._elementHandlers=function(){return this.$element.on({"change.bootstrapSwitch":function(t){return function(i,n){var o;return i.preventDefault(),i.stopImmediatePropagation(),o=t.$element.is(":checked"),t._containerPosition(o),o!==t.options.state?(t.options.state=o,t.$wrapper.toggleClass(""+t.options.baseClass+"-off").toggleClass(""+t.options.baseClass+"-on"),n||t.$element.is(":radio")&&e("[name='"+t.$element.attr("name")+"']").not(t.$element).prop("checked",!1).trigger("change.bootstrapSwitch",!0),t.$element.trigger("switchChange.bootstrapSwitch",[o])):void 0}}(this),"focus.bootstrapSwitch":function(t){return function(e){return e.preventDefault(),t.$wrapper.addClass(""+t.options.baseClass+"-focused")}}(this),"blur.bootstrapSwitch":function(t){return function(e){return e.preventDefault(),t.$wrapper.removeClass(""+t.options.baseClass+"-focused")}}(this),"keydown.bootstrapSwitch":function(t){return function(e){if(e.which&&!t.options.disabled&&!t.options.readonly)switch(e.which){case 37:return e.preventDefault(),e.stopImmediatePropagation(),t.state(!1);case 39:return e.preventDefault(),e.stopImmediatePropagation(),t.state(!0)}}}(this)})},t.prototype._handleHandlers=function(){return this.$on.on("click.bootstrapSwitch",function(t){return function(e){return e.preventDefault(),e.stopPropagation(),t.state(!1),t.$element.trigger("focus.bootstrapSwitch")}}(this)),this.$off.on("click.bootstrapSwitch",function(t){return function(e){return e.preventDefault(),e.stopPropagation(),t.state(!0),t.$element.trigger("focus.bootstrapSwitch")}}(this))},t.prototype._labelHandlers=function(){return this.$label.on({"mousedown.bootstrapSwitch touchstart.bootstrapSwitch":function(t){return function(e){return t._dragStart||t.options.disabled||t.options.readonly?void 0:(e.preventDefault(),e.stopPropagation(),t._dragStart=(e.pageX||e.originalEvent.touches[0].pageX)-parseInt(t.$container.css("margin-left"),10),t.options.animate&&t.$wrapper.removeClass(""+t.options.baseClass+"-animate"),t.$element.trigger("focus.bootstrapSwitch"))}}(this),"mousemove.bootstrapSwitch touchmove.bootstrapSwitch":function(t){return function(e){var i;if(null!=t._dragStart&&(e.preventDefault(),i=(e.pageX||e.originalEvent.touches[0].pageX)-t._dragStart,!(i<-t._handleWidth||i>0)))return t._dragEnd=i,t.$container.css("margin-left",""+t._dragEnd+"px")}}(this),"mouseup.bootstrapSwitch touchend.bootstrapSwitch":function(t){return function(e){var i;if(t._dragStart)return e.preventDefault(),t.options.animate&&t.$wrapper.addClass(""+t.options.baseClass+"-animate"),t._dragEnd?(i=t._dragEnd>-(t._handleWidth/2),t._dragEnd=!1,t.state(t.options.inverse?!i:i)):t.state(!t.options.state),t._dragStart=!1}}(this),"mouseleave.bootstrapSwitch":function(t){return function(){return t.$label.trigger("mouseup.bootstrapSwitch")}}(this)})},t.prototype._externalLabelHandler=function(){var t;return t=this.$element.closest("label"),t.on("click",function(e){return function(i){return i.preventDefault(),i.stopImmediatePropagation(),i.target===t[0]?e.toggleState():void 0}}(this))},t.prototype._formHandler=function(){var t;return t=this.$element.closest("form"),t.data("bootstrap-switch")?void 0:t.on("reset.bootstrapSwitch",function(){return i.setTimeout(function(){return t.find("input").filter(function(){return e(this).data("bootstrap-switch")}).each(function(){return e(this).bootstrapSwitch("state",this.checked)})},1)}).data("bootstrap-switch",!0)},t.prototype._getClasses=function(t){var i,n,o,s;if(!e.isArray(t))return[""+this.options.baseClass+"-"+t];for(n=[],o=0,s=t.length;s>o;o++)i=t[o],n.push(""+this.options.baseClass+"-"+i);return n},t}(),e.fn.bootstrapSwitch=function(){var i,o,s;return o=arguments[0],i=2<=arguments.length?t.call(arguments,1):[],s=this,this.each(function(){var t,a;return t=e(this),a=t.data("bootstrap-switch"),a||t.data("bootstrap-switch",a=new n(this,o)),"string"==typeof o?s=a[o].apply(a,i):void 0}),s},e.fn.bootstrapSwitch.Constructor=n,e.fn.bootstrapSwitch.defaults={state:!0,size:null,animate:!0,disabled:!1,readonly:!1,indeterminate:!1,inverse:!1,radioAllOff:!1,onColor:"primary",offColor:"default",onText:"ON",offText:"OFF",labelText:"&nbsp;",handleWidth:"auto",labelWidth:"auto",baseClass:"bootstrap-switch",wrapperClass:"wrapper",onInit:function(){},onSwitchChange:function(){}}}(window.jQuery,window)}).call(this);;
(function(t,e){"object"==typeof exports?module.exports=e():"function"==typeof define&&define.amd?define(e):t.Spinner=e()})(this,function(){"use strict";function t(t,e){var i,n=document.createElement(t||"div");for(i in e)n[i]=e[i];return n}function e(t){for(var e=1,i=arguments.length;i>e;e++)t.appendChild(arguments[e]);return t}function i(t,e,i,n){var r=["opacity",e,~~(100*t),i,n].join("-"),o=.01+100*(i/n),a=Math.max(1-(1-t)/e*(100-o),t),s=u.substring(0,u.indexOf("Animation")).toLowerCase(),l=s&&"-"+s+"-"||"";return c[r]||(p.insertRule("@"+l+"keyframes "+r+"{"+"0%{opacity:"+a+"}"+o+"%{opacity:"+t+"}"+(o+.01)+"%{opacity:1}"+(o+e)%100+"%{opacity:"+t+"}"+"100%{opacity:"+a+"}"+"}",p.cssRules.length),c[r]=1),r}function n(t,e){var i,n,r=t.style;for(e=e.charAt(0).toUpperCase()+e.slice(1),n=0;d.length>n;n++)if(i=d[n]+e,void 0!==r[i])return i;return void 0!==r[e]?e:void 0}function r(t,e){for(var i in e)t.style[n(t,i)||i]=e[i];return t}function o(t){for(var e=1;arguments.length>e;e++){var i=arguments[e];for(var n in i)void 0===t[n]&&(t[n]=i[n])}return t}function a(t,e){return"string"==typeof t?t:t[e%t.length]}function s(t){this.opts=o(t||{},s.defaults,f)}function l(){function i(e,i){return t("<"+e+' xmlns="urn:schemas-microsoft.com:vml" class="spin-vml">',i)}p.addRule(".spin-vml","behavior:url(#default#VML)"),s.prototype.lines=function(t,n){function o(){return r(i("group",{coordsize:d+" "+d,coordorigin:-u+" "+-u}),{width:d,height:d})}function s(t,s,l){e(p,e(r(o(),{rotation:360/n.lines*t+"deg",left:~~s}),e(r(i("roundrect",{arcsize:n.corners}),{width:u,height:n.width,left:n.radius,top:-n.width>>1,filter:l}),i("fill",{color:a(n.color,t),opacity:n.opacity}),i("stroke",{opacity:0}))))}var l,u=n.length+n.width,d=2*u,c=2*-(n.width+n.length)+"px",p=r(o(),{position:"absolute",top:c,left:c});if(n.shadow)for(l=1;n.lines>=l;l++)s(l,-2,"progid:DXImageTransform.Microsoft.Blur(pixelradius=2,makeshadow=1,shadowopacity=.3)");for(l=1;n.lines>=l;l++)s(l);return e(t,p)},s.prototype.opacity=function(t,e,i,n){var r=t.firstChild;n=n.shadow&&n.lines||0,r&&r.childNodes.length>e+n&&(r=r.childNodes[e+n],r=r&&r.firstChild,r=r&&r.firstChild,r&&(r.opacity=i))}}var u,d=["webkit","Moz","ms","O"],c={},p=function(){var i=t("style",{type:"text/css"});return e(document.getElementsByTagName("head")[0],i),i.sheet||i.styleSheet}(),f={lines:12,length:7,width:5,radius:10,rotate:0,corners:1,color:"#000",direction:1,speed:1,trail:100,opacity:.25,fps:20,zIndex:2e9,className:"spinner",top:"50%",left:"50%",position:"absolute"};s.defaults={},o(s.prototype,{spin:function(e){this.stop();var i=this,n=i.opts,o=i.el=r(t(0,{className:n.className}),{position:n.position,width:0,zIndex:n.zIndex});if(n.radius+n.length+n.width,r(o,{left:n.left,top:n.top}),e&&e.insertBefore(o,e.firstChild||null),o.setAttribute("role","progressbar"),i.lines(o,i.opts),!u){var a,s=0,l=(n.lines-1)*(1-n.direction)/2,d=n.fps,c=d/n.speed,p=(1-n.opacity)/(c*n.trail/100),f=c/n.lines;(function h(){s++;for(var t=0;n.lines>t;t++)a=Math.max(1-(s+(n.lines-t)*f)%c*p,n.opacity),i.opacity(o,t*n.direction+l,a,n);i.timeout=i.el&&setTimeout(h,~~(1e3/d))})()}return i},stop:function(){var t=this.el;return t&&(clearTimeout(this.timeout),t.parentNode&&t.parentNode.removeChild(t),this.el=void 0),this},lines:function(n,o){function s(e,i){return r(t(),{position:"absolute",width:o.length+o.width+"px",height:o.width+"px",background:e,boxShadow:i,transformOrigin:"left",transform:"rotate("+~~(360/o.lines*d+o.rotate)+"deg) translate("+o.radius+"px"+",0)",borderRadius:(o.corners*o.width>>1)+"px"})}for(var l,d=0,c=(o.lines-1)*(1-o.direction)/2;o.lines>d;d++)l=r(t(),{position:"absolute",top:1+~(o.width/2)+"px",transform:o.hwaccel?"translate3d(0,0,0)":"",opacity:o.opacity,animation:u&&i(o.opacity,o.trail,c+d*o.direction,o.lines)+" "+1/o.speed+"s linear infinite"}),o.shadow&&e(l,r(s("#000","0 0 4px #000"),{top:"2px"})),e(n,e(l,s(a(o.color,d),"0 0 1px rgba(0,0,0,.1)")));return n},opacity:function(t,e,i){t.childNodes.length>e&&(t.childNodes[e].style.opacity=i)}});var h=r(t("group"),{behavior:"url(#default#VML)"});return!n(h,"transform")&&h.adj?l():u=n(h,"animation"),s});;
/*!
 * Ladda 0.9.4 (2014-06-21, 11:24)
 * http://lab.hakim.se/ladda
 * MIT licensed
 *
 * Copyright (C) 2014 Hakim El Hattab, http://hakim.se
 */
(function(t,e){"object"==typeof exports?module.exports=e(require("spin.js")):"function"==typeof define&&define.amd?define(["spin"],e):t.Ladda=e(t.Spinner)})(this,function(t){"use strict";function e(t){if(t===void 0)return console.warn("Ladda button target must be defined."),void 0;t.querySelector(".ladda-label")||(t.innerHTML='<span class="ladda-label">'+t.innerHTML+"</span>");var e,n=document.createElement("span");n.className="ladda-spinner",t.appendChild(n);var r,a={start:function(){return e||(e=o(t)),t.setAttribute("disabled",""),t.setAttribute("data-loading",""),clearTimeout(r),e.spin(n),this.setProgress(0),this},startAfter:function(t){return clearTimeout(r),r=setTimeout(function(){a.start()},t),this},stop:function(){return t.removeAttribute("disabled"),t.removeAttribute("data-loading"),clearTimeout(r),e&&(r=setTimeout(function(){e.stop()},1e3)),this},toggle:function(){return this.isLoading()?this.stop():this.start(),this},setProgress:function(e){e=Math.max(Math.min(e,1),0);var n=t.querySelector(".ladda-progress");0===e&&n&&n.parentNode?n.parentNode.removeChild(n):(n||(n=document.createElement("div"),n.className="ladda-progress",t.appendChild(n)),n.style.width=(e||0)*t.offsetWidth+"px")},enable:function(){return this.stop(),this},disable:function(){return this.stop(),t.setAttribute("disabled",""),this},isLoading:function(){return t.hasAttribute("data-loading")},remove:function(){clearTimeout(r),t.removeAttribute("disabled",""),t.removeAttribute("data-loading",""),e&&(e.stop(),e=null);for(var n=0,i=u.length;i>n;n++)if(a===u[n]){u.splice(n,1);break}}};return u.push(a),a}function n(t,e){for(;t.parentNode&&t.tagName!==e;)t=t.parentNode;return e===t.tagName?t:void 0}function r(t){for(var e=["input","textarea"],n=[],r=0;e.length>r;r++)for(var a=t.getElementsByTagName(e[r]),i=0;a.length>i;i++)a[i].hasAttribute("required")&&n.push(a[i]);return n}function a(t,a){a=a||{};var i=[];"string"==typeof t?i=s(document.querySelectorAll(t)):"object"==typeof t&&"string"==typeof t.nodeName&&(i=[t]);for(var o=0,u=i.length;u>o;o++)(function(){var t=i[o];if("function"==typeof t.addEventListener){var s=e(t),u=-1;t.addEventListener("click",function(){var e=!0,i=n(t,"FORM");if(i!==void 0)for(var o=r(i),d=0;o.length>d;d++)""===o[d].value.replace(/^\s+|\s+$/g,"")&&(e=!1);e&&(s.startAfter(1),"number"==typeof a.timeout&&(clearTimeout(u),u=setTimeout(s.stop,a.timeout)),"function"==typeof a.callback&&a.callback.apply(null,[s]))},!1)}})()}function i(){for(var t=0,e=u.length;e>t;t++)u[t].stop()}function o(e){var n,r=e.offsetHeight;0===r&&(r=parseFloat(window.getComputedStyle(e).height)),r>32&&(r*=.8),e.hasAttribute("data-spinner-size")&&(r=parseInt(e.getAttribute("data-spinner-size"),10)),e.hasAttribute("data-spinner-color")&&(n=e.getAttribute("data-spinner-color"));var a=12,i=.2*r,o=.6*i,s=7>i?2:3;return new t({color:n||"#fff",lines:a,radius:i,length:o,width:s,zIndex:"auto",top:"auto",left:"auto",className:""})}function s(t){for(var e=[],n=0;t.length>n;n++)e.push(t[n]);return e}var u=[];return{bind:a,create:e,stopAll:i}});;
!function ($) {

    "use strict";

    // TABCOLLAPSE CLASS DEFINITION
    // ======================

    var TabCollapse = function (el, options) {
        this.options = options;
        this.$tabs = $(el);

        this._accordionVisible = false; //content is attached to tabs at first
        this._initAccordion();
        this._checkStateOnResize();


        // checkState() has gone to setTimeout for making it possible to attach listeners to
        // shown-accordion.bs.tabcollapse event on page load.
        // See https://github.com/flatlogic/bootstrap-tabcollapse/issues/23
        var that = this;
        setTimeout(function () {
            that.checkState();
        }, 0);
    };

    TabCollapse.DEFAULTS = {
        accordionClass: 'visible-xs',
        tabsClass: 'hidden-xs',
        accordionTemplate: function (heading, groupId, parentId, active, originalClass) {
            return '<div class="panel panel-default '+originalClass+'">' +
                    '   <div class="panel-heading">' +
                    '      <h4 class="panel-title">' +
                    '      </h4>' +
                    '   </div>' +
                    '   <div id="' + groupId + '" class="panel-collapse collapse ' + (active ? 'in' : '') + '">' +
                    '       <div class="panel-body js-tabcollapse-panel-body">' +
                    '       </div>' +
                    '   </div>' +
                    '</div>'

        }
    };

    TabCollapse.prototype.checkState = function () {
        if (this.$tabs.is(':visible') && this._accordionVisible) {
            this.showTabs();
            this._accordionVisible = false;
        } else if (this.$accordion.is(':visible') && !this._accordionVisible) {
            this.showAccordion();
            this._accordionVisible = true;
        }
    };

    TabCollapse.prototype.showTabs = function () {
        var view = this;
        this.$tabs.trigger($.Event('show-tabs.bs.tabcollapse'));

        var $panelHeadings = this.$accordion.find('.js-tabcollapse-panel-heading').detach();

        $panelHeadings.each(function () {
            var $panelHeading = $(this),
            $parentLi = $panelHeading.data('bs.tabcollapse.parentLi');

            var $oldHeading = view._panelHeadingToTabHeading($panelHeading);

            $parentLi.removeClass('active');
            if ($parentLi.parent().hasClass('dropdown-menu') && !$parentLi.siblings('li').hasClass('active')) {
                $parentLi.parent().parent().removeClass('active');
            }

            if (!$oldHeading.hasClass('collapsed')) {
                $parentLi.addClass('active');
                if ($parentLi.parent().hasClass('dropdown-menu')) {
                    $parentLi.parent().parent().addClass('active');
                }
            } else {
                $oldHeading.removeClass('collapsed');
            }

            $parentLi.append($panelHeading);
        });

        if (!$('li').hasClass('active')) {
            $('li').first().addClass('active')
        }

        var $panelBodies = this.$accordion.find('.js-tabcollapse-panel-body');
        $panelBodies.each(function () {
            var $panelBody = $(this),
                $tabPane = $panelBody.data('bs.tabcollapse.tabpane');
            $tabPane.append($panelBody.contents().detach());
        });
        this.$accordion.html('');

        if (this.options.updateLinks) {
            var $tabContents = this.getTabContentElement();
            $tabContents.find('[data-toggle-was="tab"], [data-toggle-was="pill"]').each(function () {
                var $el = $(this);
                var href = $el.attr('href').replace(/-collapse$/g, '');
                $el.attr({
                    'data-toggle': $el.attr('data-toggle-was'),
                    'data-toggle-was': '',
                    'data-parent': '',
                    href: href
                });
            });
        }

        this.$tabs.trigger($.Event('shown-tabs.bs.tabcollapse'));
    };

    TabCollapse.prototype.getTabContentElement = function () {
        var $tabContents = $(this.options.tabContentSelector);
        if ($tabContents.length === 0) {
            $tabContents = this.$tabs.siblings('.tab-content');
        }
        return $tabContents;
    };

    TabCollapse.prototype.showAccordion = function () {
        this.$tabs.trigger($.Event('show-accordion.bs.tabcollapse'));

        var $headings = this.$tabs.find('li:not(.dropdown) [data-toggle="tab"], li:not(.dropdown) [data-toggle="pill"]'),
            view = this;
        $headings.each(function () {
            var $heading = $(this),
                $parentLi = $heading.parent();
            $heading.data('bs.tabcollapse.parentLi', $parentLi);
            view.$accordion.append(view._createAccordionGroup(view.$accordion.attr('id'), $heading.detach()));
        });

        if (this.options.updateLinks) {
            var parentId = this.$accordion.attr('id');
            var $selector = this.$accordion.find('.js-tabcollapse-panel-body');
            $selector.find('[data-toggle="tab"], [data-toggle="pill"]').each(function () {
                var $el = $(this);
                var href = $el.attr('href') + '-collapse';
                $el.attr({
                    'data-toggle-was': $el.attr('data-toggle'),
                    'data-toggle': 'collapse',
                    'data-parent': '#' + parentId,
                    href: href
                });
            });
        }

        this.$tabs.trigger($.Event('shown-accordion.bs.tabcollapse'));
    };

    TabCollapse.prototype._panelHeadingToTabHeading = function ($heading) {
        var href = $heading.attr('href').replace(/-collapse$/g, '');
        $heading.attr({
            'data-toggle': 'tab',
            'href': href,
            'data-parent': ''
        });
        return $heading;
    };

    TabCollapse.prototype._tabHeadingToPanelHeading = function ($heading, groupId, parentId, active) {
        $heading.addClass('js-tabcollapse-panel-heading ' + (active ? '' : 'collapsed'));
        $heading.attr({
            'data-toggle': 'collapse',
            'data-parent': '#' + parentId,
            'href': '#' + groupId
        });
        return $heading;
    };

    TabCollapse.prototype._checkStateOnResize = function () {
        var view = this;
        $(window).resize(function () {
            clearTimeout(view._resizeTimeout);
            view._resizeTimeout = setTimeout(function () {
                view.checkState();
            }, 100);
        });
    };


    TabCollapse.prototype._initAccordion = function () {
        var randomString = function () {
            var result = "",
                possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
            for (var i = 0; i < 5; i++) {
                result += possible.charAt(Math.floor(Math.random() * possible.length));
            }
            return result;
        };

        var srcId = this.$tabs.attr('id'),
            accordionId = (srcId ? srcId : randomString()) + '-accordion';

        this.$accordion = $('<div class="panel-group ' + this.options.accordionClass + '" id="' + accordionId + '"></div>');
        this.$tabs.after(this.$accordion);
        this.$tabs.addClass(this.options.tabsClass);
        this.getTabContentElement().addClass(this.options.tabsClass);
    };

    TabCollapse.prototype._createAccordionGroup = function (parentId, $heading) {
        var tabSelector = $heading.attr('data-target'),
            active = $heading.data('bs.tabcollapse.parentLi').is('.active');
        //also wnat to write code that gets the class for the <a element.
        var originalClass = $heading.attr('class');
        if (!tabSelector) {
            tabSelector = $heading.attr('href');
            tabSelector = tabSelector && tabSelector.replace(/.*(?=#[^\s]*$)/, ''); //strip for ie7
        }
 
        var $tabPane = $(tabSelector),
            groupId = $tabPane.attr('id') + '-collapse',
            $panel = $(this.options.accordionTemplate($heading, groupId, parentId, active, originalClass));
        $panel.find('.panel-heading > .panel-title').append(this._tabHeadingToPanelHeading($heading, groupId, parentId, active));
        $panel.find('.panel-body').append($tabPane.contents().detach())
            .data('bs.tabcollapse.tabpane', $tabPane);

        return $panel;
    };



    // TABCOLLAPSE PLUGIN DEFINITION
    // =======================

    $.fn.tabCollapse = function (option) {
        return this.each(function () {
            var $this = $(this);
            var data = $this.data('bs.tabcollapse');
            var options = $.extend({}, TabCollapse.DEFAULTS, $this.data(), typeof option === 'object' && option);

            if (!data) $this.data('bs.tabcollapse', new TabCollapse(this, options));
        });
    };

    $.fn.tabCollapse.Constructor = TabCollapse;


}(window.jQuery);;
//window.onerror = function (errorText, url, lineNumber, columnNo, error) {
//    var report = {
//        errorText: errorText,
//        url: url,
//        lineNumber: lineNumber
//    };

//    $.ajax({
//        type: "POST",
//        url: "/error/RecordJavascriptError",
//        dataType: 'json',
//        data: report,
//        cache: false
//    });

//    //console.error(error)
//    //return true;
//};;
//https://github.com/jmosbech/StickyTableHeaders
!function (a, b) { "use strict"; function c(c, g) { var h = this; h.$el = a(c), h.el = c, h.id = e++, h.$el.bind("destroyed", a.proxy(h.teardown, h)), h.$clonedHeader = null, h.$originalHeader = null, h.cachedHeaderHeight = null, h.isSticky = !1, h.hasBeenSticky = !1, h.leftOffset = null, h.topOffset = null, h.init = function () { h.setOptions(g), h.$el.each(function () { var b = a(this); b.css("padding", 0), h.$originalHeader = a("thead:first", this), h.$clonedHeader = h.$originalHeader.clone(), b.trigger("clonedHeader." + d, [h.$clonedHeader]), h.$clonedHeader.addClass("tableFloatingHeader"), h.$clonedHeader.css({ display: "none", opacity: 0 }), h.$originalHeader.addClass("tableFloatingHeaderOriginal"), h.$originalHeader.after(h.$clonedHeader), h.$printStyle = a('<style type="text/css" media="print">.tableFloatingHeader{display:none !important;}.tableFloatingHeaderOriginal{position:static !important;}</style>'), h.$head.append(h.$printStyle) }), h.updateWidth(), h.toggleHeaders(), h.bind() }, h.destroy = function () { h.$el.unbind("destroyed", h.teardown), h.teardown() }, h.teardown = function () { h.isSticky && h.$originalHeader.css("position", "static"), a.removeData(h.el, "plugin_" + d), h.unbind(), h.$clonedHeader.remove(), h.$originalHeader.removeClass("tableFloatingHeaderOriginal"), h.$originalHeader.css("visibility", "visible"), h.$printStyle.remove(), h.el = null, h.$el = null }, h.bind = function () { h.$scrollableArea.on("scroll." + d, h.toggleHeaders), h.isWindowScrolling || (h.$window.on("scroll." + d + h.id, h.setPositionValues), h.$window.on("resize." + d + h.id, h.toggleHeaders)), h.$scrollableArea.on("resize." + d, h.toggleHeaders), h.$scrollableArea.on("resize." + d, h.updateWidth) }, h.unbind = function () { h.$scrollableArea.off("." + d, h.toggleHeaders), h.isWindowScrolling || (h.$window.off("." + d + h.id, h.setPositionValues), h.$window.off("." + d + h.id, h.toggleHeaders)), h.$scrollableArea.off("." + d, h.updateWidth) }, h.debounce = function (a, b) { var c = null; return function () { var d = this, e = arguments; clearTimeout(c), c = setTimeout(function () { a.apply(d, e) }, b) } }, h.toggleHeaders = h.debounce(function () { h.$el && h.$el.each(function () { var b, c = a(this), e = h.isWindowScrolling ? isNaN(h.options.fixedOffset) ? h.options.fixedOffset.outerHeight() : h.options.fixedOffset : h.$scrollableArea.offset().top + (isNaN(h.options.fixedOffset) ? 0 : h.options.fixedOffset), f = c.offset(), g = h.$scrollableArea.scrollTop() + e, i = h.$scrollableArea.scrollLeft(), j = h.options.cacheHeaderHeight ? h.cachedHeaderHeight : h.$clonedHeader.height(), k = h.isWindowScrolling ? g > f.top : e > f.top, l = (h.isWindowScrolling ? g : 0) < f.top + c.height() - j - (h.isWindowScrolling ? 0 : e); k && l ? (b = f.left - i + h.options.leftOffset, h.$originalHeader.css({ position: "fixed", "margin-top": h.options.marginTop, left: b, "z-index": 3 }), h.leftOffset = b, h.topOffset = e, h.$clonedHeader.css("display", ""), h.isSticky || (h.isSticky = !0, h.updateWidth(), c.trigger("enabledStickiness." + d)), h.setPositionValues()) : h.isSticky && (h.$originalHeader.css("position", "static"), h.$clonedHeader.css("display", "none"), h.isSticky = !1, h.resetWidth(a("td,th", h.$clonedHeader), a("td,th", h.$originalHeader)), c.trigger("disabledStickiness." + d)) }) }, 0), h.setPositionValues = h.debounce(function () { var a = h.$window.scrollTop(), b = h.$window.scrollLeft(); !h.isSticky || 0 > a || a + h.$window.height() > h.$document.height() || 0 > b || b + h.$window.width() > h.$document.width() || h.$originalHeader.css({ top: h.topOffset - (h.isWindowScrolling ? 0 : a), left: h.leftOffset - (h.isWindowScrolling ? 0 : b) }) }, 0), h.updateWidth = h.debounce(function () { if (h.isSticky) { h.$originalHeaderCells || (h.$originalHeaderCells = a("th,td", h.$originalHeader)), h.$clonedHeaderCells || (h.$clonedHeaderCells = a("th,td", h.$clonedHeader)); var b = h.getWidth(h.$clonedHeaderCells); h.setWidth(b, h.$clonedHeaderCells, h.$originalHeaderCells), h.$originalHeader.css("width", h.$clonedHeader.width()), h.options.cacheHeaderHeight && (h.cachedHeaderHeight = h.$clonedHeader.height()) } }, 0), h.getWidth = function (c) { var d = []; return c.each(function (c) { var e, f = a(this); if ("border-box" === f.css("box-sizing")) { var g = f[0].getBoundingClientRect(); e = g.width ? g.width : g.right - g.left } else { var i = a("th", h.$originalHeader); if ("collapse" === i.css("border-collapse")) if (b.getComputedStyle) e = parseFloat(b.getComputedStyle(this, null).width); else { var j = parseFloat(f.css("padding-left")), k = parseFloat(f.css("padding-right")), l = parseFloat(f.css("border-width")); e = f.outerWidth() - j - k - l } else e = f.width() } d[c] = e }), d }, h.setWidth = function (a, b, c) { b.each(function (b) { var d = a[b]; c.eq(b).css({ "min-width": d, "max-width": d }) }) }, h.resetWidth = function (b, c) { b.each(function (b) { var d = a(this); c.eq(b).css({ "min-width": d.css("min-width"), "max-width": d.css("max-width") }) }) }, h.setOptions = function (b) { h.options = a.extend({}, f, b), h.$window = a(h.options.objWindow), h.$head = a(h.options.objHead), h.$document = a(h.options.objDocument), h.$scrollableArea = a(h.options.scrollableArea), h.isWindowScrolling = h.$scrollableArea[0] === h.$window[0] }, h.updateOptions = function (a) { h.setOptions(a), h.unbind(), h.bind(), h.updateWidth(), h.toggleHeaders() }, h.init() } var d = "stickyTableHeaders", e = 0, f = { fixedOffset: 0, leftOffset: 0, marginTop: 0, objDocument: document, objHead: "head", objWindow: b, scrollableArea: b, cacheHeaderHeight: !1 }; a.fn[d] = function (b) { return this.each(function () { var e = a.data(this, "plugin_" + d); e ? "string" == typeof b ? e[b].apply(e) : e.updateOptions(b) : "destroy" !== b && a.data(this, "plugin_" + d, new c(this, b)) }) } }(jQuery, window);;
// * Stopwatch class {{{
Stopwatch = function(listener, resolution) {
    this.startTime = 0;
    this.stopTime = 0;
    this.totalElapsed = 0; // * elapsed number of ms in total
    this.started = false;
    this.listener = (listener != undefined ? listener : null); // * function to receive onTick events
    this.tickResolution = (resolution != undefined ? resolution : 500); // * how long between each tick in milliseconds
    this.tickInterval = null;

    // * pretty static vars
    this.onehour = 1000 * 60 * 60;
    this.onemin = 1000 * 60;
    this.onesec = 1000;
};
Stopwatch.prototype.start = function(startTime) {
    var delegate = function(that, method) { return function() { return method.call(that); }; };
    if (!this.started) {
        this.startTime = new Date().getTime();
        this.stopTime = 0;
        this.started = true;
        this.tickInterval = setInterval(delegate(this, this.onTick), this.tickResolution);
    }
};
Stopwatch.prototype.stop = function() {
    if (this.started) {
        this.stopTime = new Date().getTime();
        this.started = false;
        var elapsed = this.stopTime - this.startTime;
        this.totalElapsed += elapsed;
        if (this.tickInterval != null)
            clearInterval(this.tickInterval);
    }
    return this.getElapsed();
};
Stopwatch.prototype.reset = function() {
    this.totalElapsed = 0;
    // * if watch is running, reset it to current time
    this.startTime = new Date().getTime();
    this.stopTime = this.startTime;
};
Stopwatch.prototype.restart = function() {
    this.stop();
    this.reset();
    this.start();
};
Stopwatch.prototype.getElapsed = function() {
    // * if watch is stopped, use that date, else use now
    var elapsed = 0;
    if (this.started)
        elapsed = new Date().getTime() - this.startTime;

    // totalElapsed are millies, should be fixed to 0
    elapsed += parseFloat(this.totalElapsed.toFixed(0));

    var hours = parseInt(elapsed / this.onehour);
    elapsed %= this.onehour;
    var mins = parseInt(elapsed / this.onemin);
    elapsed %= this.onemin;
    var secs = parseInt(elapsed / this.onesec);
    var ms = elapsed % this.onesec;

    return {
        hours: hours,
        minutes: mins,
        seconds: secs,
        milliseconds: ms
    };
};
Stopwatch.prototype.setElapsed = function(hours, mins, secs) {
    this.reset();
    this.totalElapsed = 0;
    this.totalElapsed += hours * this.onehour;
    this.totalElapsed += mins * this.onemin;
    this.totalElapsed += secs * this.onesec;
    this.totalElapsed = Math.max(this.totalElapsed, 0); // * No negative numbers
};
Stopwatch.prototype.toString = function() {
    var zpad = function(no, digits) {
        no = no.toString();
        while (no.length < digits)
            no = '0' + no;
        return no;
    };
    var e = this.getElapsed();
    return zpad(e.hours, 2) + ":" + zpad(e.minutes, 2) + ":" + zpad(e.seconds, 2);
};
Stopwatch.prototype.setListener = function(listener) {
    this.listener = listener;
}; // * triggered every <resolution> ms
Stopwatch.prototype.onTick = function() {
    if (this.listener != null) {
        this.listener(this);
    }
}; // }}};
function CascadeAccountAndProjectComboBoxes(accountComboBoxId, projectComboBoxId) {

    var isProjectsDataBound = false;
    var isAccountsDataBound = false;
    var ignoreCascade = false;
    var cascadedProjectComboBox = null;
    var cascadeAccountComboBox = null;

    function cascadeAccountComboBoxCascade(sender) {
        if (ignoreCascade) return;

  
        ignoreCascade = true;

        var accountGuid = this.value();

        var hiddenAccountGuidInputForFilter = $("#" + projectComboBoxId + "_AccountGuid");
        if (hiddenAccountGuidInputForFilter.length > 0) {
            //set the hidden input that is used when we create a new project from the drop down list to auto-select the account.
            hiddenAccountGuidInputForFilter.val(accountGuid);
        }


        if (isProjectsDataBound) {

            var projectsDataSource = cascadedProjectComboBox.dataSource;
            var project = cascadedProjectComboBox.dataItem();//(projectGuid);

            //reset the project value if there is something else selected and the selected one does not have the same accountId as selected
            if (project != null && project.AccountGuid != null && project.AccountGuid != accountGuid && accountGuid != "") {
                cascadedProjectComboBox.value(null);
            }
            projectsDataSource.read();
            //if (accountGuid == "" || accountGuid == null) {
            //    //no account selected.  reset projects drop down filter.
            //    projectsDataSource.filter([]);
            //    //cascadedProjectComboBox.value("");
            //}
            //else {                        
            //        isProjectDataSourceChangedFromFilter = true;
            //        projectsDataSource.filter({

            //            "logic": "or",
            //            "filters": [
            //                { field: "AccountGuid", operator: "eq", value: accountGuid },
            //                { field: "Guid", operator: "eq", value: jQuery.Guid.Empty() }
            //            ]
            //        });                
            //}

        }

        ignoreCascade = false;
    }

    function cascadeComboBoxToAccount(sender) {

        if (ignoreCascade) return;
        ignoreCascade = true;
        var projectItem = this.dataItem();
        if (projectItem != undefined && projectItem.Guid != jQuery.Guid.Empty()) {//project selected
            if (projectItem.AccountGuid != jQuery.Guid.Empty()) { //not the new project button
                if (cascadeAccountComboBox.value() != projectItem.AccountGuid) {
                    cascadeAccountComboBox.value(projectItem.AccountGuid); //select the project's account.
                }
            }
            else {
                if (cascadeAccountComboBox.value() != null && cascadeAccountComboBox.value() != "") {
                    cascadeAccountComboBox.value(null);  //no project selected, reset account selection.
                }
            }
        }
        ignoreCascade = false;
    }

    function projectsDataBound() {
        isProjectsDataBound = true;
        if (isProjectsDataBound && isAccountsDataBound)
        {
            init();
        }                   
    }

    var isInit = false;
    function init()
    {
        if (isInit) return;
        isInit = true;
        if (cascadeAccountComboBox.value() != "" && cascadedProjectComboBox.value() != "")
        {
            //cascadeAccountComboBox.trigger("change");
            return;
        }
        else if (cascadeAccountComboBox.value() != "") {
            cascadeAccountComboBox.trigger("change");
        }
        else if (cascadedProjectComboBox.value() != "") {
            cascadedProjectComboBox.trigger("change");
        }
    }

    function accountsDataBound() {
        isAccountsDataBound = true;
        if (isProjectsDataBound && isAccountsDataBound) {
            init();
        }
    }

    var isProjectDataSourceChangedFromFilter = false;
    function cascadedProjectComboBoxDataSourceChanged() {
        //auto select the first project if there is only 1 and it wasn't changed from the filter
        if (ignoreCascade) return;        
        ignoreCascade = true;
        if (cascadedProjectComboBox.dataSource.view().length == 2 && cascadedProjectComboBox.select() != 2) {
            if (cascadedProjectComboBox.dataSource.view()[1].AccountGuid == cascadeAccountComboBox.value()) {
                cascadedProjectComboBox.select(2);
                cascadedProjectComboBox.trigger("change");
            }
        }
        ignoreCascade = false;
    }

    function setAccountAndProjectComboBoxes(isBind, cascadeAccountComboBoxId, projectComboBoxId) {
        cascadeAccountComboBox = $("#" + cascadeAccountComboBoxId).data("kendoDropDownList");
        cascadedProjectComboBox = $("#" + projectComboBoxId).data("kendoDropDownList");

        if (cascadeAccountComboBox == null || cascadedProjectComboBox == null) return;

        cascadeAccountComboBox.bind("dataBound", accountsDataBound);
        cascadeAccountComboBox.bind("change", cascadeAccountComboBoxCascade);

        cascadedProjectComboBox.bind("dataBound", projectsDataBound);
        cascadedProjectComboBox.bind("change", cascadeComboBoxToAccount);

        cascadedProjectComboBox.dataSource.bind("change", cascadedProjectComboBoxDataSourceChanged);
    }

    $(function () {
        setAccountAndProjectComboBoxes(true, accountComboBoxId, projectComboBoxId);

    });
};
/* ===========================================================
 * bootstrap-fileupload.js j2
 * http://jasny.github.com/bootstrap/javascript.html#fileupload
 * ===========================================================
 * Copyright 2012 Jasny BV, Netherlands.
 *
 * Licensed under the Apache License, Version 2.0 (the "License")
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ========================================================== */

!function($) {

    "use strict"; // jshint ;_

    /* FILEUPLOAD PUBLIC CLASS DEFINITION
  * ================================= */

    var Fileupload = function(element, options) {
        this.$element = $(element);
        this.type = this.$element.data('uploadtype') || (this.$element.find('.thumbnail').length > 0 ? "image" : "file");
        this.$input = this.$element.find(':file');
        if (this.$input.length === 0) return;
        this.name = this.$input.attr('name') || options.name;
        this.$hidden = this.$element.find('input[type=hidden][name="' + this.name + '"]');
        if (this.$hidden.length === 0) {
            this.$hidden = $('<input type="hidden" />');
            this.$element.prepend(this.$hidden);
        }

        this.$preview = this.$element.find('.fileupload-preview');
        var height = this.$preview.css('height');
        if (this.$preview.css('display') != 'inline' && height != '0px' && height != 'none') this.$preview.css('line-height', height);
        this.original = {
            'exists': this.$element.hasClass('fileupload-exists'),
            'preview': this.$preview.html(),
            'hiddenVal': this.$hidden.val()
        };
        this.$remove = this.$element.find('[data-dismiss="fileupload"]');
        this.$element.find('[data-trigger="fileupload"]').on('click.fileupload', $.proxy(this.trigger, this));
        this.listen();
    };
    Fileupload.prototype = {
        listen: function() {
            this.$input.on('change.fileupload', $.proxy(this.change, this));
            $(this.$input[0].form).on('reset.fileupload', $.proxy(this.reset, this));
            if (this.$remove) this.$remove.on('click.fileupload', $.proxy(this.clear, this));
        },

        change: function(e, invoked) {
            var file = e.target.files !== undefined ? e.target.files[0] : (e.target.value ? { name: e.target.value.replace(/^.+\\/, '') } : null);
            if (invoked === 'clear') return;
            if (!file) {
                this.clear();
                return;
            }

            this.$hidden.val('');
            this.$hidden.attr('name', '');
            this.$input.attr('name', this.name);
            if (this.type === "image" && this.$preview.length > 0 && (typeof file.type !== "undefined" ? file.type.match('image.*') : file.name.match('\\.(gif|png|jpe?g)$')) && typeof FileReader !== "undefined") {
                var reader = new FileReader();
                var preview = this.$preview;
                var element = this.$element;
                reader.onload = function(e) {
                    preview.html('<img src="' + e.target.result + '" ' + (preview.css('max-height') != 'none' ? 'style="max-height: ' + preview.css('max-height') + ';"' : '') + ' />');
                    element.addClass('fileupload-exists').removeClass('fileupload-new');
                };
                reader.readAsDataURL(file);
            } else {
                this.$preview.text(file.name);
                this.$element.addClass('fileupload-exists').removeClass('fileupload-new');
            }
        },

        clear: function(e) {
            this.$hidden.val('');
            this.$hidden.attr('name', this.name);
            this.$input.attr('name', ''); //ie8+ doesn't support changing the value of input with type=file so clone instead
            if (false) { //if($.browser.msie){
                var inputClone = this.$input.clone(true);
                this.$input.after(inputClone);
                this.$input.remove();
                this.$input = inputClone;
            } else {
                this.$input.val('');
            }

            this.$preview.html('');
            this.$element.addClass('fileupload-new').removeClass('fileupload-exists');
            if (e) {
                this.$input.trigger('change', ['clear']);
                e.preventDefault();
            }
        },

        reset: function(e) {
            this.clear();
            this.$hidden.val(this.original.hiddenVal);
            this.$preview.html(this.original.preview);
            if (this.original.exists) this.$element.addClass('fileupload-exists').removeClass('fileupload-new');
            else this.$element.addClass('fileupload-new').removeClass('fileupload-exists');
        },

        trigger: function(e) {
            this.$input.trigger('click');
            e.preventDefault();
        }
    }; /* FILEUPLOAD PLUGIN DEFINITION
  * =========================== */

    $.fn.fileupload = function(options) {
        return this.each(function() {
            var $this = $(this), data = $this.data('fileupload');
            if (!data) $this.data('fileupload', (data = new Fileupload(this, options)));
            if (typeof options == 'string') data[options]();
        });
    };
    $.fn.fileupload.Constructor = Fileupload; /* FILEUPLOAD DATA-API
  * ================== */

    $(function() {
        $('body').on('click.fileupload.data-api', '[data-provides="fileupload"]', function(e) {
            var $this = $(this);
            if ($this.data('fileupload')) return;
            $this.fileupload($this.data());
            var $target = $(e.target).is('[data-dismiss=fileupload], [data-trigger=fileupload]') ?
                $(e.target) : $(e.target).parents('[data-dismiss=fileupload], [data-trigger=fileupload]').first();
            if ($target.length > 0) {
                $target.trigger('click.fileupload');
                e.preventDefault();
            }
        });
    });
}(window.jQuery);;
/*!
 * bootstrap-fileinput v4.3.5
 * http://plugins.krajee.com/file-input
 *
 * Author: Kartik Visweswaran
 * Copyright: 2014 - 2016, Kartik Visweswaran, Krajee.com
 *
 * Licensed under the BSD 3-Clause
 * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md
 */!function(a){"use strict";"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof module&&module.exports?module.exports=a(require("jquery")):a(window.jQuery)}(function(a){"use strict";a.fn.fileinputLocales={},a.fn.fileinputThemes={};var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,$,_,aa,ba,ca,da,ea,fa,ga,ha,ia,ja,ka,la,ma,na,oa;b=".fileinput",c="kvFileinputModal",d='style="width:{width};height:{height};"',e='<param name="controller" value="true" />\n<param name="allowFullScreen" value="true" />\n<param name="allowScriptAccess" value="always" />\n<param name="autoPlay" value="false" />\n<param name="autoStart" value="false" />\n<param name="quality" value="high" />\n',f='<div class="file-preview-other">\n<span class="{previewFileIconClass}">{previewFileIcon}</span>\n</div>',g=window.URL||window.webkitURL,h=function(a,b,c){return void 0!==a&&(c?a===b:a.match(b))},i=function(a){if("Microsoft Internet Explorer"!==navigator.appName)return!1;if(10===a)return new RegExp("msie\\s"+a,"i").test(navigator.userAgent);var c,b=document.createElement("div");return b.innerHTML="<!--[if IE "+a+"]> <i></i> <![endif]-->",c=b.getElementsByTagName("i").length,document.body.appendChild(b),b.parentNode.removeChild(b),c},j=function(a,c,d,e){var f=e?c:c.split(" ").join(b+" ")+b;a.off(f).on(f,d)},k={data:{},init:function(a){var b=a.initialPreview,c=a.id;b.length>0&&!ea(b)&&(b=b.split(a.initialPreviewDelimiter)),k.data[c]={content:b,config:a.initialPreviewConfig,tags:a.initialPreviewThumbTags,delimiter:a.initialPreviewDelimiter,previewFileType:a.initialPreviewFileType,previewAsData:a.initialPreviewAsData,template:a.previewGenericTemplate,showZoom:a.fileActionSettings.showZoom,showDrag:a.fileActionSettings.showDrag,getSize:function(b){return a._getSize(b)},parseTemplate:function(b,c,d,e,f,g,h){var i=" file-preview-initial";return a._generatePreviewTemplate(b,c,d,e,f,!1,null,i,g,h)},msg:function(b){return a._getMsgSelected(b)},initId:a.previewInitId,footer:a._getLayoutTemplate("footer").replace(/\{progress}/g,a._renderThumbProgress()),isDelete:a.initialPreviewShowDelete,caption:a.initialCaption,actions:function(b,c,d,e,f,g,h){return a._renderFileActions(b,c,d,e,f,g,h,!0)}}},fetch:function(a){return k.data[a].content.filter(function(a){return null!==a})},count:function(a,b){return k.data[a]&&k.data[a].content?b?k.data[a].content.length:k.fetch(a).length:0},get:function(b,c,d){var j,l,n,o,p,q,e="init_"+c,f=k.data[b],g=f.config[c],h=f.content[c],i=f.initId+"-"+e,m=" file-preview-initial",r=fa("previewAsData",g,f.previewAsData);return d=void 0===d||d,h?(g&&g.frameClass&&(m+=" "+g.frameClass),r?(n=f.previewAsData?fa("type",g,f.previewFileType||"generic"):"generic",o=fa("caption",g),p=k.footer(b,c,d,g&&g.size||null),q=fa("filetype",g,n),j=f.parseTemplate(n,h,o,q,i,p,e,null)):j=f.template.replace(/\{previewId}/g,i).replace(/\{frameClass}/g,m).replace(/\{fileindex}/g,e).replace(/\{content}/g,f.content[c]).replace(/\{template}/g,fa("type",g,f.previewFileType)).replace(/\{footer}/g,k.footer(b,c,d,g&&g.size||null)),f.tags.length&&f.tags[c]&&(j=ia(j,f.tags[c])),da(g)||da(g.frameAttr)||(l=a(document.createElement("div")).html(j),l.find(".file-preview-initial").attr(g.frameAttr),j=l.html(),l.remove()),j):""},add:function(b,c,d,e,f){var h,g=a.extend(!0,{},k.data[b]);return ea(c)||(c=c.split(g.delimiter)),f?(h=g.content.push(c)-1,g.config[h]=d,g.tags[h]=e):(h=c.length-1,g.content=c,g.config=d,g.tags=e),k.data[b]=g,h},set:function(b,c,d,e,f){var h,i,g=a.extend(!0,{},k.data[b]);if(c&&c.length&&(ea(c)||(c=c.split(g.delimiter)),i=c.filter(function(a){return null!==a}),i.length)){if(void 0===g.content&&(g.content=[]),void 0===g.config&&(g.config=[]),void 0===g.tags&&(g.tags=[]),f){for(h=0;h<c.length;h++)c[h]&&g.content.push(c[h]);for(h=0;h<d.length;h++)d[h]&&g.config.push(d[h]);for(h=0;h<e.length;h++)e[h]&&g.tags.push(e[h])}else g.content=c,g.config=d,g.tags=e;k.data[b]=g}},unset:function(a,b){var c=k.count(a);if(c){if(1===c)return k.data[a].content=[],k.data[a].config=[],void(k.data[a].tags=[]);k.data[a].content[b]=null,k.data[a].config[b]=null,k.data[a].tags[b]=null}},out:function(a){var d,b="",c=k.data[a],e=k.count(a,!0);if(0===e)return{content:"",caption:""};for(var f=0;f<e;f++)b+=k.get(a,f);return d=c.msg(k.count(a)),{content:'<div class="file-initial-thumbs">'+b+"</div>",caption:d}},footer:function(a,b,c,d){var e=k.data[a];if(c=void 0===c||c,0===e.config.length||da(e.config[b]))return"";var f=e.config[b],g=fa("caption",f),h=fa("width",f,"auto"),i=fa("url",f,!1),j=fa("key",f,null),l=fa("showDelete",f,!0),m=fa("showZoom",f,e.showZoom),n=fa("showDrag",f,e.showDrag),o=i===!1&&c,p=e.isDelete?e.actions(!1,l,m,n,o,i,j):"",q=e.footer.replace(/\{actions}/g,p);return q.replace(/\{caption}/g,g).replace(/\{size}/g,e.getSize(d)).replace(/\{width}/g,h).replace(/\{indicator}/g,"").replace(/\{indicatorTitle}/g,"")}},l=function(a,b){return b=b||0,"number"==typeof a?a:("string"==typeof a&&(a=parseFloat(a)),isNaN(a)?b:a)},m=function(){return!(!window.File||!window.FileReader)},n=function(){var a=document.createElement("div");return!i(9)&&(void 0!==a.draggable||void 0!==a.ondragstart&&void 0!==a.ondrop)},o=function(){return m()&&window.FormData},p=function(a,b){a.removeClass(b).addClass(b)},X={showRemove:!0,showUpload:!0,showZoom:!0,showDrag:!0,removeIcon:'<i class="glyphicon glyphicon-trash text-danger"></i>',removeClass:"btn btn-xs btn-default",removeTitle:"Remove file",uploadIcon:'<i class="glyphicon glyphicon-upload text-info"></i>',uploadClass:"btn btn-xs btn-default",uploadTitle:"Upload file",zoomIcon:'<i class="glyphicon glyphicon-zoom-in"></i>',zoomClass:"btn btn-xs btn-default",zoomTitle:"View Details",dragIcon:'<i class="glyphicon glyphicon-menu-hamburger"></i>',dragClass:"text-info",dragTitle:"Move / Rearrange",dragSettings:{},indicatorNew:'<i class="glyphicon glyphicon-hand-down text-warning"></i>',indicatorSuccess:'<i class="glyphicon glyphicon-ok-sign text-success"></i>',indicatorError:'<i class="glyphicon glyphicon-exclamation-sign text-danger"></i>',indicatorLoading:'<i class="glyphicon glyphicon-hand-up text-muted"></i>',indicatorNewTitle:"Not uploaded yet",indicatorSuccessTitle:"Uploaded",indicatorErrorTitle:"Upload Error",indicatorLoadingTitle:"Uploading ..."},q='{preview}\n<div class="kv-upload-progress hide"></div>\n<div class="input-group {class}">\n   {caption}\n   <div class="input-group-btn">\n       {remove}\n       {cancel}\n       {upload}\n       {browse}\n   </div>\n</div>',r='{preview}\n<div class="kv-upload-progress hide"></div>\n{remove}\n{cancel}\n{upload}\n{browse}\n',s='<div class="file-preview {class}">\n    {close}    <div class="{dropClass}">\n    <div class="file-preview-thumbnails">\n    </div>\n    <div class="clearfix"></div>    <div class="file-preview-status text-center text-success"></div>\n    <div class="kv-fileinput-error"></div>\n    </div>\n</div>',u='<div class="close fileinput-remove">&times;</div>\n',t='<i class="glyphicon glyphicon-file kv-caption-icon"></i>',v='<div tabindex="500" class="form-control file-caption {class}">\n   <div class="file-caption-name"></div>\n</div>\n',w='<button type="{type}" tabindex="500" title="{title}" class="{css}" {status}>{icon} {label}</button>',x='<a href="{href}" tabindex="500" title="{title}" class="{css}" {status}>{icon} {label}</a>',y='<div tabindex="500" class="{css}" {status}>{icon} {label}</div>',z='<div id="'+c+'" class="file-zoom-dialog modal fade" tabindex="-1" aria-labelledby="'+c+'Label"></div>',A='<div class="modal-dialog modal-lg" role="document">\n  <div class="modal-content">\n    <div class="modal-header">\n      <div class="kv-zoom-actions pull-right">{toggleheader}{fullscreen}{borderless}{close}</div>\n      <h3 class="modal-title">{heading} <small><span class="kv-zoom-title"></span></small></h3>\n    </div>\n    <div class="modal-body">\n      <div class="floating-buttons"></div>\n      <div class="kv-zoom-body file-zoom-content"></div>\n{prev} {next}\n    </div>\n  </div>\n</div>\n',B='<div class="progress">\n    <div class="{class}" role="progressbar" aria-valuenow="{percent}" aria-valuemin="0" aria-valuemax="100" style="width:{percent}%;">\n        {percent}%\n     </div>\n</div>',C=" <br><samp>({sizeText})</samp>",D='<div class="file-thumbnail-footer">\n    <div class="file-footer-caption" title="{caption}">{caption}{size}</div>\n    {progress} {actions}\n</div>',E='<div class="file-actions">\n    <div class="file-footer-buttons">\n        {upload} {delete} {zoom} {other}    </div>\n    {drag}\n    <div class="file-upload-indicator" title="{indicatorTitle}">{indicator}</div>\n    <div class="clearfix"></div>\n</div>',F='<button type="button" class="kv-file-remove {removeClass}" title="{removeTitle}" {dataUrl}{dataKey}>{removeIcon}</button>\n',G='<button type="button" class="kv-file-upload {uploadClass}" title="{uploadTitle}">{uploadIcon}</button>',H='<button type="button" class="kv-file-zoom {zoomClass}" title="{zoomTitle}">{zoomIcon}</button>',I='<span class="file-drag-handle {dragClass}" title="{dragTitle}">{dragIcon}</span>',J='<div class="file-preview-frame{frameClass}" id="{previewId}" data-fileindex="{fileindex}" data-template="{template}"',K=J+'><div class="kv-file-content">\n',L=J+' title="{caption}" '+d+'><div class="kv-file-content">\n',M="</div>{footer}\n</div>\n",N="{content}\n",O='<div class="kv-preview-data file-preview-html" title="{caption}" '+d+">{data}</div>\n",P='<img src="{data}" class="kv-preview-data file-preview-image" title="{caption}" alt="{caption}" '+d+">\n",Q='<textarea class="kv-preview-data file-preview-text" title="{caption}" readonly '+d+">{data}</textarea>\n",R='<video class="kv-preview-data" width="{width}" height="{height}" controls>\n<source src="{data}" type="{type}">\n'+f+"\n</video>\n",S='<audio class="kv-preview-data" controls>\n<source src="{data}" type="{type}">\n'+f+"\n</audio>\n",T='<object class="kv-preview-data file-object" type="application/x-shockwave-flash" width="{width}" height="{height}" data="{data}">\n'+e+" "+f+"\n</object>\n",U='<object class="kv-preview-data file-object" data="{data}" type="{type}" width="{width}" height="{height}">\n<param name="movie" value="{caption}" />\n'+e+" "+f+"\n</object>\n",V='<embed class="kv-preview-data" src="{data}" width="{width}" height="{height}" type="application/pdf">\n',W='<div class="kv-preview-data file-preview-other-frame">\n'+f+"\n</div>\n",Y={main1:q,main2:r,preview:s,close:u,fileIcon:t,caption:v,modalMain:z,modal:A,progress:B,size:C,footer:D,actions:E,actionDelete:F,actionUpload:G,actionZoom:H,actionDrag:I,btnDefault:w,btnLink:x,btnBrowse:y},Z={generic:K+N+M,html:K+O+M,image:K+P+M,text:K+Q+M,video:L+R+M,audio:L+S+M,flash:L+T+M,object:L+U+M,pdf:L+V+M,other:L+W+M},_=["image","html","text","video","audio","flash","pdf","object"],ba={image:{width:"auto",height:"160px"},html:{width:"213px",height:"160px"},text:{width:"213px",height:"160px"},video:{width:"213px",height:"160px"},audio:{width:"213px",height:"80px"},flash:{width:"213px",height:"160px"},object:{width:"160px",height:"160px"},pdf:{width:"160px",height:"160px"},other:{width:"160px",height:"160px"}},$={image:{width:"100%",height:"100%"},html:{width:"100%",height:"100%","min-height":"480px"},text:{width:"100%",height:"100%","min-height":"480px"},video:{width:"auto",height:"100%","max-width":"100%"},audio:{width:"100%",height:"30px"},flash:{width:"auto",height:"480px"},object:{width:"auto",height:"100%","min-height":"480px"},pdf:{width:"100%",height:"100%","min-height":"480px"},other:{width:"auto",height:"100%","min-height":"480px"}},ca={image:function(a,b){return h(a,"image.*")||h(b,/\.(gif|png|jpe?g)$/i)},html:function(a,b){return h(a,"text/html")||h(b,/\.(htm|html)$/i)},text:function(a,b){return h(a,"text.*")||h(b,/\.(xml|javascript)$/i)||h(b,/\.(txt|md|csv|nfo|ini|json|php|js|css)$/i)},video:function(a,b){return h(a,"video.*")&&(h(a,/(ogg|mp4|mp?g|webm|3gp)$/i)||h(b,/\.(og?|mp4|webm|mp?g|3gp)$/i))},audio:function(a,b){return h(a,"audio.*")&&(h(b,/(ogg|mp3|mp?g|wav)$/i)||h(b,/\.(og?|mp3|mp?g|wav)$/i))},flash:function(a,b){return h(a,"application/x-shockwave-flash",!0)||h(b,/\.(swf)$/i)},pdf:function(a,b){return h(a,"application/pdf",!0)||h(b,/\.(pdf)$/i)},object:function(){return!0},other:function(){return!0}},da=function(b,c){return void 0===b||null===b||0===b.length||c&&""===a.trim(b)},ea=function(a){return Array.isArray(a)||"[object Array]"===Object.prototype.toString.call(a)},fa=function(a,b,c){return c=c||"",b&&"object"==typeof b&&a in b?b[a]:c},aa=function(b,c,d){return da(b)||da(b[c])?d:a(b[c])},ga=function(){return Math.round((new Date).getTime()+100*Math.random())},ha=function(a){return a.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;")},ia=function(b,c){var d=b;return c?(a.each(c,function(a,b){"function"==typeof b&&(b=b()),d=d.split(a).join(b)}),d):d},ja=function(a){var b=a.is("img")?a.attr("src"):a.find("source").attr("src");g.revokeObjectURL(b)},ka=function(a){var b=a.lastIndexOf("/");return b===-1&&(b=a.lastIndexOf("\\")),a.split(a.substring(b,b+1)).pop()},la=function(){return document.fullscreenElement||document.mozFullScreenElement||document.webkitFullscreenElement||document.msFullscreenElement},ma=function(a){a&&!la()?document.documentElement.requestFullscreen?document.documentElement.requestFullscreen():document.documentElement.msRequestFullscreen?document.documentElement.msRequestFullscreen():document.documentElement.mozRequestFullScreen?document.documentElement.mozRequestFullScreen():document.documentElement.webkitRequestFullscreen&&document.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT):document.exitFullscreen?document.exitFullscreen():document.msExitFullscreen?document.msExitFullscreen():document.mozCancelFullScreen?document.mozCancelFullScreen():document.webkitExitFullscreen&&document.webkitExitFullscreen()},na=function(a,b,c){if(c>=a.length)for(var d=c-a.length;d--+1;)a.push(void 0);return a.splice(c,0,a.splice(b,1)[0]),a},oa=function(b,c){var d=this;d.$element=a(b),d._validate()&&(d.isPreviewable=m(),d.isIE9=i(9),d.isIE10=i(10),d.isPreviewable||d.isIE9?(d._init(c),d._listen()):d.$element.removeClass("file-loading"))},oa.prototype={constructor:oa,_init:function(b){var e,c=this,d=c.$element;a.each(b,function(a,b){switch(a){case"minFileCount":case"maxFileCount":case"maxFileSize":c[a]=l(b);break;default:c[a]=b}}),c.fileInputCleared=!1,c.fileBatchCompleted=!0,c.isPreviewable||(c.showPreview=!1),c.uploadFileAttr=da(d.attr("name"))?"file_data":d.attr("name"),c.reader=null,c.formdata={},c.clearStack(),c.uploadCount=0,c.uploadStatus={},c.uploadLog=[],c.uploadAsyncCount=0,c.loadedImages=[],c.totalImagesCount=0,c.ajaxRequests=[],c.isError=!1,c.ajaxAborted=!1,c.cancelling=!1,e=c._getLayoutTemplate("progress"),c.progressTemplate=e.replace("{class}",c.progressClass),c.progressCompleteTemplate=e.replace("{class}",c.progressCompleteClass),c.progressErrorTemplate=e.replace("{class}",c.progressErrorClass),c.dropZoneEnabled=n()&&c.dropZoneEnabled,c.isDisabled=c.$element.attr("disabled")||c.$element.attr("readonly"),c.isUploadable=o()&&!da(c.uploadUrl),c.isClickable=c.browseOnZoneClick&&c.showPreview&&(c.isUploadable&&c.dropZoneEnabled||!da(c.defaultPreviewContent)),c.slug="function"==typeof b.slugCallback?b.slugCallback:c._slugDefault,c.mainTemplate=c.showCaption?c._getLayoutTemplate("main1"):c._getLayoutTemplate("main2"),c.captionTemplate=c._getLayoutTemplate("caption"),c.previewGenericTemplate=c._getPreviewTemplate("generic"),c.resizeImage&&(c.maxImageWidth||c.maxImageHeight)&&(c.imageCanvas=document.createElement("canvas"),c.imageCanvasContext=c.imageCanvas.getContext("2d")),da(c.$element.attr("id"))&&c.$element.attr("id",ga()),void 0===c.$container?c.$container=c._createContainer():c._refreshContainer(),c.$dropZone=c.$container.find(".file-drop-zone"),c.$progress=c.$container.find(".kv-upload-progress"),c.$btnUpload=c.$container.find(".fileinput-upload"),c.$captionContainer=aa(b,"elCaptionContainer",c.$container.find(".file-caption")),c.$caption=aa(b,"elCaptionText",c.$container.find(".file-caption-name")),c.$previewContainer=aa(b,"elPreviewContainer",c.$container.find(".file-preview")),c.$preview=aa(b,"elPreviewImage",c.$container.find(".file-preview-thumbnails")),c.$previewStatus=aa(b,"elPreviewStatus",c.$container.find(".file-preview-status")),c.$errorContainer=aa(b,"elErrorContainer",c.$previewContainer.find(".kv-fileinput-error")),da(c.msgErrorClass)||p(c.$errorContainer,c.msgErrorClass),c.$errorContainer.hide(),c.fileActionSettings=a.extend(!0,X,b.fileActionSettings),c.previewInitId="preview-"+ga(),c.id=c.$element.attr("id"),k.init(c),c._initPreview(!0),c._initPreviewActions(),c.options=b,c._setFileDropZoneTitle(),c.$element.removeClass("file-loading"),c.$element.attr("disabled")&&c.disable(),c._initZoom()},_validate:function(){var b,a=this;return"file"===a.$element.attr("type")||(b='<div class="help-block alert alert-warning"><h4>Invalid Input Type</h4>You must set an input <code>type = file</code> for <b>bootstrap-fileinput</b> plugin to initialize.</div>',a.$element.after(b),!1)},_errorsExist:function(){var c,b=this;return!!b.$errorContainer.find("li").length||(c=a(document.createElement("div")).html(b.$errorContainer.html()),c.find("span.kv-error-close").remove(),c.find("ul").remove(),!!a.trim(c.text()).length)},_errorHandler:function(a,b){var c=this,d=a.target.error;d.code===d.NOT_FOUND_ERR?c._showError(c.msgFileNotFound.replace("{name}",b)):d.code===d.SECURITY_ERR?c._showError(c.msgFileSecured.replace("{name}",b)):d.code===d.NOT_READABLE_ERR?c._showError(c.msgFileNotReadable.replace("{name}",b)):d.code===d.ABORT_ERR?c._showError(c.msgFilePreviewAborted.replace("{name}",b)):c._showError(c.msgFilePreviewError.replace("{name}",b))},_addError:function(a){var b=this,c=b.$errorContainer;a&&c.length&&(c.html(b.errorCloseButton+a),j(c.find(".kv-error-close"),"click",function(){c.fadeOut("slow")}))},_resetErrors:function(a){var b=this,c=b.$errorContainer;b.isError=!1,b.$container.removeClass("has-error"),c.html(""),a?c.fadeOut("slow"):c.hide()},_showFolderError:function(a){var d,b=this,c=b.$errorContainer;a&&(d=b.msgFoldersNotAllowed.replace(/\{n}/g,a),b._addError(d),p(b.$container,"has-error"),c.fadeIn(800),b._raise("filefoldererror",[a,d]))},_showUploadError:function(a,b,c){var d=this,e=d.$errorContainer,f=c||"fileuploaderror",g=b&&b.id?'<li data-file-id="'+b.id+'">'+a+"</li>":"<li>"+a+"</li>";return 0===e.find("ul").length?d._addError("<ul>"+g+"</ul>"):e.find("ul").append(g),e.fadeIn(800),d._raise(f,[b,a]),d.$container.removeClass("file-input-new"),p(d.$container,"has-error"),!0},_showError:function(a,b,c){var d=this,e=d.$errorContainer,f=c||"fileerror";return b=b||{},b.reader=d.reader,d._addError(a),e.fadeIn(800),d._raise(f,[b,a]),d.isUploadable||d._clearFileInput(),d.$container.removeClass("file-input-new"),p(d.$container,"has-error"),d.$btnUpload.attr("disabled",!0),!0},_noFilesError:function(a){var b=this,c=b.minFileCount>1?b.filePlural:b.fileSingle,d=b.msgFilesTooLess.replace("{n}",b.minFileCount).replace("{files}",c),e=b.$errorContainer;b._addError(d),b.isError=!0,b._updateFileDetails(0),e.fadeIn(800),b._raise("fileerror",[a,d]),b._clearFileInput(),p(b.$container,"has-error")},_parseError:function(b,c,d){var e=this,f=a.trim(c+""),g="."===f.slice(-1)?"":".",h=void 0!==b.responseJSON&&void 0!==b.responseJSON.error?b.responseJSON.error:b.responseText;return e.cancelling&&e.msgUploadAborted&&(f=e.msgUploadAborted),e.showAjaxErrorDetails&&h?(h=a.trim(h.replace(/\n\s*\n/g,"\n")),h=h.length>0?"<pre>"+h+"</pre>":"",f+=g+h):f+=g,e.cancelling=!1,d?"<b>"+d+": </b>"+f:f},_parseFileType:function(a){var c,d,e,f,b=this;for(f=0;f<_.length;f+=1)if(e=_[f],c=fa(e,b.fileTypeSettings,ca[e]),d=c(a.type,a.name)?e:"",!da(d))return d;return"other"},_parseFilePreviewIcon:function(b,c){var e,f,d=this,g=d.previewFileIcon;return c&&c.indexOf(".")>-1&&(f=c.split(".").pop(),d.previewFileIconSettings&&d.previewFileIconSettings[f]&&(g=d.previewFileIconSettings[f]),d.previewFileExtSettings&&a.each(d.previewFileExtSettings,function(a,b){return d.previewFileIconSettings[a]&&b(f)?void(g=d.previewFileIconSettings[a]):void(e=!0)})),b.indexOf("{previewFileIcon}")>-1?b.replace(/\{previewFileIconClass}/g,d.previewFileIconClass).replace(/\{previewFileIcon}/g,g):b},_raise:function(b,c){var d=this,e=a.Event(b);if(void 0!==c?d.$element.trigger(e,c):d.$element.trigger(e),e.isDefaultPrevented())return!1;if(!e.result)return e.result;switch(b){case"filebatchuploadcomplete":case"filebatchuploadsuccess":case"fileuploaded":case"fileclear":case"filecleared":case"filereset":case"fileerror":case"filefoldererror":case"fileuploaderror":case"filebatchuploaderror":case"filedeleteerror":case"filecustomerror":case"filesuccessremove":break;default:d.ajaxAborted=e.result}return!0},_listenFullScreen:function(a){var d,e,b=this,c=b.$modal;c&&c.length&&(d=c&&c.find(".btn-fullscreen"),e=c&&c.find(".btn-borderless"),d.length&&e.length&&(d.removeClass("active").attr("aria-pressed","false"),e.removeClass("active").attr("aria-pressed","false"),a?d.addClass("active").attr("aria-pressed","true"):e.addClass("active").attr("aria-pressed","true"),c.hasClass("file-zoom-fullscreen")?b._maximizeZoomDialog():a?b._maximizeZoomDialog():e.removeClass("active").attr("aria-pressed","false")))},_listen:function(){var b=this,c=b.$element,d=c.closest("form"),e=b.$container;j(c,"change",a.proxy(b._change,b)),b.showBrowse&&j(b.$btnFile,"click",a.proxy(b._browse,b)),j(d,"reset",a.proxy(b.reset,b)),j(e.find(".fileinput-remove:not([disabled])"),"click",a.proxy(b.clear,b)),j(e.find(".fileinput-cancel"),"click",a.proxy(b.cancel,b)),b._initDragDrop(),b.isUploadable||j(d,"submit",a.proxy(b._submitForm,b)),j(b.$container.find(".fileinput-upload"),"click",a.proxy(b._uploadClick,b)),j(a(window),"resize",function(){b._listenFullScreen(screen.width===window.innerWidth&&screen.height===window.innerHeight)}),j(a(document),"webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange",function(){b._listenFullScreen(la())}),b._initClickable()},_initClickable:function(){var c,b=this;b.isClickable&&(c=b.isUploadable?b.$dropZone:b.$preview.find(".file-default-preview"),p(c,"clickable"),c.attr("tabindex",-1),j(c,"click",function(d){var e=a(d.target);e.parents(".file-preview-thumbnails").length&&!e.parents(".file-default-preview").length||(b.$element.trigger("click"),c.blur())}))},_initDragDrop:function(){var b=this,c=b.$dropZone;b.isUploadable&&b.dropZoneEnabled&&b.showPreview&&(j(c,"dragenter dragover",a.proxy(b._zoneDragEnter,b)),j(c,"dragleave",a.proxy(b._zoneDragLeave,b)),j(c,"drop",a.proxy(b._zoneDrop,b)),j(a(document),"dragenter dragover drop",b._zoneDragDropInit))},_zoneDragDropInit:function(a){a.stopPropagation(),a.preventDefault()},_zoneDragEnter:function(b){var c=this,d=a.inArray("Files",b.originalEvent.dataTransfer.types)>-1;return c._zoneDragDropInit(b),c.isDisabled||!d?(b.originalEvent.dataTransfer.effectAllowed="none",void(b.originalEvent.dataTransfer.dropEffect="none")):void p(c.$dropZone,"file-highlighted")},_zoneDragLeave:function(a){var b=this;b._zoneDragDropInit(a),b.isDisabled||b.$dropZone.removeClass("file-highlighted")},_zoneDrop:function(a){var b=this;a.preventDefault(),b.isDisabled||da(a.originalEvent.dataTransfer.files)||(b._change(a,"dragdrop"),b.$dropZone.removeClass("file-highlighted"))},_uploadClick:function(a){var d,b=this,c=b.$container.find(".fileinput-upload"),e=!c.hasClass("disabled")&&da(c.attr("disabled"));if(!a||!a.isDefaultPrevented()){if(!b.isUploadable)return void(e&&"submit"!==c.attr("type")&&(d=c.closest("form"),d.length&&d.trigger("submit"),a.preventDefault()));a.preventDefault(),e&&b.upload()}},_submitForm:function(){var a=this,b=a.$element,c=b.get(0).files;return c&&a.minFileCount>0&&a._getFileCount(c.length)<a.minFileCount?(a._noFilesError({}),!1):!a._abort({})},_clearPreview:function(){var a=this,b=a.showUploadedThumbs?a.$preview.find(".file-preview-frame:not(.file-preview-success)"):a.$preview.find(".file-preview-frame");b.remove(),a.$preview.find(".file-preview-frame").length&&a.showPreview||a._resetUpload(),a._validateDefaultPreview()},_initSortable:function(){var d,e,b=this,c=b.$preview;window.KvSortable&&(d=c.find(".file-initial-thumbs"),e={handle:".drag-handle-init",dataIdAttr:"data-preview-id",draggable:".file-preview-initial",onSort:function(c){var d=c.oldIndex,e=c.newIndex;b.initialPreview=na(b.initialPreview,d,e),b.initialPreviewConfig=na(b.initialPreviewConfig,d,e),k.init(b),b._raise("filesorted",{previewId:a(c.item).attr("id"),oldIndex:d,newIndex:e,stack:b.initialPreviewConfig})}},d.data("kvsortable")&&d.kvsortable("destroy"),a.extend(!0,e,b.fileActionSettings.dragSettings),d.kvsortable(e))},_initPreview:function(a){var d,b=this,c=b.initialCaption||"";return k.count(b.id)?(d=k.out(b.id),c=a&&b.initialCaption?b.initialCaption:d.caption,b.$preview.html(d.content),b._setCaption(c),b._initSortable(),void(da(d.content)||b.$container.removeClass("file-input-new"))):(b._clearPreview(),void(a?b._setCaption(c):b._initCaption()))},_getZoomButton:function(a){var b=this,c=b.previewZoomButtonIcons[a],d=b.previewZoomButtonClasses[a],e=' title="'+(b.previewZoomButtonTitles[a]||"")+'" ',f=e+("close"===a?' data-dismiss="modal" aria-hidden="true"':"");return"fullscreen"!==a&&"borderless"!==a&&"toggleheader"!==a||(f+=' data-toggle="button" aria-pressed="false" autocomplete="off"'),'<button type="button" class="'+d+" btn-"+a+'"'+f+">"+c+"</button>"},_getModalContent:function(){var a=this;return a._getLayoutTemplate("modal").replace(/\{heading}/g,a.msgZoomModalHeading).replace(/\{prev}/g,a._getZoomButton("prev")).replace(/\{next}/g,a._getZoomButton("next")).replace(/\{toggleheader}/g,a._getZoomButton("toggleheader")).replace(/\{fullscreen}/g,a._getZoomButton("fullscreen")).replace(/\{borderless}/g,a._getZoomButton("borderless")).replace(/\{close}/g,a._getZoomButton("close"))},_listenModalEvent:function(a){var b=this,c=b.$modal,d=function(a){return{sourceEvent:a,previewId:c.data("previewId"),modal:c}};c.on(a+".bs.modal",function(e){var f=c.find(".btn-fullscreen"),g=c.find(".btn-borderless");b._raise("filezoom"+a,d(e)),"shown"===a&&(g.removeClass("active").attr("aria-pressed","false"),f.removeClass("active").attr("aria-pressed","false"),c.hasClass("file-zoom-fullscreen")&&(b._maximizeZoomDialog(),la()?f.addClass("active").attr("aria-pressed","true"):g.addClass("active").attr("aria-pressed","true")))})},_initZoom:function(){var d,b=this,e=b._getLayoutTemplate("modalMain"),f="#"+c;b.$modal=a(f),b.$modal&&b.$modal.length||(d=a(document.createElement("div")).html(e).insertAfter(b.$container),b.$modal=a("#"+c).insertBefore(d),d.remove()),b.$modal.html(b._getModalContent()),b._listenModalEvent("show"),b._listenModalEvent("shown"),b._listenModalEvent("hide"),b._listenModalEvent("hidden"),b._listenModalEvent("loaded")},_initZoomButtons:function(){var d,e,b=this,c=b.$modal.data("previewId")||"",f=b.$preview.find(".file-preview-frame").toArray(),g=f.length,h=b.$modal.find(".btn-prev"),i=b.$modal.find(".btn-next");g&&(d=a(f[0]),e=a(f[g-1]),h.removeAttr("disabled"),i.removeAttr("disabled"),d.length&&d.attr("id")===c&&h.attr("disabled",!0),e.length&&e.attr("id")===c&&i.attr("disabled",!0))},_maximizeZoomDialog:function(){var b=this,c=b.$modal,d=c.find(".modal-header:visible"),e=c.find(".modal-footer:visible"),f=c.find(".modal-body"),g=a(window).height(),h=0;c.addClass("file-zoom-fullscreen"),d&&d.length&&(g-=d.outerHeight(!0)),e&&e.length&&(g-=e.outerHeight(!0)),f&&f.length&&(h=f.outerHeight(!0)-f.height(),g-=h),c.find(".kv-zoom-body").height(g)},_resizeZoomDialog:function(a){var b=this,c=b.$modal,d=c.find(".btn-fullscreen"),e=c.find(".btn-borderless");if(c.hasClass("file-zoom-fullscreen"))ma(!1),a?d.hasClass("active")||(c.removeClass("file-zoom-fullscreen"),b._resizeZoomDialog(!0),e.hasClass("active")&&e.removeClass("active").attr("aria-pressed","false")):d.hasClass("active")?d.removeClass("active").attr("aria-pressed","false"):(c.removeClass("file-zoom-fullscreen"),b.$modal.find(".kv-zoom-body").css("height",b.zoomModalHeight));else{if(!a)return void b._maximizeZoomDialog();ma(!0)}c.focus()},_setZoomContent:function(b,c){var e,f,g,h,i,k,l,r,d=this,m=b.attr("id"),n=d.$modal,o=n.find(".btn-prev"),q=n.find(".btn-next"),s=n.find(".btn-fullscreen"),t=n.find(".btn-borderless"),u=n.find(".btn-toggleheader");f=b.data("template")||"generic",e=b.find(".kv-file-content"),g=e.length?e.html():"",h=b.find(".file-footer-caption").text()||"",n.find(".kv-zoom-title").html(h),i=n.find(".kv-zoom-body"),c?(r=i.clone().insertAfter(i),i.html(g).hide(),r.fadeOut("fast",function(){i.fadeIn("fast"),r.remove()})):i.html(g),l=d.previewZoomSettings[f],l&&(k=i.find(".kv-preview-data"),p(k,"file-zoom-detail"),a.each(l,function(a,b){k.css(a,b),(k.attr("width")&&"width"===a||k.attr("height")&&"height"===a)&&k.removeAttr(a)})),n.data("previewId",m),j(o,"click",function(){d._zoomSlideShow("prev",m)}),j(q,"click",function(){d._zoomSlideShow("next",m)}),j(s,"click",function(){d._resizeZoomDialog(!0)}),j(t,"click",function(){d._resizeZoomDialog(!1)}),j(u,"click",function(){var c,a=n.find(".modal-header"),b=n.find(".modal-body .floating-buttons"),e=a.find(".kv-zoom-actions"),f=function(b){var c=d.$modal.find(".kv-zoom-body"),e=d.zoomModalHeight;n.hasClass("file-zoom-fullscreen")&&(e=c.outerHeight(!0),b||(e-=a.outerHeight(!0))),c.css("height",b?e+b:e)};a.is(":visible")?(c=a.outerHeight(!0),a.slideUp("slow",function(){e.find(".btn").appendTo(b),f(c)})):(b.find(".btn").appendTo(e),a.slideDown("slow",function(){f()})),n.focus()}),j(n,"keydown",function(a){var b=a.which||a.keyCode;37!==b||o.attr("disabled")||d._zoomSlideShow("prev",m),39!==b||q.attr("disabled")||d._zoomSlideShow("next",m)})},_zoomPreview:function(a){var c,b=this;if(!a.length)throw"Cannot zoom to detailed preview!";b.$modal.html(b._getModalContent()),c=a.closest(".file-preview-frame"),b._setZoomContent(c),b.$modal.modal("show"),b._initZoomButtons()},_zoomSlideShow:function(b,c){var f,g,j,d=this,e=d.$modal.find(".kv-zoom-actions .btn-"+b),h=d.$preview.find(".file-preview-frame").toArray(),i=h.length;if(!e.attr("disabled")){for(g=0;g<i;g++)if(a(h[g]).attr("id")===c){j="prev"===b?g-1:g+1;break}j<0||j>=i||!h[j]||(f=a(h[j]),f.length&&d._setZoomContent(f,!0),d._initZoomButtons(),d._raise("filezoom"+b,{previewId:c,modal:d.$modal}))}},_initZoomButton:function(){var b=this;b.$preview.find(".kv-file-zoom").each(function(){var c=a(this);j(c,"click",function(){b._zoomPreview(c)})})},_initPreviewActions:function(){var b=this,c=b.deleteExtraData||{},d=function(){var a=b.isUploadable?k.count(b.id):b.$element.get(0).files.length;0!==b.$preview.find(".kv-file-remove").length||a||(b.reset(),b.initialCaption="")};b._initZoomButton(),b.$preview.find(".kv-file-remove").each(function(){var e=a(this),f=e.data("url")||b.deleteUrl,g=e.data("key");if(!da(f)&&void 0!==g){var l,m,o,q,h=e.closest(".file-preview-frame"),i=k.data[b.id],n=h.data("fileindex");n=parseInt(n.replace("init_","")),o=da(i.config)&&da(i.config[n])?null:i.config[n],q=da(o)||da(o.extra)?c:o.extra,"function"==typeof q&&(q=q()),m={id:e.attr("id"),key:g,extra:q},l=a.extend(!0,{},{url:f,type:"POST",dataType:"json",data:a.extend(!0,{},{key:g},q),beforeSend:function(a){b.ajaxAborted=!1,b._raise("filepredelete",[g,a,q]),b.ajaxAborted?a.abort():(p(h,"file-uploading"),p(e,"disabled"))},success:function(a,c,f){var i,j;return da(a)||da(a.error)?(k.unset(b.id,n),i=k.count(b.id),j=i>0?b._getMsgSelected(i):"",b._raise("filedeleted",[g,f,q]),b._setCaption(j),h.removeClass("file-uploading").addClass("file-deleted"),void h.fadeOut("slow",function(){b._clearObjects(h),h.remove(),d(),i||0!==b.getFileStack().length||(b._setCaption(""),b.reset())})):(m.jqXHR=f,m.response=a,b._showError(a.error,m,"filedeleteerror"),h.removeClass("file-uploading"),e.removeClass("disabled"),void d())},error:function(a,c,e){var f=b._parseError(a,e);
m.jqXHR=a,m.response={},b._showError(f,m,"filedeleteerror"),h.removeClass("file-uploading"),d()}},b.ajaxDeleteSettings),j(e,"click",function(){return!!b._validateMinCount()&&void a.ajax(l)})}})},_clearObjects:function(b){b.find("video audio").each(function(){this.pause(),a(this).remove()}),b.find("img object div").each(function(){a(this).remove()})},_clearFileInput:function(){var d,e,f,b=this,c=b.$element;da(c.val())||(b.isIE9||b.isIE10?(d=c.closest("form"),e=a(document.createElement("form")),f=a(document.createElement("div")),c.before(f),d.length?d.after(e):f.after(e),e.append(c).trigger("reset"),f.before(c).remove(),e.remove()):c.val(""),b.fileInputCleared=!0)},_resetUpload:function(){var a=this;a.uploadCache={content:[],config:[],tags:[],append:!0},a.uploadCount=0,a.uploadStatus={},a.uploadLog=[],a.uploadAsyncCount=0,a.loadedImages=[],a.totalImagesCount=0,a.$btnUpload.removeAttr("disabled"),a._setProgress(0),p(a.$progress,"hide"),a._resetErrors(!1),a.ajaxAborted=!1,a.ajaxRequests=[],a._resetCanvas()},_resetCanvas:function(){var a=this;a.canvas&&a.imageCanvasContext&&a.imageCanvasContext.clearRect(0,0,a.canvas.width,a.canvas.height)},_hasInitialPreview:function(){var a=this;return!a.overwriteInitial&&k.count(a.id)},_resetPreview:function(){var b,c,a=this;k.count(a.id)?(b=k.out(a.id),a.$preview.html(b.content),c=a.initialCaption?a.initialCaption:b.caption,a._setCaption(c)):(a._clearPreview(),a._initCaption()),a.showPreview&&(a._initZoom(),a._initSortable())},_clearDefaultPreview:function(){var a=this;a.$preview.find(".file-default-preview").remove()},_validateDefaultPreview:function(){var a=this;a.showPreview&&!da(a.defaultPreviewContent)&&(a.$preview.html('<div class="file-default-preview">'+a.defaultPreviewContent+"</div>"),a.$container.removeClass("file-input-new"),a._initClickable())},_resetPreviewThumbs:function(a){var c,b=this;return a?(b._clearPreview(),void b.clearStack()):void(b._hasInitialPreview()?(c=k.out(b.id),b.$preview.html(c.content),b._setCaption(c.caption),b._initPreviewActions()):b._clearPreview())},_getLayoutTemplate:function(a){var b=this,c=fa(a,b.layoutTemplates,Y[a]);return da(b.customLayoutTags)?c:ia(c,b.customLayoutTags)},_getPreviewTemplate:function(a){var b=this,c=fa(a,b.previewTemplates,Z[a]);return da(b.customPreviewTags)?c:ia(c,b.customPreviewTags)},_getOutData:function(a,b,c){var d=this;return a=a||{},b=b||{},c=c||d.filestack.slice(0)||{},{form:d.formdata,files:c,filenames:d.filenames,filescount:d.getFilesCount(),extra:d._getExtraData(),response:b,reader:d.reader,jqXHR:a}},_getMsgSelected:function(a){var b=this,c=1===a?b.fileSingle:b.filePlural;return a>0?b.msgSelected.replace("{n}",a).replace("{files}",c):b.msgNoFilesSelected},_getThumbs:function(a){return a=a||"",this.$preview.find(".file-preview-frame:not(.file-preview-initial)"+a)},_getExtraData:function(a,b){var c=this,d=c.uploadExtraData;return"function"==typeof c.uploadExtraData&&(d=c.uploadExtraData(a,b)),d},_initXhr:function(a,b,c){var d=this;return a.upload&&a.upload.addEventListener("progress",function(a){var e=0,f=a.total,g=a.loaded||a.position;a.lengthComputable&&(e=Math.floor(g/f*100)),b?d._setAsyncUploadStatus(b,e,c):d._setProgress(e)},!1),a},_ajaxSubmit:function(b,c,d,e,f,g){var i,h=this;h._raise("filepreajax",[f,g]),h._uploadExtra(f,g),i=a.extend(!0,{},{xhr:function(){var b=a.ajaxSettings.xhr();return h._initXhr(b,f,h.getFileStack().length)},url:h.uploadUrl,type:"POST",dataType:"json",data:h.formdata,cache:!1,processData:!1,contentType:!1,beforeSend:b,success:c,complete:d,error:e},h.ajaxSettings),h.ajaxRequests.push(a.ajax(i))},_initUploadSuccess:function(b,c,d){var f,g,h,i,j,l,m,n,e=this,o=function(a,b){e[a]instanceof Array||(e[a]=[]),b&&b.length&&(e[a]=e[a].concat(b))};e.showPreview&&"object"==typeof b&&!a.isEmptyObject(b)&&void 0!==b.initialPreview&&b.initialPreview.length>0&&(e.hasInitData=!0,j=b.initialPreview||[],l=b.initialPreviewConfig||[],m=b.initialPreviewThumbTags||[],f=!(void 0!==b.append&&!b.append),j.length>0&&!ea(j)&&(j=j.split(e.initialPreviewDelimiter)),e.overwriteInitial=!1,o("initialPreview",j),o("initialPreviewConfig",l),o("initialPreviewThumbTags",m),void 0!==c?d?(n=c.attr("data-fileindex"),e.uploadCache.content[n]=j[0],e.uploadCache.config[n]=l[0]||[],e.uploadCache.tags[n]=m[0]||[],e.uploadCache.append=f):(h=k.add(e.id,j,l[0],m[0],f),g=k.get(e.id,h,!1),i=a(g).hide(),c.after(i).fadeOut("slow",function(){i.fadeIn("slow").css("display:inline-block"),e._initPreviewActions(),e._clearFileInput(),c.remove()})):(k.set(e.id,j,l,m,f),e._initPreview(),e._initPreviewActions()))},_initSuccessThumbs:function(){var b=this;b.showPreview&&b._getThumbs(".file-preview-success").each(function(){var c=a(this),d=c.find(".kv-file-remove");d.removeAttr("disabled"),j(d,"click",function(){var a=b._raise("filesuccessremove",[c.attr("id"),c.data("fileindex")]);ja(c),a!==!1&&c.fadeOut("slow",function(){c.remove(),b.$preview.find(".file-preview-frame").length||b.reset()})})})},_checkAsyncComplete:function(){var c,d,b=this;for(d=0;d<b.filestack.length;d++)if(b.filestack[d]&&(c=b.previewInitId+"-"+d,a.inArray(c,b.uploadLog)===-1))return!1;return b.uploadAsyncCount===b.uploadLog.length},_uploadExtra:function(b,c){var d=this,e=d._getExtraData(b,c);0!==e.length&&a.each(e,function(a,b){d.formdata.append(a,b)})},_uploadSingle:function(b,c,d){var h,j,l,m,n,q,r,s,t,u,e=this,f=e.getFileStack().length,g=new FormData,i=e.previewInitId+"-"+b,o=e.filestack.length>0||!a.isEmptyObject(e.uploadExtraData),v={id:i,index:b};e.formdata=g,e.showPreview&&(j=a("#"+i+":not(.file-preview-initial)"),m=j.find(".kv-file-upload"),n=j.find(".kv-file-remove"),a("#"+i).find(".file-thumb-progress").removeClass("hide")),0===f||!o||m&&m.hasClass("disabled")||e._abort(v)||(u=function(a,b){e.updateStack(a,void 0),e.uploadLog.push(b),e._checkAsyncComplete()&&(e.fileBatchCompleted=!0)},l=function(){var a=e.uploadCache;e.fileBatchCompleted&&setTimeout(function(){e.showPreview&&(k.set(e.id,a.content,a.config,a.tags,a.append),e.hasInitData&&(e._initPreview(),e._initPreviewActions())),e.unlock(),e._clearFileInput(),e._raise("filebatchuploadcomplete",[e.filestack,e._getExtraData()]),e.uploadCount=0,e.uploadStatus={},e.uploadLog=[],e._setProgress(101)},100)},q=function(c){h=e._getOutData(c),e.fileBatchCompleted=!1,e.showPreview&&(j.hasClass("file-preview-success")||(e._setThumbStatus(j,"Loading"),p(j,"file-uploading")),m.attr("disabled",!0),n.attr("disabled",!0)),d||e.lock(),e._raise("filepreupload",[h,i,b]),a.extend(!0,v,h),e._abort(v)&&(c.abort(),e._setProgressCancelled())},r=function(c,f,g){var k=e.showPreview&&j.attr("id")?j.attr("id"):i;h=e._getOutData(g,c),a.extend(!0,v,h),setTimeout(function(){da(c)||da(c.error)?(e.showPreview&&(e._setThumbStatus(j,"Success"),m.hide(),e._initUploadSuccess(c,j,d)),e._raise("fileuploaded",[h,k,b]),d?u(b,k):e.updateStack(b,void 0)):(e._showUploadError(c.error,v),e._setPreviewError(j,b),d&&u(b,k))},100)},s=function(){setTimeout(function(){e.showPreview&&(m.removeAttr("disabled"),n.removeAttr("disabled"),j.removeClass("file-uploading"),e._setProgress(101,a("#"+i).find(".file-thumb-progress"))),d?l():(e.unlock(!1),e._clearFileInput()),e._initSuccessThumbs()},100)},t=function(f,g,h){var k=e._parseError(f,h,d?c[b].name:null);setTimeout(function(){d&&u(b,i),e.uploadStatus[i]=100,e._setPreviewError(j,b),a.extend(!0,v,e._getOutData(f)),e._showUploadError(k,v)},100)},g.append(e.uploadFileAttr,c[b],e.filenames[b]),g.append("file_id",b),e._ajaxSubmit(q,r,s,t,i,b))},_uploadBatch:function(){var f,g,h,i,k,b=this,c=b.filestack,d=c.length,e={},j=b.filestack.length>0||!a.isEmptyObject(b.uploadExtraData);b.formdata=new FormData,0!==d&&j&&!b._abort(e)&&(k=function(){a.each(c,function(a){b.updateStack(a,void 0)}),b._clearFileInput()},f=function(c){b.lock();var d=b._getOutData(c);b.showPreview&&b._getThumbs().each(function(){var c=a(this),d=c.find(".kv-file-upload"),e=c.find(".kv-file-remove");c.hasClass("file-preview-success")||(b._setThumbStatus(c,"Loading"),p(c,"file-uploading")),d.attr("disabled",!0),e.attr("disabled",!0)}),b._raise("filebatchpreupload",[d]),b._abort(d)&&(c.abort(),b._setProgressCancelled())},g=function(c,d,e){var f=b._getOutData(e,c),g=b._getThumbs(":not(.file-preview-error)"),h=0,i=da(c)||da(c.errorkeys)?[]:c.errorkeys;da(c)||da(c.error)?(b._raise("filebatchuploadsuccess",[f]),k(),b.showPreview?(g.each(function(){var c=a(this),d=c.find(".kv-file-upload");c.find(".kv-file-upload").hide(),b._setThumbStatus(c,"Success"),c.removeClass("file-uploading"),d.removeAttr("disabled")}),b._initUploadSuccess(c)):b.reset()):(b.showPreview&&(g.each(function(){var c=a(this),d=c.find(".kv-file-remove"),e=c.find(".kv-file-upload");return c.removeClass("file-uploading"),e.removeAttr("disabled"),d.removeAttr("disabled"),0===i.length?void b._setPreviewError(c):(a.inArray(h,i)!==-1?b._setPreviewError(c):(c.find(".kv-file-upload").hide(),b._setThumbStatus(c,"Success"),b.updateStack(h,void 0)),void h++)}),b._initUploadSuccess(c)),b._showUploadError(c.error,f,"filebatchuploaderror"))},i=function(){b._setProgress(101),b.unlock(),b._initSuccessThumbs(),b._clearFileInput(),b._raise("filebatchuploadcomplete",[b.filestack,b._getExtraData()])},h=function(c,e,f){var g=b._getOutData(c),h=b._parseError(c,f);b._showUploadError(h,g,"filebatchuploaderror"),b.uploadFileCount=d-1,b.showPreview&&(b._getThumbs().each(function(){var c=a(this),d=c.attr("data-fileindex");c.removeClass("file-uploading"),void 0!==b.filestack[d]&&b._setPreviewError(c)}),b._getThumbs().removeClass("file-uploading"),b._getThumbs(" .kv-file-upload").removeAttr("disabled"),b._getThumbs(" .kv-file-delete").removeAttr("disabled"))},a.each(c,function(a,d){da(c[a])||b.formdata.append(b.uploadFileAttr,d,b.filenames[a])}),b._ajaxSubmit(f,g,i,h))},_uploadExtraOnly:function(){var c,d,e,f,a=this,b={};a.formdata=new FormData,a._abort(b)||(c=function(c){a.lock();var d=a._getOutData(c);a._raise("filebatchpreupload",[d]),a._setProgress(50),b.data=d,b.xhr=c,a._abort(b)&&(c.abort(),a._setProgressCancelled())},d=function(b,c,d){var e=a._getOutData(d,b);da(b)||da(b.error)?(a._raise("filebatchuploadsuccess",[e]),a._clearFileInput(),a._initUploadSuccess(b)):a._showUploadError(b.error,e,"filebatchuploaderror")},e=function(){a._setProgress(101),a.unlock(),a._clearFileInput(),a._raise("filebatchuploadcomplete",[a.filestack,a._getExtraData()])},f=function(c,d,e){var f=a._getOutData(c),g=a._parseError(c,e);b.data=f,a._showUploadError(g,f,"filebatchuploaderror")},a._ajaxSubmit(c,d,e,f))},_initFileActions:function(){var b=this;b.showPreview&&(b._initZoomButton(),b.$preview.find(".kv-file-remove").each(function(){var e,h,i,l,c=a(this),d=c.closest(".file-preview-frame"),f=d.attr("id"),g=d.attr("data-fileindex");j(c,"click",function(){return l=b._raise("filepreremove",[f,g]),!(l===!1||!b._validateMinCount())&&(e=d.hasClass("file-preview-error"),ja(d),void d.fadeOut("slow",function(){b.updateStack(g,void 0),b._clearObjects(d),d.remove(),f&&e&&b.$errorContainer.find('li[data-file-id="'+f+'"]').fadeOut("fast",function(){a(this).remove(),b._errorsExist()||b._resetErrors()}),b._clearFileInput();var c=b.getFileStack(!0),j=k.count(b.id),l=c.length,m=b.showPreview&&b.$preview.find(".file-preview-frame").length;0!==l||0!==j||m?(h=j+l,i=h>1?b._getMsgSelected(h):c[0]?b._getFileNames()[0]:"",b._setCaption(i)):b.reset(),b._raise("fileremoved",[f,g])}))})}),b.$preview.find(".kv-file-upload").each(function(){var c=a(this);j(c,"click",function(){var a=c.closest(".file-preview-frame"),d=a.attr("data-fileindex");a.hasClass("file-preview-error")||b._uploadSingle(d,b.filestack,!1)})}))},_hideFileIcon:function(){this.overwriteInitial&&this.$captionContainer.find(".kv-caption-icon").hide()},_showFileIcon:function(){this.$captionContainer.find(".kv-caption-icon").show()},_getSize:function(a){var b=parseFloat(a);if(null===a||isNaN(b))return"";var d,f,g,c=this,e=c.fileSizeGetter;return"function"==typeof e?g=e(a):(d=Math.floor(Math.log(b)/Math.log(1024)),f=["B","KB","MB","GB","TB","PB","EB","ZB","YB"],g=1*(b/Math.pow(1024,d)).toFixed(2)+" "+f[d]),c._getLayoutTemplate("size").replace("{sizeText}",g)},_generatePreviewTemplate:function(a,b,c,d,e,f,g,h,i,j){var m,n,k=this,l=k._getPreviewTemplate(a),o=h||"",p=fa(a,k.previewSettings,ba[a]),q=k.slug(c),r=i||k._renderFileFooter(q,g,p.width,f);return j=j||e.slice(e.lastIndexOf("-")+1),l=k._parseFilePreviewIcon(l,c),"text"===a||"html"===a?(n="text"===a?ha(b):b,m=l.replace(/\{previewId}/g,e).replace(/\{caption}/g,q).replace(/\{width}/g,p.width).replace(/\{height}/g,p.height).replace(/\{frameClass}/g,o).replace(/\{cat}/g,d).replace(/\{footer}/g,r).replace(/\{fileindex}/g,j).replace(/\{data}/g,n).replace(/\{template}/g,a)):m=l.replace(/\{previewId}/g,e).replace(/\{caption}/g,q).replace(/\{frameClass}/g,o).replace(/\{type}/g,d).replace(/\{fileindex}/g,j).replace(/\{width}/g,p.width).replace(/\{height}/g,p.height).replace(/\{footer}/g,r).replace(/\{data}/g,b).replace(/\{template}/g,a),m},_previewDefault:function(b,c,d){var e=this,f=e.$preview,h=f.find(".file-live-thumbs");if(e.showPreview){var k,i=b?b.name:"",j=b?b.type:"",l=d===!0&&!e.isUploadable,m=g.createObjectURL(b);e._clearDefaultPreview(),k=e._generatePreviewTemplate("other",m,i,j,c,l,b.size),h.length||(h=a(document.createElement("div")).addClass("file-live-thumbs").appendTo(f)),h.append("\n"+k),d===!0&&e.isUploadable&&e._setThumbStatus(a("#"+c),"Error")}},_previewFile:function(b,c,d,e,f){if(this.showPreview){var q,g=this,h=g._parseFileType(c),i=c?c.name:"",j=g.slug(i),k=g.allowedPreviewTypes,l=g.allowedPreviewMimeTypes,m=g.$preview,n=k&&k.indexOf(h)>=0,o=m.find(".file-live-thumbs"),p="text"===h||"html"===h||"image"===h?d.target.result:f,r=l&&l.indexOf(c.type)!==-1;o.length||(o=a(document.createElement("div")).addClass("file-live-thumbs").appendTo(m)),"html"===h&&g.purifyHtml&&window.DOMPurify&&(p=window.DOMPurify.sanitize(p)),n||r?(q=g._generatePreviewTemplate(h,p,i,c.type,e,!1,c.size),g._clearDefaultPreview(),o.append("\n"+q),g._validateImage(b,e,j,c.type)):g._previewDefault(c,e),g._initSortable()}},_slugDefault:function(a){return da(a)?"":String(a).replace(/[\-\[\]\/\{}:;#%=\(\)\*\+\?\\\^\$\|<>&"']/g,"_")},_readFiles:function(b){this.reader=new FileReader;var q,c=this,d=c.$element,e=c.$preview,f=c.reader,i=c.$previewContainer,j=c.$previewStatus,k=c.msgLoading,l=c.msgProgress,m=c.previewInitId,n=b.length,o=c.fileTypeSettings,p=c.filestack.length,r=c.maxFilePreviewSize&&parseFloat(c.maxFilePreviewSize),s=e.length&&(!r||isNaN(r)),t=function(d,e,f,g){var h=a.extend(!0,{},c._getOutData({},{},b),{id:f,index:g}),i={id:f,index:g,file:e,files:b};return c._previewDefault(e,f,!0),c.isUploadable&&c.addToStack(void 0),setTimeout(function(){q(g+1)},100),c._initFileActions(),c.removeFromPreviewOnError&&a("#"+f).remove(),c.isUploadable?c._showUploadError(d,h):c._showError(d,i)};c.loadedImages=[],c.totalImagesCount=0,a.each(b,function(a,b){var d=c.fileTypeSettings.image||ca.image;d&&d(b.type)&&c.totalImagesCount++}),q=function(a){if(da(d.attr("multiple"))&&(n=1),a>=n)return c.isUploadable&&c.filestack.length>0?c._raise("filebatchselected",[c.getFileStack()]):c._raise("filebatchselected",[b]),i.removeClass("file-thumb-loading"),void j.html("");var w,x,B,F,G,H,I,u=p+a,v=m+"-"+u,y=b[a],z=c.slug(y.name),A=(y.size||0)/1e3,C="",D=g.createObjectURL(y),E=0,J=c.allowedFileTypes,K=da(J)?"":J.join(", "),L=c.allowedFileExtensions,M=da(L)?"":L.join(", ");if(da(L)||(C=new RegExp("\\.("+L.join("|")+")$","i")),A=A.toFixed(2),c.maxFileSize>0&&A>c.maxFileSize)return G=c.msgSizeTooLarge.replace("{name}",z).replace("{size}",A).replace("{maxSize}",c.maxFileSize),void(c.isError=t(G,y,v,a));if(!da(J)&&ea(J)){for(F=0;F<J.length;F+=1)H=J[F],B=o[H],I=void 0!==B&&B(y.type,z),E+=da(I)?0:I.length;if(0===E)return G=c.msgInvalidFileType.replace("{name}",z).replace("{types}",K),void(c.isError=t(G,y,v,a))}return 0!==E||da(L)||!ea(L)||da(C)||(I=h(z,C),E+=da(I)?0:I.length,0!==E)?c.showPreview?!s&&A>r?(c.addToStack(y),i.addClass("file-thumb-loading"),c._previewDefault(y,v),c._initFileActions(),c._updateFileDetails(n),void q(a+1)):(e.length&&void 0!==FileReader?(j.html(k.replace("{index}",a+1).replace("{files}",n)),i.addClass("file-thumb-loading"),f.onerror=function(a){c._errorHandler(a,z)},f.onload=function(b){c._previewFile(a,y,b,v,D),c._initFileActions()},f.onloadend=function(){G=l.replace("{index}",a+1).replace("{files}",n).replace("{percent}",50).replace("{name}",z),setTimeout(function(){j.html(G),c._updateFileDetails(n),q(a+1)},100),c._raise("fileloaded",[y,v,a,f])},f.onprogress=function(b){if(b.lengthComputable){var c=b.loaded/b.total*100,d=Math.ceil(c);G=l.replace("{index}",a+1).replace("{files}",n).replace("{percent}",d).replace("{name}",z),setTimeout(function(){j.html(G)},100)}},w=fa("text",o,ca.text),x=fa("image",o,ca.image),w(y.type,z)?f.readAsText(y,c.textEncoding):x(y.type,z)?f.readAsDataURL(y):f.readAsArrayBuffer(y)):(c._previewDefault(y,v),setTimeout(function(){q(a+1),c._updateFileDetails(n)},100),c._raise("fileloaded",[y,v,a,f])),void c.addToStack(y)):(c.addToStack(y),setTimeout(function(){q(a+1)},100),void c._raise("fileloaded",[y,v,a,f])):(G=c.msgInvalidFileExtension.replace("{name}",z).replace("{extensions}",M),void(c.isError=t(G,y,v,a)))},q(0),c._updateFileDetails(n,!1)},_updateFileDetails:function(a){var b=this,c=b.$element,d=b.getFileStack(),e=i(9)&&ka(c.val())||c[0].files[0]&&c[0].files[0].name||d.length&&d[0].name||"",f=b.slug(e),g=b.isUploadable?d.length:a,h=k.count(b.id)+g,j=g>1?b._getMsgSelected(h):f;b.isError?(b.$previewContainer.removeClass("file-thumb-loading"),b.$previewStatus.html(""),b.$captionContainer.find(".kv-caption-icon").hide()):b._showFileIcon(),b._setCaption(j,b.isError),b.$container.removeClass("file-input-new file-input-ajax-new"),1===arguments.length&&b._raise("fileselect",[a,f]),k.count(b.id)&&b._initPreviewActions()},_setThumbStatus:function(a,b){var c=this;if(c.showPreview){var d="indicator"+b,e=d+"Title",f="file-preview-"+b.toLowerCase(),g=a.find(".file-upload-indicator"),h=c.fileActionSettings;a.removeClass("file-preview-success file-preview-error file-preview-loading"),"Error"===b&&a.find(".kv-file-upload").attr("disabled",!0),"Success"===b&&(a.find(".file-drag-handle").remove(),g.css("margin-left",0)),g.html(h[d]),g.attr("title",h[e]),a.addClass(f)}},_setProgressCancelled:function(){var a=this;a._setProgress(101,a.$progress,a.msgCancelled)},_setProgress:function(a,b,c){var d=this,e=Math.min(a,100),f=e<100?d.progressTemplate:c?d.progressErrorTemplate:a<=100?d.progressTemplate:d.progressCompleteTemplate,g=d.progressUploadThreshold;if(b=b||d.$progress,!da(f)){if(g&&e>g&&a<=100){var h=f.replace("{percent}",g).replace("{percent}",g).replace("{percent}%",d.msgUploadThreshold);b.html(h)}else b.html(f.replace(/\{percent}/g,e));c&&b.find('[role="progressbar"]').html(c)}},_setFileDropZoneTitle:function(){var d,a=this,b=a.$container.find(".file-drop-zone"),c=a.dropZoneTitle;a.isClickable&&(d=da(a.$element.attr("multiple"))?a.fileSingle:a.filePlural,c+=a.dropZoneClickTitle.replace("{files}",d)),b.find("."+a.dropZoneTitleClass).remove(),a.isUploadable&&a.showPreview&&0!==b.length&&!(a.getFileStack().length>0)&&a.dropZoneEnabled&&(0===b.find(".file-preview-frame").length&&da(a.defaultPreviewContent)&&b.prepend('<div class="'+a.dropZoneTitleClass+'">'+c+"</div>"),a.$container.removeClass("file-input-new"),p(a.$container,"file-input-ajax-new"))},_setAsyncUploadStatus:function(b,c,d){var e=this,f=0;e._setProgress(c,a("#"+b).find(".file-thumb-progress")),e.uploadStatus[b]=c,a.each(e.uploadStatus,function(a,b){f+=b}),e._setProgress(Math.floor(f/d))},_validateMinCount:function(){var a=this,b=a.isUploadable?a.getFileStack().length:a.$element.get(0).files.length;return!(a.validateInitialCount&&a.minFileCount>0&&a._getFileCount(b-1)<a.minFileCount)||(a._noFilesError({}),!1)},_getFileCount:function(a){var b=this,c=0;return b.validateInitialCount&&!b.overwriteInitial&&(c=k.count(b.id),a+=c),a},_getFileName:function(a){return a&&a.name?this.slug(a.name):void 0},_getFileNames:function(a){var b=this;return b.filenames.filter(function(b){return a?void 0!==b:void 0!==b&&null!==b})},_setPreviewError:function(a,b,c){var d=this;void 0!==b&&d.updateStack(b,c),d.removeFromPreviewOnError?a.remove():d._setThumbStatus(a,"Error")},_checkDimensions:function(a,b,c,d,e,f,g){var i,j,m,n,h=this,k="Small"===b?"min":"max",l=h[k+"Image"+f];!da(l)&&c.length&&(m=c[0],j="Width"===f?m.naturalWidth||m.width:m.naturalHeight||m.height,n="Small"===b?j>=l:j<=l,n||(i=h["msgImage"+f+b].replace("{name}",e).replace("{size}",l),h._showUploadError(i,g),h._setPreviewError(d,a,null)))},_validateImage:function(a,b,c,d){var h,i,k,e=this,f=e.$preview,l=f.find("#"+b),m=l.find("img");c=c||"Untitled",m.length&&j(m,"load",function(){i=l.width(),k=f.width(),i>k&&(m.css("width","100%"),l.css("width","97%")),h={ind:a,id:b},e._checkDimensions(a,"Small",m,l,c,"Width",h),e._checkDimensions(a,"Small",m,l,c,"Height",h),e.resizeImage||(e._checkDimensions(a,"Large",m,l,c,"Width",h),e._checkDimensions(a,"Large",m,l,c,"Height",h)),e._raise("fileimageloaded",[b]),e.loadedImages.push({ind:a,img:m,thumb:l,pid:b,typ:d}),e._validateAllImages(),g.revokeObjectURL(m.attr("src"))})},_validateAllImages:function(){var b,c,d,e,f,g,i,a=this,h={};if(a.loadedImages.length===a.totalImagesCount&&(a._raise("fileimagesloaded"),a.resizeImage)){for(i=a.isUploadable?a._showUploadError:a._showError,b=0;b<a.loadedImages.length;b++)c=a.loadedImages[b],d=c.img,e=c.thumb,f=c.pid,g=c.ind,h={id:f,index:g},a._getResizedImage(d[0],c.typ,f,g)||(i(a.msgImageResizeError,h,"fileimageresizeerror"),a._setPreviewError(e,g));a._raise("fileimagesresized")}},_getResizedImage:function(a,b,c,d){var l,m,e=this,f=a.naturalWidth,g=a.naturalHeight,h=1,i=e.maxImageWidth||f,j=e.maxImageHeight||g,k=f&&g,n=e.imageCanvas,o=e.imageCanvasContext;if(!k)return!1;if(f===i&&g===j)return!0;b=b||e.resizeDefaultImageType,l=f>i,m=g>j,h="width"===e.resizePreference?l?i/f:m?j/g:1:m?j/g:l?i/f:1,e._resetCanvas(),f*=h,g*=h,n.width=f,n.height=g;try{return o.drawImage(a,0,0,f,g),n.toBlob(function(a){e._raise("fileimageresized",[c,d]),e.filestack[d]=a},b,e.resizeQuality),!0}catch(a){return!1}},_initBrowse:function(a){var b=this;b.showBrowse?(b.$btnFile=a.find(".btn-file"),b.$btnFile.append(b.$element)):b.$element.hide()},_initCaption:function(){var a=this,b=a.initialCaption||"";return a.overwriteInitial||da(b)?(a.$caption.html(""),!1):(a._setCaption(b),!0)},_setCaption:function(b,c){var e,f,g,h,d=this,i=d.getFileStack();if(d.$caption.length){if(c)e=a("<div>"+d.msgValidationError+"</div>").text(),g=i.length,h=g?1===g&&i[0]?d._getFileNames()[0]:d._getMsgSelected(g):d._getMsgSelected(d.msgNo),f='<span class="'+d.msgValidationErrorClass+'">'+d.msgValidationErrorIcon+(da(b)?h:b)+"</span>";else{if(da(b))return;e=a("<div>"+b+"</div>").text(),f=d._getLayoutTemplate("fileIcon")+e}d.$caption.html(f),d.$caption.attr("title",e),d.$captionContainer.find(".file-caption-ellipsis").attr("title",e)}},_createContainer:function(){var b=this,c=a(document.createElement("div")).attr({class:"file-input file-input-new"}).html(b._renderMain());return b.$element.before(c),b._initBrowse(c),b.theme&&c.addClass("theme-"+b.theme),c},_refreshContainer:function(){var a=this,b=a.$container;b.before(a.$element),b.html(a._renderMain()),a._initBrowse(b)},_renderMain:function(){var a=this,b=a.isUploadable&&a.dropZoneEnabled?" file-drop-zone":"file-drop-disabled",c=a.showClose?a._getLayoutTemplate("close"):"",d=a.showPreview?a._getLayoutTemplate("preview").replace(/\{class}/g,a.previewClass).replace(/\{dropClass}/g,b):"",e=a.isDisabled?a.captionClass+" file-caption-disabled":a.captionClass,f=a.captionTemplate.replace(/\{class}/g,e+" kv-fileinput-caption");return a.mainTemplate.replace(/\{class}/g,a.mainClass+(!a.showBrowse&&a.showCaption?" no-browse":"")).replace(/\{preview}/g,d).replace(/\{close}/g,c).replace(/\{caption}/g,f).replace(/\{upload}/g,a._renderButton("upload")).replace(/\{remove}/g,a._renderButton("remove")).replace(/\{cancel}/g,a._renderButton("cancel")).replace(/\{browse}/g,a._renderButton("browse"))},_renderButton:function(a){var b=this,c=b._getLayoutTemplate("btnDefault"),d=b[a+"Class"],e=b[a+"Title"],f=b[a+"Icon"],g=b[a+"Label"],h=b.isDisabled?" disabled":"",i="button";switch(a){case"remove":if(!b.showRemove)return"";break;case"cancel":if(!b.showCancel)return"";d+=" hide";break;case"upload":if(!b.showUpload)return"";b.isUploadable&&!b.isDisabled?c=b._getLayoutTemplate("btnLink").replace("{href}",b.uploadUrl):i="submit";break;case"browse":if(!b.showBrowse)return"";c=b._getLayoutTemplate("btnBrowse");break;default:return""}return d+="browse"===a?" btn-file":" fileinput-"+a+" fileinput-"+a+"-button",da(g)||(g=' <span class="'+b.buttonLabelClass+'">'+g+"</span>"),c.replace("{type}",i).replace("{css}",d).replace("{title}",e).replace("{status}",h).replace("{icon}",f).replace("{label}",g)},_renderThumbProgress:function(){return'<div class="file-thumb-progress hide">'+this.progressTemplate.replace(/\{percent}/g,"0")+"</div>"},_renderFileFooter:function(a,b,c,d){var k,e=this,f=e.fileActionSettings,g=f.showRemove,h=f.showDrag,i=f.showUpload,j=f.showZoom,l=e._getLayoutTemplate("footer"),m=d?f.indicatorError:f.indicatorNew,n=d?f.indicatorErrorTitle:f.indicatorNewTitle;return b=e._getSize(b),k=e.isUploadable?l.replace(/\{actions}/g,e._renderFileActions(i,g,j,h,!1,!1,!1)).replace(/\{caption}/g,a).replace(/\{size}/g,b).replace(/\{width}/g,c).replace(/\{progress}/g,e._renderThumbProgress()).replace(/\{indicator}/g,m).replace(/\{indicatorTitle}/g,n):l.replace(/\{actions}/g,e._renderFileActions(!1,!1,j,h,!1,!1,!1)).replace(/\{caption}/g,a).replace(/\{size}/g,b).replace(/\{width}/g,c).replace(/\{progress}/g,"").replace(/\{indicator}/g,m).replace(/\{indicatorTitle}/g,n),k=ia(k,e.previewThumbTags)},_renderFileActions:function(a,b,c,d,e,f,g,h){if(!(a||b||c||d))return"";var p,i=this,j=f===!1?"":' data-url="'+f+'"',k=g===!1?"":' data-key="'+g+'"',l="",m="",n="",o="",q=i._getLayoutTemplate("actions"),r=i.fileActionSettings,s=i.otherActionButtons.replace(/\{dataKey}/g,k),t=e?r.removeClass+" disabled":r.removeClass;return b&&(l=i._getLayoutTemplate("actionDelete").replace(/\{removeClass}/g,t).replace(/\{removeIcon}/g,r.removeIcon).replace(/\{removeTitle}/g,r.removeTitle).replace(/\{dataUrl}/g,j).replace(/\{dataKey}/g,k)),a&&(m=i._getLayoutTemplate("actionUpload").replace(/\{uploadClass}/g,r.uploadClass).replace(/\{uploadIcon}/g,r.uploadIcon).replace(/\{uploadTitle}/g,r.uploadTitle)),c&&(n=i._getLayoutTemplate("actionZoom").replace(/\{zoomClass}/g,r.zoomClass).replace(/\{zoomIcon}/g,r.zoomIcon).replace(/\{zoomTitle}/g,r.zoomTitle)),d&&h&&(p="drag-handle-init "+r.dragClass,o=i._getLayoutTemplate("actionDrag").replace(/\{dragClass}/g,p).replace(/\{dragTitle}/g,r.dragTitle).replace(/\{dragIcon}/g,r.dragIcon)),q.replace(/\{delete}/g,l).replace(/\{upload}/g,m).replace(/\{zoom}/g,n).replace(/\{drag}/g,o).replace(/\{other}/g,s)},_browse:function(a){var b=this;b._raise("filebrowse"),a&&a.isDefaultPrevented()||(b.isError&&!b.isUploadable&&b.clear(),b.$captionContainer.focus())},_change:function(b){var c=this,d=c.$element;if(!c.isUploadable&&da(d.val())&&c.fileInputCleared)return void(c.fileInputCleared=!1);c.fileInputCleared=!1;var e,f,g,l,m,n,h=arguments.length>1,i=c.isUploadable,j=0,o=h?b.originalEvent.dataTransfer.files:d.get(0).files,p=c.filestack.length,q=da(d.attr("multiple")),r=q&&p>0,s=0,t=function(b,d,e,f){var g=a.extend(!0,{},c._getOutData({},{},o),{id:e,index:f}),h={id:e,index:f,file:d,files:o};return c.isUploadable?c._showUploadError(b,g):c._showError(b,h)};if(c.reader=null,c._resetUpload(),c._hideFileIcon(),c.isUploadable&&c.$container.find(".file-drop-zone ."+c.dropZoneTitleClass).remove(),h)for(e=[];o[j];)l=o[j],l.type||l.size%4096!==0?e.push(l):s++,j++;else e=void 0===b.target.files?b.target&&b.target.value?[{name:b.target.value.replace(/^.+\\/,"")}]:[]:b.target.files;if(da(e)||0===e.length)return i||c.clear(),c._showFolderError(s),void c._raise("fileselectnone");if(c._resetErrors(),n=e.length,g=c._getFileCount(c.isUploadable?c.getFileStack().length+n:n),c.maxFileCount>0&&g>c.maxFileCount){if(!c.autoReplace||n>c.maxFileCount)return m=c.autoReplace&&n>c.maxFileCount?n:g,f=c.msgFilesTooMany.replace("{m}",c.maxFileCount).replace("{n}",m),c.isError=t(f,null,null,null),c.$captionContainer.find(".kv-caption-icon").hide(),c._setCaption("",!0),void c.$container.removeClass("file-input-new file-input-ajax-new");g>c.maxFileCount&&c._resetPreviewThumbs(i)}else!i||r?(c._resetPreviewThumbs(!1),r&&c.clearStack()):!i||0!==p||k.count(c.id)&&!c.overwriteInitial||c._resetPreviewThumbs(!0);c.isPreviewable?c._readFiles(e):c._updateFileDetails(1),c._showFolderError(s)},_abort:function(b){var d,c=this;return!(!c.ajaxAborted||"object"!=typeof c.ajaxAborted||void 0===c.ajaxAborted.message)&&(d=a.extend(!0,{},c._getOutData(),b),d.abortData=c.ajaxAborted.data||{},d.abortMessage=c.ajaxAborted.message,c.cancel(),c._setProgress(101,c.$progress,c.msgCancelled),c._showUploadError(c.ajaxAborted.message,d,"filecustomerror"),!0)},_resetFileStack:function(){var b=this,c=0,d=[],e=[];b._getThumbs().each(function(){var f=a(this),g=f.attr("data-fileindex"),h=b.filestack[g];g!==-1&&(void 0!==h?(d[c]=h,e[c]=b._getFileName(h),f.attr({id:b.previewInitId+"-"+c,"data-fileindex":c}),c++):f.attr({id:"uploaded-"+ga(),"data-fileindex":"-1"}))}),b.filestack=d,b.filenames=e},clearStack:function(){var a=this;return a.filestack=[],a.filenames=[],a.$element},updateStack:function(a,b){var c=this;return c.filestack[a]=b,c.filenames[a]=c._getFileName(b),c.$element},addToStack:function(a){var b=this;return b.filestack.push(a),b.filenames.push(b._getFileName(a)),b.$element},getFileStack:function(a){var b=this;return b.filestack.filter(function(b){return a?void 0!==b:void 0!==b&&null!==b})},getFilesCount:function(){var a=this,b=a.isUploadable?a.getFileStack().length:a.$element.get(0).files.length;return a._getFileCount(b)},lock:function(){var a=this;return a._resetErrors(),a.disable(),a.showRemove&&p(a.$container.find(".fileinput-remove"),"hide"),a.showCancel&&a.$container.find(".fileinput-cancel").removeClass("hide"),a._raise("filelock",[a.filestack,a._getExtraData()]),a.$element},unlock:function(a){var b=this;return void 0===a&&(a=!0),b.enable(),b.showCancel&&p(b.$container.find(".fileinput-cancel"),"hide"),b.showRemove&&b.$container.find(".fileinput-remove").removeClass("hide"),a&&b._resetFileStack(),b._raise("fileunlock",[b.filestack,b._getExtraData()]),b.$element},cancel:function(){var e,b=this,c=b.ajaxRequests,d=c.length;if(d>0)for(e=0;e<d;e+=1)b.cancelling=!0,c[e].abort();return b._setProgressCancelled(),b._getThumbs().each(function(){var c=a(this),d=c.attr("data-fileindex");c.removeClass("file-uploading"),void 0!==b.filestack[d]&&(c.find(".kv-file-upload").removeClass("disabled").removeAttr("disabled"),c.find(".kv-file-remove").removeClass("disabled").removeAttr("disabled")),b.unlock()}),b.$element},clear:function(){var c,b=this;return b.$btnUpload.removeAttr("disabled"),b._getThumbs().find("video,audio,img").each(function(){ja(a(this))}),b._resetUpload(),b.clearStack(),b._clearFileInput(),b._resetErrors(!0),b._raise("fileclear"),b._hasInitialPreview()?(b._showFileIcon(),b._resetPreview(),b._initPreviewActions(),b.$container.removeClass("file-input-new")):(b._getThumbs().each(function(){b._clearObjects(a(this))}),b.isUploadable&&(k.data[b.id]={}),b.$preview.html(""),c=!b.overwriteInitial&&b.initialCaption.length>0?b.initialCaption:"",b.$caption.html(c),b.$caption.attr("title",""),p(b.$container,"file-input-new"),b._validateDefaultPreview()),0===b.$container.find(".file-preview-frame").length&&(b._initCaption()||b.$captionContainer.find(".kv-caption-icon").hide()),b._hideFileIcon(),b._raise("filecleared"),b.$captionContainer.focus(),b._setFileDropZoneTitle(),b.$element},reset:function(){var a=this;return a._resetPreview(),a.$container.find(".fileinput-filename").text(""),a._raise("filereset"),p(a.$container,"file-input-new"),(a.$preview.find(".file-preview-frame").length||a.isUploadable&&a.dropZoneEnabled)&&a.$container.removeClass("file-input-new"),
a._setFileDropZoneTitle(),a.clearStack(),a.formdata={},a.$element},disable:function(){var a=this;return a.isDisabled=!0,a._raise("filedisabled"),a.$element.attr("disabled","disabled"),a.$container.find(".kv-fileinput-caption").addClass("file-caption-disabled"),a.$container.find(".btn-file, .fileinput-remove, .fileinput-upload, .file-preview-frame button").attr("disabled",!0),a._initDragDrop(),a.$element},enable:function(){var a=this;return a.isDisabled=!1,a._raise("fileenabled"),a.$element.removeAttr("disabled"),a.$container.find(".kv-fileinput-caption").removeClass("file-caption-disabled"),a.$container.find(".btn-file, .fileinput-remove, .fileinput-upload, .file-preview-frame button").removeAttr("disabled"),a._initDragDrop(),a.$element},upload:function(){var e,f,g,b=this,c=b.getFileStack().length,d={},h=!a.isEmptyObject(b._getExtraData());if(b.minFileCount>0&&b._getFileCount(c)<b.minFileCount)return void b._noFilesError(d);if(b.isUploadable&&!b.isDisabled&&(0!==c||h)){if(b._resetUpload(),b.$progress.removeClass("hide"),b.uploadCount=0,b.uploadStatus={},b.uploadLog=[],b.lock(),b._setProgress(2),0===c&&h)return void b._uploadExtraOnly();if(g=b.filestack.length,b.hasInitData=!1,!b.uploadAsync)return b._uploadBatch(),b.$element;for(f=b._getOutData(),b._raise("filebatchpreupload",[f]),b.fileBatchCompleted=!1,b.uploadCache={content:[],config:[],tags:[],append:!0},b.uploadAsyncCount=b.getFileStack().length,e=0;e<g;e++)b.uploadCache.content[e]=null,b.uploadCache.config[e]=null,b.uploadCache.tags[e]=null;for(e=0;e<g;e++)void 0!==b.filestack[e]&&b._uploadSingle(e,b.filestack,!0)}},destroy:function(){var a=this,c=a.$container;return c.find(".file-drop-zone").off(),a.$element.insertBefore(c).off(b).removeData(),c.off().remove(),a.$element},refresh:function(b){var c=this,d=c.$element;return b=b?a.extend(!0,{},c.options,b):c.options,c.destroy(),d.fileinput(b),d.val()&&d.trigger("change.fileinput"),d}},a.fn.fileinput=function(b){if(m()||i(9)){var c=Array.apply(null,arguments),d=[];switch(c.shift(),this.each(function(){var l,e=a(this),f=e.data("fileinput"),g="object"==typeof b&&b,h=g.theme||e.data("theme"),i={},j={},k=g.language||e.data("language")||"en";f||(h&&(j=a.fn.fileinputThemes[h]||{}),"en"===k||da(a.fn.fileinputLocales[k])||(i=a.fn.fileinputLocales[k]||{}),l=a.extend(!0,{},a.fn.fileinput.defaults,j,a.fn.fileinputLocales.en,i,g,e.data()),f=new oa(this,l),e.data("fileinput",f)),"string"==typeof b&&d.push(f[b].apply(f,c))}),d.length){case 0:return this;case 1:return d[0];default:return d}}},a.fn.fileinput.defaults={language:"en",showCaption:!0,showBrowse:!0,showPreview:!0,showRemove:!0,showUpload:!0,showCancel:!0,showClose:!0,showUploadedThumbs:!0,browseOnZoneClick:!1,autoReplace:!1,previewClass:"",captionClass:"",mainClass:"file-caption-main",mainTemplate:null,purifyHtml:!0,fileSizeGetter:null,initialCaption:"",initialPreview:[],initialPreviewDelimiter:"*$$*",initialPreviewAsData:!1,initialPreviewFileType:"image",initialPreviewConfig:[],initialPreviewThumbTags:[],previewThumbTags:{},initialPreviewShowDelete:!0,removeFromPreviewOnError:!1,deleteUrl:"",deleteExtraData:{},overwriteInitial:!0,layoutTemplates:Y,previewTemplates:Z,previewZoomSettings:$,previewZoomButtonIcons:{prev:'<i class="glyphicon glyphicon-triangle-left"></i>',next:'<i class="glyphicon glyphicon-triangle-right"></i>',toggleheader:'<i class="glyphicon glyphicon-resize-vertical"></i>',fullscreen:'<i class="glyphicon glyphicon-fullscreen"></i>',borderless:'<i class="glyphicon glyphicon-resize-full"></i>',close:'<i class="glyphicon glyphicon-remove"></i>'},previewZoomButtonClasses:{prev:"btn btn-navigate",next:"btn btn-navigate",toggleheader:"btn btn-default btn-header-toggle",fullscreen:"btn btn-default",borderless:"btn btn-default",close:"btn btn-default"},allowedPreviewTypes:_,allowedPreviewMimeTypes:null,allowedFileTypes:null,allowedFileExtensions:null,defaultPreviewContent:null,customLayoutTags:{},customPreviewTags:{},previewSettings:ba,fileTypeSettings:ca,previewFileIcon:'<i class="glyphicon glyphicon-file"></i>',previewFileIconClass:"file-other-icon",previewFileIconSettings:{},previewFileExtSettings:{},buttonLabelClass:"hidden-xs",browseIcon:'<i class="glyphicon glyphicon-folder-open"></i>&nbsp;',browseClass:"btn btn-primary",removeIcon:'<i class="glyphicon glyphicon-trash"></i>',removeClass:"btn btn-default",cancelIcon:'<i class="glyphicon glyphicon-ban-circle"></i>',cancelClass:"btn btn-default",uploadIcon:'<i class="glyphicon glyphicon-upload"></i>',uploadClass:"btn btn-default",uploadUrl:null,uploadAsync:!0,uploadExtraData:{},zoomModalHeight:480,minImageWidth:null,minImageHeight:null,maxImageWidth:null,maxImageHeight:null,resizeImage:!1,resizePreference:"width",resizeQuality:.92,resizeDefaultImageType:"image/jpeg",maxFileSize:0,maxFilePreviewSize:25600,minFileCount:0,maxFileCount:0,validateInitialCount:!1,msgValidationErrorClass:"text-danger",msgValidationErrorIcon:'<i class="glyphicon glyphicon-exclamation-sign"></i> ',msgErrorClass:"file-error-message",progressThumbClass:"progress-bar progress-bar-success progress-bar-striped active",progressClass:"progress-bar progress-bar-success progress-bar-striped active",progressCompleteClass:"progress-bar progress-bar-success",progressErrorClass:"progress-bar progress-bar-danger",progressUploadThreshold:99,previewFileType:"image",elCaptionContainer:null,elCaptionText:null,elPreviewContainer:null,elPreviewImage:null,elPreviewStatus:null,elErrorContainer:null,errorCloseButton:'<span class="close kv-error-close">&times;</span>',slugCallback:null,dropZoneEnabled:!0,dropZoneTitleClass:"file-drop-zone-title",fileActionSettings:{},otherActionButtons:"",textEncoding:"UTF-8",ajaxSettings:{},ajaxDeleteSettings:{},showAjaxErrorDetails:!0},a.fn.fileinputLocales.en={fileSingle:"file",filePlural:"files",browseLabel:"Browse &hellip;",removeLabel:"Remove",removeTitle:"Clear selected files",cancelLabel:"Cancel",cancelTitle:"Abort ongoing upload",uploadLabel:"Upload",uploadTitle:"Upload selected files",msgNo:"No",msgNoFilesSelected:"No files selected",msgCancelled:"Cancelled",msgZoomModalHeading:"Detailed Preview",msgSizeTooLarge:'File "{name}" (<b>{size} KB</b>) exceeds maximum allowed upload size of <b>{maxSize} KB</b>.',msgFilesTooLess:"You must select at least <b>{n}</b> {files} to upload.",msgFilesTooMany:"Number of files selected for upload <b>({n})</b> exceeds maximum allowed limit of <b>{m}</b>.",msgFileNotFound:'File "{name}" not found!',msgFileSecured:'Security restrictions prevent reading the file "{name}".',msgFileNotReadable:'File "{name}" is not readable.',msgFilePreviewAborted:'File preview aborted for "{name}".',msgFilePreviewError:'An error occurred while reading the file "{name}".',msgInvalidFileType:'Invalid type for file "{name}". Only "{types}" files are supported.',msgInvalidFileExtension:'Invalid extension for file "{name}". Only "{extensions}" files are supported.',msgUploadAborted:"The file upload was aborted",msgUploadThreshold:"Processing...",msgValidationError:"Validation Error",msgLoading:"Loading file {index} of {files} &hellip;",msgProgress:"Loading file {index} of {files} - {name} - {percent}% completed.",msgSelected:"{n} {files} selected",msgFoldersNotAllowed:"Drag & drop files only! {n} folder(s) dropped were skipped.",msgImageWidthSmall:'Width of image file "{name}" must be at least {size} px.',msgImageHeightSmall:'Height of image file "{name}" must be at least {size} px.',msgImageWidthLarge:'Width of image file "{name}" cannot exceed {size} px.',msgImageHeightLarge:'Height of image file "{name}" cannot exceed {size} px.',msgImageResizeError:"Could not get the image dimensions to resize.",msgImageResizeException:"Error while resizing the image.<pre>{errors}</pre>",dropZoneTitle:"Drag & drop files here &hellip;",dropZoneClickTitle:"<br>(or click to select {files})",previewZoomButtonTitles:{prev:"View previous file",next:"View next file",toggleheader:"Toggle header",fullscreen:"Toggle full screen",borderless:"Toggle borderless mode",close:"Close detailed preview"}},a.fn.fileinput.Constructor=oa,a(document).ready(function(){var b=a("input.file[type=file]");b.length&&b.fileinput()})});;
/*!
 * bootstrap-fileinput v4.3.5
 * http://plugins.krajee.com/file-input
 *
 * Font Awesome icon theme configuration for bootstrap-fileinput. Requires font awesome assets to be loaded.
 *
 * Author: Kartik Visweswaran
 * Copyright: 2014 - 2016, Kartik Visweswaran, Krajee.com
 *
 * Licensed under the BSD 3-Clause
 * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md
 */
(function ($) {
    "use strict";

    $.fn.fileinputThemes.fa = {
        fileActionSettings: {
            removeIcon: '<i class="fa fa-trash text-danger"></i>',
            uploadIcon: '<i class="fa fa-upload text-info"></i>',
            zoomIcon: '<i class="fa fa-search-plus"></i>',
            dragIcon: '<i class="fa fa-bars"></i>',
            indicatorNew: '<i class="fa fa-hand-o-down text-warning"></i>',
            indicatorSuccess: '<i class="fa fa-check-circle text-success"></i>',
            indicatorError: '<i class="fa fa-exclamation-circle text-danger"></i>',
            indicatorLoading: '<i class="fa fa-hand-o-up text-muted"></i>'
        },
        layoutTemplates: {
            fileIcon: '<i class="fa fa-file kv-caption-icon"></i> '
        },
        previewZoomButtonIcons: {
            prev: '<i class="fa fa-caret-left fa-lg"></i>',
            next: '<i class="fa fa-caret-right fa-lg"></i>',
            toggleheader: '<i class="fa fa-arrows-v"></i>',
            fullscreen: '<i class="fa fa-arrows-alt"></i>',
            borderless: '<i class="fa fa-external-link"></i>',
            close: '<i class="fa fa-remove"></i>'
        },
        previewFileIcon: '<i class="fa fa-file"></i>',
        browseIcon: '<i class="fa fa-folder-open"></i>',
        removeIcon: '<i class="fa fa-trash"></i>',
        cancelIcon: '<i class="fa fa-ban"></i>',
        uploadIcon: '<i class="fa fa-upload"></i>',
        msgValidationErrorIcon: '<i class="fa fa-exclamation-circle"></i> '
    };
})(window.jQuery);
;
/*!
 * jQuery twitter bootstrap wizard plugin
 * Examples and documentation at: http://github.com/VinceG/twitter-bootstrap-wizard
 * version 1.0
 * Requires jQuery v1.3.2 or later
 * Supports Bootstrap 2.2.x, 2.3.x, 3.0
 * Dual licensed under the MIT and GPL licenses:
 * http://www.opensource.org/licenses/mit-license.php
 * http://www.gnu.org/licenses/gpl.html
 * Authors: Vadim Vincent Gabriel (http://vadimg.com), Jason Gill (www.gilluminate.com)
 */
(function(e){var k=function(d,g){d=e(d);var a=this,b=e.extend({},e.fn.bootstrapWizard.defaults,g),f=null,c=null;this.rebindClick=function(b,a){b.unbind("click",a).bind("click",a)};this.fixNavigationButtons=function(){f.length||(c.find("a:first").tab("show"),f=c.find('li:has([data-toggle="tab"]):first'));e(b.previousSelector,d).toggleClass("disabled",a.firstIndex()>=a.currentIndex());e(b.nextSelector,d).toggleClass("disabled",a.currentIndex()>=a.navigationLength());a.rebindClick(e(b.nextSelector,d),
a.next);a.rebindClick(e(b.previousSelector,d),a.previous);a.rebindClick(e(b.lastSelector,d),a.last);a.rebindClick(e(b.firstSelector,d),a.first);if(b.onTabShow&&"function"===typeof b.onTabShow&&!1===b.onTabShow(f,c,a.currentIndex()))return!1};this.next=function(h){if(d.hasClass("last")||b.onNext&&"function"===typeof b.onNext&&!1===b.onNext(f,c,a.nextIndex()))return!1;$index=a.nextIndex();$index>a.navigationLength()||c.find('li:has([data-toggle="tab"]):eq('+$index+") a").tab("show")};this.previous=
function(h){if(d.hasClass("first")||b.onPrevious&&"function"===typeof b.onPrevious&&!1===b.onPrevious(f,c,a.previousIndex()))return!1;$index=a.previousIndex();0>$index||c.find('li:has([data-toggle="tab"]):eq('+$index+") a").tab("show")};this.first=function(h){if(b.onFirst&&"function"===typeof b.onFirst&&!1===b.onFirst(f,c,a.firstIndex())||d.hasClass("disabled"))return!1;c.find('li:has([data-toggle="tab"]):eq(0) a').tab("show")};this.last=function(h){if(b.onLast&&"function"===typeof b.onLast&&!1===
b.onLast(f,c,a.lastIndex())||d.hasClass("disabled"))return!1;c.find('li:has([data-toggle="tab"]):eq('+a.navigationLength()+") a").tab("show")};this.currentIndex=function(){return c.find('li:has([data-toggle="tab"])').index(f)};this.firstIndex=function(){return 0};this.lastIndex=function(){return a.navigationLength()};this.getIndex=function(a){return c.find('li:has([data-toggle="tab"])').index(a)};this.nextIndex=function(){return c.find('li:has([data-toggle="tab"])').index(f)+1};this.previousIndex=
function(){return c.find('li:has([data-toggle="tab"])').index(f)-1};this.navigationLength=function(){return c.find('li:has([data-toggle="tab"])').length-1};this.activeTab=function(){return f};this.nextTab=function(){return c.find('li:has([data-toggle="tab"]):eq('+(a.currentIndex()+1)+")").length?c.find('li:has([data-toggle="tab"]):eq('+(a.currentIndex()+1)+")"):null};this.previousTab=function(){return 0>=a.currentIndex()?null:c.find('li:has([data-toggle="tab"]):eq('+parseInt(a.currentIndex()-1)+")")};
this.show=function(a){return d.find('li:has([data-toggle="tab"]):eq('+a+") a").tab("show")};this.disable=function(a){c.find('li:has([data-toggle="tab"]):eq('+a+")").addClass("disabled")};this.enable=function(a){c.find('li:has([data-toggle="tab"]):eq('+a+")").removeClass("disabled")};this.hide=function(a){c.find('li:has([data-toggle="tab"]):eq('+a+")").hide()};this.display=function(a){c.find('li:has([data-toggle="tab"]):eq('+a+")").show()};this.remove=function(a){var b="undefined"!=typeof a[1]?a[1]:
!1;a=c.find('li:has([data-toggle="tab"]):eq('+a[0]+")");b&&(b=a.find("a").attr("href"),e(b).remove());a.remove()};c=d.find("ul:first",d);f=c.find('li:has([data-toggle="tab"]).active',d);c.hasClass(b.tabClass)||c.addClass(b.tabClass);if(b.onInit&&"function"===typeof b.onInit)b.onInit(f,c,0);if(b.onShow&&"function"===typeof b.onShow)b.onShow(f,c,a.nextIndex());a.fixNavigationButtons();e('a[data-toggle="tab"]',c).on("click",function(d){d=c.find('li:has([data-toggle="tab"])').index(e(d.currentTarget).parent('li:has([data-toggle="tab"])'));
if(b.onTabClick&&"function"===typeof b.onTabClick&&!1===b.onTabClick(f,c,a.currentIndex(),d))return!1});e('a[data-toggle="tab"]',c).on("shown shown.bs.tab",function(d){$element=e(d.target).parent();d=c.find('li:has([data-toggle="tab"])').index($element);if($element.hasClass("disabled")||b.onTabChange&&"function"===typeof b.onTabChange&&!1===b.onTabChange(f,c,a.currentIndex(),d))return!1;f=$element;a.fixNavigationButtons()})};e.fn.bootstrapWizard=function(d){if("string"==typeof d){var g=Array.prototype.slice.call(arguments,
1);1===g.length&&g.toString();return this.data("bootstrapWizard")[d](g)}return this.each(function(a){a=e(this);if(!a.data("bootstrapWizard")){var b=new k(a,d);a.data("bootstrapWizard",b)}})};e.fn.bootstrapWizard.defaults={tabClass:"nav nav-pills",nextSelector:".wizard li.next",previousSelector:".wizard li.previous",firstSelector:".wizard li.first",lastSelector:".wizard li.last",onShow:null,onInit:null,onNext:null,onPrevious:null,onLast:null,onFirst:null,onTabChange:null,onTabClick:null,onTabShow:null}})(jQuery);
;
function initEvergreenAlert(projectGuidId)
{    
    if ($("#" + projectGuidId) != null && $("#" + projectGuidId).getKendoDropDownList() != null) {
        $("#" + projectGuidId).getKendoDropDownList().bind("change", EvergreenProjectChanged);
        $("#" + projectGuidId).getKendoDropDownList().bind("dataBound", EvergreenProjectChanged);
    }

    var currEvergreenProjectGuid = null;
    function EvergreenProjectChanged() {
        var projectGuid = null;
        if ($("#" + projectGuidId).getKendoDropDownList().dataItem() != null) {
            projectGuid = $("#" + projectGuidId).getKendoDropDownList().dataItem().Guid;
        }
        if (projectGuid == null || projectGuid == jQuery.Guid.Empty()) {
            $("#aEvergreenAlert_" + projectGuidId).remove();
            return; // no project selected
        }
        var url = '/project/getProjectDTO/' + projectGuid;
        if (projectGuid == currEvergreenProjectGuid || projectGuid == null) return; // do not call twice.
        else {
            currEvergreenProjectGuid = projectGuid;
        }
        //get project and show alert            
        $.get(url, null, function (data) {
            //see if evergreenIsAlert equals true and show evergreen alert.
            if (data != null && data.EvergreenIsAlert) {
                if ($("#aEvergreenAlert_" + projectGuidId).length > 0) {
                    $("#aEvergreenAlert_" + projectGuidId).remove();
                }
                $(".projectComboBox.k-dropdown").after('</br></br><a target="_blank" href="/Project/Details/' + data.Guid + '" id="aEvergreenAlert_' + projectGuidId + '" class="evergreen-alert-label label label-danger"><i class="fa fa-exclamation-triangle" title="Evergreen Alert!"></i> Matter retainer is below the set evergreen amount</a>');
                $("#aEvergreenAlert_" + projectGuidId).pulsate({ color: "#ed4e2a", repeat: 3 });
            }
            else {
                $("#aEvergreenAlert_" + projectGuidId).remove();
            }
        });
    }

}


;
var PPActionTracking = (function () {
    // [_logActionTrackingEventsToJSConsole] defaults to false, but can be set to true for Dev/QA purposes.
    var _logActionTrackingEventsToJSConsole = false;
    /**
     * [_bindEventListeners] is more or less the init method for this namespace.
     * Finds elements with specific HTML attributes within the given [actionArea].
     * Due to the async loading behavior of some of our grid components, we call _bindEventListeners multiple times
     * as the async controls load, but it's designed to be ran multiple times without binding duplicate event listeners.
     */
    function _bindEventListeners(elementSelector) {
        try {
            var actionAreaElement = $(elementSelector).closest('[data-action-tracking-area]');
            if (actionAreaElement.length > 0) {
                var actionArea = $(actionAreaElement).data('action-tracking-area');
                if (actionArea && actionArea.length > 0) {
                    _bindClickListeners(actionAreaElement, actionArea, 'data-action-tracking-onclick');
                    /* Non-click event listeners:
                     * Covers DDL changes, custom dialog submissions, grid events, etc.
                     * Elements are assumed to be rendered in the DOM for this functionality. */
                    _bindNonClickEventListeners(actionAreaElement, actionArea, 'data-action-tracking-kendo-dropdownlist-onchange');
                    _bindNonClickEventListeners(actionAreaElement, actionArea, 'data-action-tracking-pp-tags-selector-onchange');
                    _bindNonClickEventListeners(actionAreaElement, actionArea, 'data-action-tracking-pp-grid-search-onchange');
                    _bindNonClickEventListeners(actionAreaElement, actionArea, 'data-action-tracking-bootstrap-daterangepicker-onchange');
                    _bindNonClickEventListeners(actionAreaElement, actionArea, 'data-action-tracking-kendogrid');                    
                }
                else {
                    console.warn('PPActionTracking._bindEventListeners - Action tracking area value not defined. Arguments:', arguments);
                }                  
            }
            else {
                console.info('PPActionTracking._bindEventListeners - Action tracking area element not found. Arguments:', arguments);
            }
        }
        catch (error) {
            console.error('PPActionTracking._bindEventListeners - Error thrown. Arguments:', arguments, 'Error:', error);
        }
    }
    /* Click event listeners:
     * Covers contextMenus and keyboard hotkeys to select/activate some clickable elements as well.
     * Covers pagination on grids or other elements that aren't even rendered yet. 
     * We are only assuming that the given [containerElement] is rendered the DOM when this method runs. */
    function _bindClickListeners(containerElement, actionArea, type) {
        try {
            var isAlreadyBound = $(containerElement).attr(`${type}-listeners-bound`);
            if (!isAlreadyBound) {
                $(containerElement).on('click', `[data-action-tracking-name][${type}]`, function (clickEvent) {
                    _handleClickEvent(actionArea, clickEvent);
                });
                // For elements that look like hyperlinks, watch for the user to open the contextMenu.
                $(containerElement).on('contextmenu', `[data-action-tracking-name][${type}][href]`, function (contextMenuEvent) {
                    var actionName = _getActionNameFromElement(contextMenuEvent.target);
                    _callActionTrack(actionArea, `LinkContextMenuOpen.${actionName}`);
                });
                // For elements that look like hyperlinks, watch for keyboard events that activate the link.
                $(containerElement).on('keydown', `[data-action-tracking-name][${type}][href]`, function (keydownEvent) {
                    if (keydownEvent.code === "Enter") {
                        var actionName = _getActionNameFromElement(keydownEvent.target);
                        _callActionTrack(actionArea, `EnterKeyPress.${actionName}`);
                    }                    
                });
                $(containerElement).attr(`${type}-listeners-bound`, true);
            }
        }
        catch (error) {
            console.error('PPActionTracking._bindClickListeners - Error thrown. Arguments:', arguments, 'Error:', error);
        }
    }

    function _handleClickEvent(actionArea, clickEvent) {
        var actionName = _getActionNameFromElement(clickEvent.target);
        var clickType = 'Click';
        // Clicks with some keys pressed with open links in new tab, a new window, etc.
        if (clickEvent.altKey) {
            clickType += '.AltKey';
        }
        if (clickEvent.ctrlKey) {
            clickType += '.CtrlKey';
        }
        if (clickEvent.shiftKey) {
            clickType += '.ShiftKey';
        }
        _callActionTrack(actionArea, `${clickType}.${actionName}`);
    }

    /* Non-click event listeners:
     * Covers DDL changes, custom dialog submissions, grid events, etc.
     * Elements are assumed to be rendered in the DOM for the event listener binding functionality to work. */
    function _bindNonClickEventListeners(actionAreaElement, actionArea, type) {
        try {
            $(actionAreaElement).find(`[data-action-tracking-name][${type}]`).each(function (index, loopedElement) {
                var isAlreadyBound = $(loopedElement).attr(`${type}-listeners-bound`);
                if (!isAlreadyBound) {
                    var actionName = _getActionNameFromElement(loopedElement);
                    switch (type) {
                        case 'data-action-tracking-kendo-dropdownlist-onchange':                            
                            _kendoDropdownListBindEventListeners(actionArea, actionName, loopedElement);
                            break;
                        case 'data-action-tracking-pp-tags-selector-onchange':
                            $(loopedElement).on('PP.SelectTagsForNavBar.Change', function () {
                                _callActionTrack(actionArea, actionName);
                            });
                            break;
                        case 'data-action-tracking-pp-grid-search-onchange':
                            _gridSearchBindEventListeners(actionArea, actionName, loopedElement);
                            break;
                        case 'data-action-tracking-bootstrap-daterangepicker-onchange':
                            // https://www.daterangepicker.com/ used in Views/Shared/EditorTemplates/DateRange.cshtml                                
                            $(loopedElement).on('apply.daterangepicker', function () {
                                _callActionTrack(actionArea, actionName);
                            });
                            break;
                        case 'data-action-tracking-kendogrid':
                            _kendoGridBindEventListeners(`${actionArea}.${actionName}`, loopedElement);
                            break;
                    }
                    $(loopedElement).attr(`${type}-listeners-bound`, true);
                }
            });
        }
        catch (error) {
            console.error('PPActionTracking._bindNonClickEventListeners - Error thrown. Arguments:', arguments, 'Error:', error);
        }
    }

    function _kendoDropdownListBindEventListeners(actionArea, actionName, loopedElement) {
        $(loopedElement).getKendoDropDownList().bind('change', function (event) {
            /* [skipActionTracking] would be true here if some other button is automatically changing the Kendo DDL
             * when the user clicks that button, like the stat boxes on the top of the Activities grid. 
             * We don't want to log the same event twice. */
            if (!event.skipActionTracking) {
                _callActionTrack(actionArea, actionName);
            }
        });
    }

    function _gridSearchBindEventListeners(actionArea, actionName, searchElement) {
        $(searchElement).on('PP.SearchGrid.Change', function (event, value) {
            var searchLength = '';
            if (value.length >= 50) { searchLength = '50+Chars' }
            else if (value.length >= 20) { searchLength = '20+Chars' }
            else if (value.length >= 10) { searchLength = '10+Chars' }
            else if (value.length >= 6) { searchLength = '6+Chars' }
            else if (value.length > 1) { searchLength = `${value.length}Chars` }
            else if (value.length == 1) { searchLength = `${value.length}Char` }
            else { searchLength = 'Empty' }
            _callActionTrack(actionArea, `${actionName}:${searchLength}`);
        });
    }

    function _kendoGridBindEventListeners(actionArea, gridElement) {
        try {
            var kendoGrid = $(gridElement).getKendoGrid();
            kendoGrid.bind('columnHide', function (event) {
                _callActionTrack(actionArea, `ColumnHide.${event.column.field}`);
            });
            kendoGrid.bind('columnReorder', function (event) {
                _callActionTrack(actionArea, `ColumnReorder.${event.column.field}`);
            });
            kendoGrid.bind('columnResize', function (event) {
                _callActionTrack(actionArea, `ColumnResize.${event.column.field}`);
            });
            kendoGrid.bind('columnShow', function (event) {
                _callActionTrack(actionArea, `ColumnShow.${event.column.field}`);
            });
            kendoGrid.bind('excelExport', function () {
                _callActionTrack(actionArea, 'ExcelExport');
            });
            kendoGrid.bind('filter', function (event) {
                _handleKendoGridFilterEvent(actionArea, event);
            });
            kendoGrid.bind('group', function (event) {
                _handleKendoGridGroupEvent(actionArea, event);
            });
            kendoGrid.bind('groupCollapse', function (event) {
                _callActionTrack(actionArea, `GroupCollapse.${event.group.field}`);
            });
            kendoGrid.bind('groupExpand', function (event) {
                _callActionTrack(actionArea, `GroupExpand.${event.group.field}`);
            });
            kendoGrid.bind('page', function (event) {
                _handleKendoGridPageEvent(actionArea, kendoGrid, event);                
            });
            kendoGrid.bind('pdfExport', function () {
                _callActionTrack(actionArea, 'PdfExport');
            });
            kendoGrid.bind('sort', function (event) {
                _callActionTrack(actionArea, `Sort.${event.sort.field}`);
            });
            /* [...-kendogrid-onclick] was created as a special case for elements that are to be clicked within the
             * grid that have e.stopPropagation behavior. One example of the e.stopPropagation scenario is
             * the .checkSingle checkboxes on the grid for batch editing.
             * ----
             * We try to use this [...-kendogrid-onclick] attr on any element inside of the grid though because it
             * helps with the tracking names be more descriptive about where it originated. */
            _bindClickListeners(gridElement, actionArea, 'data-action-tracking-kendogrid-onclick');
        }
        catch (error) {
            console.error('PPActionTracking._kendoGridBindEventListeners - Error thrown. Arguments:', arguments, 'Error:', error);
        }
    }

    function _handleKendoGridFilterEvent(actionArea, event) {
        if (event.filter !== null) {
            // Log a string like: 'ConflictSearch.Activities.Grid.Filter.Name.startswith.and.contains'
            var formattedFilters = [];
            event.filter.filters.forEach(function (loopedFilter) {
                formattedFilters.push(loopedFilter.operator);
            });
            var formattedFilterLogic = `.${event.filter.logic}.`
            _callActionTrack(actionArea, `ColumnFilter.${event.field}:${formattedFilters.join(formattedFilterLogic)}`);
        }
        else {
            _callActionTrack(actionArea, `ColumnFilter.${event.field}:Clear`);
        }
    }

    function _handleKendoGridGroupEvent(actionArea, event) {
        if (event.groups.length > 0) {
            // Log a string like: 'ConflictSearch.Activities.Grid.Group.Project.desc.Account.asc'
            var formattedGroups = [];
            event.groups.forEach(function (loopedGroup) {
                formattedGroups.push(`${loopedGroup.field}:${loopedGroup.dir}`);
            });
            _callActionTrack(actionArea, `Group.${formattedGroups.join('.')}`);
        }
        else {
            _callActionTrack(actionArea, 'Group:Clear');
        }
    }

    function _handleKendoGridPageEvent(actionArea, kendoGrid, event) {
        // Log a string like: 'ConflictSearch.Activities.Grid.Page.Page:10+.PageSize:25'
        var actionName = '';
        var pageNumber = parseInt(event.page);
        if (pageNumber != 0) {
            if (pageNumber >= 100) { actionName = 'Page:100+'; }
            else if (pageNumber >= 50) { actionName = 'Page:50+'; }
            else if (pageNumber >= 25) { actionName = 'Page:25+'; }
            else if (pageNumber >= 10) { actionName = 'Page:10+'; }
            else if (pageNumber >= 6) { actionName = 'Page:6+'; }
            else { actionName = `Page:${pageNumber}`; }

            _callActionTrack(actionArea, `${actionName}.PageSize:${kendoGrid.dataSource.pageSize()}`);
        }
    }

    function _getActionNameFromElement(element) {
        var actionName = $(element)
            .closest('[data-action-tracking-name]')
            .data('action-tracking-name');

        if (actionName && actionName.length > 0) {
            return actionName;
        }
        else {
            var message = 'PPActionTracking._getActionNameFromElement - Action tracking name not found';
            console.warn(`${message}. Arguments:`, arguments);
            throw new Error(message);
        }
    }

    function _callActionTrack(actionArea, actionName) {
        var fullActionName = `${actionArea}.${actionName}`;
        callMixpanelTrack(fullActionName);
        if (_logActionTrackingEventsToJSConsole) {
            console.log('PPActionTracking._callActionTrack:', fullActionName);
        }
    }

    return {
        BindEventListeners: _bindEventListeners,
        SetConsoleLogFlag: function (flag) {
            _logActionTrackingEventsToJSConsole = flag;
        }
    }
})();;
