").attr("name",c.submitButton.name).val(a(c.submitButton).val()).appendTo(c.currentForm)),!c.settings.submitHandler||(e=c.settings.submitHandler.call(c,c.currentForm,b),d&&d.remove(),void 0!==e&&e)}return c.settings.debug&&b.preventDefault(),c.cancelSubmit?(c.cancelSubmit=!1,d()):c.form()?c.pendingRequest?(c.formSubmitted=!0,!1):d():(c.focusInvalid(),!1)})),c)},valid:function(){var b,c,d;return a(this[0]).is("form")?b=this.validate().form():(d=[],b=!0,c=a(this[0].form).validate(),this.each(function(){b=c.element(this)&&b,b||(d=d.concat(c.errorList))}),c.errorList=d),b},rules:function(b,c){var d,e,f,g,h,i,j=this[0];if(null!=j&&(!j.form&&j.hasAttribute("contenteditable")&&(j.form=this.closest("form")[0],j.name=this.attr("name")),null!=j.form)){if(b)switch(d=a.data(j.form,"validator").settings,e=d.rules,f=a.validator.staticRules(j),b){case"add":a.extend(f,a.validator.normalizeRule(c)),delete f.messages,e[j.name]=f,c.messages&&(d.messages[j.name]=a.extend(d.messages[j.name],c.messages));break;case"remove":return c?(i={},a.each(c.split(/\s/),function(a,b){i[b]=f[b],delete f[b]}),i):(delete e[j.name],f)}return g=a.validator.normalizeRules(a.extend({},a.validator.classRules(j),a.validator.attributeRules(j),a.validator.dataRules(j),a.validator.staticRules(j)),j),g.required&&(h=g.required,delete g.required,g=a.extend({required:h},g)),g.remote&&(h=g.remote,delete g.remote,g=a.extend(g,{remote:h})),g}}}),a.extend(a.expr.pseudos||a.expr[":"],{blank:function(b){return!a.trim(""+a(b).val())},filled:function(b){var c=a(b).val();return null!==c&&!!a.trim(""+c)},unchecked:function(b){return!a(b).prop("checked")}}),a.validator=function(b,c){this.settings=a.extend(!0,{},a.validator.defaults,b),this.currentForm=c,this.init()},a.validator.format=function(b,c){return 1===arguments.length?function(){var c=a.makeArray(arguments);return c.unshift(b),a.validator.format.apply(this,c)}:void 0===c?b:(arguments.length>2&&c.constructor!==Array&&(c=a.makeArray(arguments).slice(1)),c.constructor!==Array&&(c=[c]),a.each(c,function(a,c){b=b.replace(new RegExp("\\{"+a+"\\}","g"),function(){return c})}),b)},a.extend(a.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",pendingClass:"pending",validClass:"valid",errorElement:"label",focusCleanup:!1,focusInvalid:!0,errorContainer:a([]),errorLabelContainer:a([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,onfocusin:function(a){this.lastActive=a,this.settings.focusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(a)))},onfocusout:function(a){this.checkable(a)||!(a.name in this.submitted)&&this.optional(a)||this.element(a)},onkeyup:function(b,c){var d=[16,17,18,20,35,36,37,38,39,40,45,144,225];9===c.which&&""===this.elementValue(b)||a.inArray(c.keyCode,d)!==-1||(b.name in this.submitted||b.name in this.invalid)&&this.element(b)},onclick:function(a){a.name in this.submitted?this.element(a):a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).addClass(c).removeClass(d):a(b).addClass(c).removeClass(d)},unhighlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).removeClass(c).addClass(d):a(b).removeClass(c).addClass(d)}},setDefaults:function(b){a.extend(a.validator.defaults,b)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",equalTo:"Please enter the same value again.",maxlength:a.validator.format("Please enter no more than {0} characters."),minlength:a.validator.format("Please enter at least {0} characters."),rangelength:a.validator.format("Please enter a value between {0} and {1} characters long."),range:a.validator.format("Please enter a value between {0} and {1}."),max:a.validator.format("Please enter a value less than or equal to {0}."),min:a.validator.format("Please enter a value greater than or equal to {0}."),step:a.validator.format("Please enter a multiple of {0}.")},autoCreateRanges:!1,prototype:{init:function(){function b(b){!this.form&&this.hasAttribute("contenteditable")&&(this.form=a(this).closest("form")[0],this.name=a(this).attr("name"));var c=a.data(this.form,"validator"),d="on"+b.type.replace(/^validate/,""),e=c.settings;e[d]&&!a(this).is(e.ignore)&&e[d].call(c,this,b)}this.labelContainer=a(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||a(this.currentForm),this.containers=a(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var c,d=this.groups={};a.each(this.settings.groups,function(b,c){"string"==typeof c&&(c=c.split(/\s/)),a.each(c,function(a,c){d[c]=b})}),c=this.settings.rules,a.each(c,function(b,d){c[b]=a.validator.normalizeRule(d)}),a(this.currentForm).on("focusin.validate focusout.validate keyup.validate",":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], [type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], [type='radio'], [type='checkbox'], [contenteditable], [type='button']",b).on("click.validate","select, option, [type='radio'], [type='checkbox']",b),this.settings.invalidHandler&&a(this.currentForm).on("invalid-form.validate",this.settings.invalidHandler)},form:function(){return this.checkForm(),a.extend(this.submitted,this.errorMap),this.invalid=a.extend({},this.errorMap),this.valid()||a(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(b){var c,d,e=this.clean(b),f=this.validationTargetFor(e),g=this,h=!0;return void 0===f?delete this.invalid[e.name]:(this.prepareElement(f),this.currentElements=a(f),d=this.groups[f.name],d&&a.each(this.groups,function(a,b){b===d&&a!==f.name&&(e=g.validationTargetFor(g.clean(g.findByName(a))),e&&e.name in g.invalid&&(g.currentElements.push(e),h=g.check(e)&&h))}),c=this.check(f)!==!1,h=h&&c,c?this.invalid[f.name]=!1:this.invalid[f.name]=!0,this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),a(b).attr("aria-invalid",!c)),h},showErrors:function(b){if(b){var c=this;a.extend(this.errorMap,b),this.errorList=a.map(this.errorMap,function(a,b){return{message:a,element:c.findByName(b)[0]}}),this.successList=a.grep(this.successList,function(a){return!(a.name in b)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){a.fn.resetForm&&a(this.currentForm).resetForm(),this.invalid={},this.submitted={},this.prepareForm(),this.hideErrors();var b=this.elements().removeData("previousValue").removeAttr("aria-invalid");this.resetElements(b)},resetElements:function(a){var b;if(this.settings.unhighlight)for(b=0;a[b];b++)this.settings.unhighlight.call(this,a[b],this.settings.errorClass,""),this.findByName(a[b].name).removeClass(this.settings.validClass);else a.removeClass(this.settings.errorClass).removeClass(this.settings.validClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b,c=0;for(b in a)void 0!==a[b]&&null!==a[b]&&a[b]!==!1&&c++;return c},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(a){a.not(this.containers).text(""),this.addWrapper(a).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{a(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").focus().trigger("focusin")}catch(b){}},findLastActive:function(){var b=this.lastActive;return b&&1===a.grep(this.errorList,function(a){return a.element.name===b.name}).length&&b},elements:function(){var b=this,c={};return a(this.currentForm).find("input, select, textarea, [contenteditable]").not(":submit, :reset, :image, :disabled").not(this.settings.ignore).filter(function(){var d=this.name||a(this).attr("name");return!d&&b.settings.debug&&window.console&&console.error("%o has no name assigned",this),this.hasAttribute("contenteditable")&&(this.form=a(this).closest("form")[0],this.name=d),!(d in c||!b.objectLength(a(this).rules()))&&(c[d]=!0,!0)})},clean:function(b){return a(b)[0]},errors:function(){var b=this.settings.errorClass.split(" ").join(".");return a(this.settings.errorElement+"."+b,this.errorContext)},resetInternals:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=a([]),this.toHide=a([])},reset:function(){this.resetInternals(),this.currentElements=a([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(a){this.reset(),this.toHide=this.errorsFor(a)},elementValue:function(b){var c,d,e=a(b),f=b.type;return"radio"===f||"checkbox"===f?this.findByName(b.name).filter(":checked").val():"number"===f&&"undefined"!=typeof b.validity?b.validity.badInput?"NaN":e.val():(c=b.hasAttribute("contenteditable")?e.text():e.val(),"file"===f?"C:\\fakepath\\"===c.substr(0,12)?c.substr(12):(d=c.lastIndexOf("/"),d>=0?c.substr(d+1):(d=c.lastIndexOf("\\"),d>=0?c.substr(d+1):c)):"string"==typeof c?c.replace(/\r/g,""):c)},check:function(b){b=this.validationTargetFor(this.clean(b));var c,d,e,f,g=a(b).rules(),h=a.map(g,function(a,b){return b}).length,i=!1,j=this.elementValue(b);if("function"==typeof g.normalizer?f=g.normalizer:"function"==typeof this.settings.normalizer&&(f=this.settings.normalizer),f){if(j=f.call(b,j),"string"!=typeof j)throw new TypeError("The normalizer should return a string value.");delete g.normalizer}for(d in g){e={method:d,parameters:g[d]};try{if(c=a.validator.methods[d].call(this,j,b,e.parameters),"dependency-mismatch"===c&&1===h){i=!0;continue}if(i=!1,"pending"===c)return void(this.toHide=this.toHide.not(this.errorsFor(b)));if(!c)return this.formatAndAdd(b,e),!1}catch(k){throw this.settings.debug&&window.console&&console.log("Exception occurred when checking element "+b.id+", check the '"+e.method+"' method.",k),k instanceof TypeError&&(k.message+=". Exception occurred when checking element "+b.id+", check the '"+e.method+"' method."),k}}if(!i)return this.objectLength(g)&&this.successList.push(b),!0},customDataMessage:function(b,c){return a(b).data("msg"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase())||a(b).data("msg")},customMessage:function(a,b){var c=this.settings.messages[a];return c&&(c.constructor===String?c:c[b])},findDefined:function(){for(var a=0;aWarning: No message defined for "+b.name+""),e=/\$?\{(\d+)\}/g;return"function"==typeof d?d=d.call(this,c.parameters,b):e.test(d)&&(d=a.validator.format(d.replace(e,"{$1}"),c.parameters)),d},formatAndAdd:function(a,b){var c=this.defaultMessage(a,b);this.errorList.push({message:c,element:a,method:b.method}),this.errorMap[a.name]=c,this.submitted[a.name]=c},addWrapper:function(a){return this.settings.wrapper&&(a=a.add(a.parent(this.settings.wrapper))),a},defaultShowErrors:function(){var a,b,c;for(a=0;this.errorList[a];a++)c=this.errorList[a],this.settings.highlight&&this.settings.highlight.call(this,c.element,this.settings.errorClass,this.settings.validClass),this.showLabel(c.element,c.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight)for(a=0,b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return a(this.errorList).map(function(){return this.element})},showLabel:function(b,c){var d,e,f,g,h=this.errorsFor(b),i=this.idOrName(b),j=a(b).attr("aria-describedby");h.length?(h.removeClass(this.settings.validClass).addClass(this.settings.errorClass),h.html(c)):(h=a("<"+this.settings.errorElement+">").attr("id",i+"-error").addClass(this.settings.errorClass).html(c||""),d=h,this.settings.wrapper&&(d=h.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.length?this.labelContainer.append(d):this.settings.errorPlacement?this.settings.errorPlacement.call(this,d,a(b)):d.insertAfter(b),h.is("label")?h.attr("for",i):0===h.parents("label[for='"+this.escapeCssMeta(i)+"']").length&&(f=h.attr("id"),j?j.match(new RegExp("\\b"+this.escapeCssMeta(f)+"\\b"))||(j+=" "+f):j=f,a(b).attr("aria-describedby",j),e=this.groups[b.name],e&&(g=this,a.each(g.groups,function(b,c){c===e&&a("[name='"+g.escapeCssMeta(b)+"']",g.currentForm).attr("aria-describedby",h.attr("id"))})))),!c&&this.settings.success&&(h.text(""),"string"==typeof this.settings.success?h.addClass(this.settings.success):this.settings.success(h,b)),this.toShow=this.toShow.add(h)},errorsFor:function(b){var c=this.escapeCssMeta(this.idOrName(b)),d=a(b).attr("aria-describedby"),e="label[for='"+c+"'], label[for='"+c+"'] *";return d&&(e=e+", #"+this.escapeCssMeta(d).replace(/\s+/g,", #")),this.errors().filter(e)},escapeCssMeta:function(a){return a.replace(/([\\!"#$%&'()*+,.\/:;<=>?@\[\]^`{|}~])/g,"\\$1")},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},validationTargetFor:function(b){return this.checkable(b)&&(b=this.findByName(b.name)),a(b).not(this.settings.ignore)[0]},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(b){return a(this.currentForm).find("[name='"+this.escapeCssMeta(b)+"']")},getLength:function(b,c){switch(c.nodeName.toLowerCase()){case"select":return a("option:selected",c).length;case"input":if(this.checkable(c))return this.findByName(c.name).filter(":checked").length}return b.length},depend:function(a,b){return!this.dependTypes[typeof a]||this.dependTypes[typeof a](a,b)},dependTypes:{"boolean":function(a){return a},string:function(b,c){return!!a(b,c.form).length},"function":function(a,b){return a(b)}},optional:function(b){var c=this.elementValue(b);return!a.validator.methods.required.call(this,c,b)&&"dependency-mismatch"},startRequest:function(b){this.pending[b.name]||(this.pendingRequest++,a(b).addClass(this.settings.pendingClass),this.pending[b.name]=!0)},stopRequest:function(b,c){this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],a(b).removeClass(this.settings.pendingClass),c&&0===this.pendingRequest&&this.formSubmitted&&this.form()?(a(this.currentForm).submit(),this.submitButton&&a("input:hidden[name='"+this.submitButton.name+"']",this.currentForm).remove(),this.formSubmitted=!1):!c&&0===this.pendingRequest&&this.formSubmitted&&(a(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},previousValue:function(b,c){return c="string"==typeof c&&c||"remote",a.data(b,"previousValue")||a.data(b,"previousValue",{old:null,valid:!0,message:this.defaultMessage(b,{method:c})})},destroy:function(){this.resetForm(),a(this.currentForm).off(".validate").removeData("validator").find(".validate-equalTo-blur").off(".validate-equalTo").removeClass("validate-equalTo-blur")}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(b,c){b.constructor===String?this.classRuleSettings[b]=c:a.extend(this.classRuleSettings,b)},classRules:function(b){var c={},d=a(b).attr("class");return d&&a.each(d.split(" "),function(){this in a.validator.classRuleSettings&&a.extend(c,a.validator.classRuleSettings[this])}),c},normalizeAttributeRule:function(a,b,c,d){/min|max|step/.test(c)&&(null===b||/number|range|text/.test(b))&&(d=Number(d),isNaN(d)&&(d=void 0)),d||0===d?a[c]=d:b===c&&"range"!==b&&(a[c]=!0)},attributeRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)"required"===c?(d=b.getAttribute(c),""===d&&(d=!0),d=!!d):d=f.attr(c),this.normalizeAttributeRule(e,g,c,d);return e.maxlength&&/-1|2147483647|524288/.test(e.maxlength)&&delete e.maxlength,e},dataRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)d=f.data("rule"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase()),this.normalizeAttributeRule(e,g,c,d);return e},staticRules:function(b){var c={},d=a.data(b.form,"validator");return d.settings.rules&&(c=a.validator.normalizeRule(d.settings.rules[b.name])||{}),c},normalizeRules:function(b,c){return a.each(b,function(d,e){if(e===!1)return void delete b[d];if(e.param||e.depends){var f=!0;switch(typeof e.depends){case"string":f=!!a(e.depends,c.form).length;break;case"function":f=e.depends.call(c,c)}f?b[d]=void 0===e.param||e.param:(a.data(c.form,"validator").resetElements(a(c)),delete b[d])}}),a.each(b,function(d,e){b[d]=a.isFunction(e)&&"normalizer"!==d?e(c):e}),a.each(["minlength","maxlength"],function(){b[this]&&(b[this]=Number(b[this]))}),a.each(["rangelength","range"],function(){var c;b[this]&&(a.isArray(b[this])?b[this]=[Number(b[this][0]),Number(b[this][1])]:"string"==typeof b[this]&&(c=b[this].replace(/[\[\]]/g,"").split(/[\s,]+/),b[this]=[Number(c[0]),Number(c[1])]))}),a.validator.autoCreateRanges&&(null!=b.min&&null!=b.max&&(b.range=[b.min,b.max],delete b.min,delete b.max),null!=b.minlength&&null!=b.maxlength&&(b.rangelength=[b.minlength,b.maxlength],delete b.minlength,delete b.maxlength)),b},normalizeRule:function(b){if("string"==typeof b){var c={};a.each(b.split(/\s/),function(){c[this]=!0}),b=c}return b},addMethod:function(b,c,d){a.validator.methods[b]=c,a.validator.messages[b]=void 0!==d?d:a.validator.messages[b],c.length<3&&a.validator.addClassRules(b,a.validator.normalizeRule(b))},methods:{required:function(b,c,d){if(!this.depend(d,c))return"dependency-mismatch";if("select"===c.nodeName.toLowerCase()){var e=a(c).val();return e&&e.length>0}return this.checkable(c)?this.getLength(b,c)>0:b.length>0},email:function(a,b){return this.optional(b)||/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(a)},url:function(a,b){return this.optional(b)||/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[\/?#]\S*)?$/i.test(a)},date:function(a,b){return this.optional(b)||!/Invalid|NaN/.test(new Date(a).toString())},dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(a)},number:function(a,b){return this.optional(b)||/^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},minlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e>=d},maxlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e<=d},rangelength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e>=d[0]&&e<=d[1]},min:function(a,b,c){return this.optional(b)||a>=c},max:function(a,b,c){return this.optional(b)||a<=c},range:function(a,b,c){return this.optional(b)||a>=c[0]&&a<=c[1]},step:function(b,c,d){var e,f=a(c).attr("type"),g="Step attribute on input type "+f+" is not supported.",h=["text","number","range"],i=new RegExp("\\b"+f+"\\b"),j=f&&!i.test(h.join()),k=function(a){var b=(""+a).match(/(?:\.(\d+))?$/);return b&&b[1]?b[1].length:0},l=function(a){return Math.round(a*Math.pow(10,e))},m=!0;if(j)throw new Error(g);return e=k(d),(k(b)>e||l(b)%l(d)!==0)&&(m=!1),this.optional(c)||m},equalTo:function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(".validate-equalTo-blur").length&&e.addClass("validate-equalTo-blur").on("blur.validate-equalTo",function(){a(c).valid()}),b===e.val()},remote:function(b,c,d,e){if(this.optional(c))return"dependency-mismatch";e="string"==typeof e&&e||"remote";var f,g,h,i=this.previousValue(c,e);return this.settings.messages[c.name]||(this.settings.messages[c.name]={}),i.originalMessage=i.originalMessage||this.settings.messages[c.name][e],this.settings.messages[c.name][e]=i.message,d="string"==typeof d&&{url:d}||d,h=a.param(a.extend({data:b},d.data)),i.old===h?i.valid:(i.old=h,f=this,this.startRequest(c),g={},g[c.name]=b,a.ajax(a.extend(!0,{mode:"abort",port:"validate"+c.name,dataType:"json",data:g,context:f.currentForm,success:function(a){var d,g,h,j=a===!0||"true"===a;f.settings.messages[c.name][e]=i.originalMessage,j?(h=f.formSubmitted,f.resetInternals(),f.toHide=f.errorsFor(c),f.formSubmitted=h,f.successList.push(c),f.invalid[c.name]=!1,f.showErrors()):(d={},g=a||f.defaultMessage(c,{method:e,parameters:b}),d[c.name]=i.message=g,f.invalid[c.name]=!0,f.showErrors(d)),i.valid=j,f.stopRequest(c,j)}},d)),"pending")}}});var b,c={};return a.ajaxPrefilter?a.ajaxPrefilter(function(a,b,d){var e=a.port;"abort"===a.mode&&(c[e]&&c[e].abort(),c[e]=d)}):(b=a.ajax,a.ajax=function(d){var e=("mode"in d?d:a.ajaxSettings).mode,f=("port"in d?d:a.ajaxSettings).port;return"abort"===e?(c[f]&&c[f].abort(),c[f]=b.apply(this,arguments),c[f]):b.apply(this,arguments)}),a});!function(e){var n;if("function"==typeof define&&define.amd&&(define(e),n=!0),"object"==typeof exports&&(module.exports=e(),n=!0),!n){var t=window.Cookies,o=window.Cookies=e();o.noConflict=function(){return window.Cookies=t,o}}}(function(){function e(){for(var e=0,n={};e
Cùng Tothost tìm hiểu về Application Server và những điểm nổi bật của nó thông qua bài viết này nhé!
Mục lục
Mục lục
1. Application Server là gì?
Application server là một thuật ngữ chỉ một phần mềm máy chủ ứng dụng chịu trách nhiệm cung cấp các ứng dụng phần mềm cho các máy trạm hoặc thiết bị, thường thông qua mạng Internet và sử dụng giao thức HTML.
Một cách đơn giản để hiểu về Application server là coi nó như một khuôn khổ phần mềm, tạo ra môi trường cho nhiều ứng dụng chạy một cách linh hoạt, không bị ràng buộc bởi tính chất của chúng.
Nhờ vào Application server, chúng ta có thể tận hưởng những ứng dụng phong phú và tương tác trực tuyến qua Internet, đáp ứng nhu cầu ngày càng cao về việc sử dụng các ứng dụng trên nền tảng trực tuyến một cách thuận tiện và linh hoạt.
1.1. Lịch sử hình thành
Trước đây, các ứng dụng thường được lưu trữ trên những máy tính lớn, được gọi là mainframe, và từ đó chuyển tới các trạm truy cập, hay còn gọi là terminal. Những máy chủ lớn này thường chỉ phục vụ cho các tổ chức quy mô lớn, như chính phủ, ngân hàng và các tập đoàn khổng lồ.
Thập kỷ 60 đánh dấu sự xuất hiện của máy tính mini. Những máy tính mini này nhỏ gọn, yếu đuối và giá rẻ hơn rất nhiều so với mainframe. Dù vậy, vẫn tiếp tục sử dụng các trạm truy cập để tương tác với các ứng dụng.
Tiến tới thập kỷ 80, sự xuất hiện của máy tính cá nhân đã làm đảo lộn thị trường. Và thập kỷ 90, sự ra đời của kiến trúc máy chủ – máy trạm khiến người dùng càng thêm ấn tượng. Trong mô hình này, các ứng dụng được lưu trữ trên máy chủ, trong khi máy trạm đóng vai trò như giao diện cho người dùng.
Sau đó, vào giữa thập kỷ 90, với sự bùng nổ của Internet, mô hình phần mềm máy chủ ứng dụng tiếp tục được phát triển. Điều này đưa tới việc các ứng dụng có thể được truy cập và sử dụng thông qua mạng Internet, mở ra một thời đại mới của ứng dụng trực tuyến.
1.2. Thành phần của một máy chủ ứng dụng
Application Server có những thành phần quan trọng nào? Hiện tại, hệ thống máy chủ ứng dụng của chúng ta bao gồm hai thành phần chính:
Hệ điều hành máy chủ (OS): Đây là phần mềm quản lý và điều phối các tài nguyên của máy chủ, giúp nó hoạt động một cách hiệu quả và ổn định. Hệ điều hành đảm bảo các ứng dụng và dịch vụ trên máy chủ có thể hoạt động một cách đáng tin cậy.
Phần cứng máy chủ: Đây là các thành phần vật lý của máy chủ, bao gồm bộ vi xử lý, bộ nhớ, ổ cứng, các card mạng và các thành phần khác. Phần cứng máy chủ đóng vai trò quan trọng trong việc đáp ứng nhu cầu xử lý và lưu trữ của ứng dụng.
Hai thành phần này hoạt động song song và hỗ trợ nhau, tạo nên môi trường cung cấp các hoạt động và dịch vụ chuyên sâu về máy tính để ứng dụng có thể hoạt động một cách tốt nhất.
Một Application Server có nhiệm vụ thực thi và cung cấp ứng dụng cho người dùng hoặc các ứng dụng khác, sử dụng các logic nghiệp vụ và chức năng đã được cài đặt trước đó. Các gói phần mềm này thường được viết bằng ngôn ngữ lập trình Java và chạy trên hệ thống Windows NT. Application Server hoạt động như một kết nối trung gian giữa người dùng trình duyệt cuối cùng và cơ sở dữ liệu, nơi chứa thông tin mà họ cần truy cập.
2. Quy trình hoạt động của Application Server
Máy chủ ứng dụng hoạt động theo quy trình như sau: Ban đầu, thông qua giao thức có sẵn của ứng dụng, máy chủ ứng dụng sẽ tiến hành giải mã dữ liệu từ các ứng dụng trên máy khách. Đồng thời, nhiệm vụ của Application Server cũng là cung cấp truy cập cho ứng dụng của máy khách và xử lý dữ liệu đó bằng các giải thuật tương ứng. Các chương trình trong ứng dụng sẽ sử dụng các giải thuật này như một phương pháp xử lý các đối tượng.
3. Tính năng của Application Server
Dưới đây là những tính năng đáng chú ý của Application Server:
Khả năng kết nối và truy cập từ xa: Ứng dụng này cho phép kết nối từ xa thông qua hệ thống mạng nội bộ của doanh nghiệp hoặc internet. Điều này giúp người dùng dễ dàng tiếp cận và làm việc với ứng dụng từ bất kỳ địa điểm nào.
Quản lý người sử dụng: Đây là một tính năng nổi bật của Application Server cho phép các nhà quản lý có kiểm soát và theo dõi người dùng đã truy cập vào hệ thống của họ. Việc này giúp tăng cường bảo mật và quản lý chặt chẽ người dùng và quyền truy cập dữ liệu.
Bảo mật dữ liệu: Application Server đảm bảo tính an toàn tuyệt đối cho dữ liệu của người dùng, giảm nguy cơ mất dữ liệu trong quá trình sử dụng. Điều này làm tăng sự tin tưởng và đảm bảo rằng thông tin quan trọng không rơi vào tay sai người.
Tính sẵn sàng cao: Hệ thống luôn duy trì dữ liệu dự phòng và có tính sẵn sàng cao cùng với cân bằng tải hoàn hảo. Điều này đảm bảo rằng hệ thống luôn hoạt động ổn định và giúp người dùng có trải nghiệm sử dụng mượt mà và không bị gián đoạn.
Nhờ vào những tính năng đa dạng và tiện ích, Application Server trở thành một công cụ quan trọng và hữu ích trong việc cung cấp các dịch vụ ứng dụng hiệu quả và đáng tin cậy cho người dùng.
4. Lợi ích mang lại
Đây là những lợi ích chính mà nó mang lại cho người dùng:
Toàn vẹn dữ liệu và mã nguồn: Bằng cách tập trung xử lý logic vào một hay một số máy chủ phần cứng, ứng dụng được cập nhật và nâng cấp cho toàn bộ người sử dụng, đảm bảo tính đồng nhất trong quá trình sử dụng. Điều này giúp tránh gặp phải các vấn đề như việc sử dụng phiên bản cũ của ứng dụng hoặc thông tin lỗi thời và không còn phù hợp.
Hiệu suất cao: Application Server có thể hạn chế lưu lượng mạng đối với lưu lượng hiển thị, dẫn đến hiệu suất cao nếu được sử dụng hiệu quả.
Hỗ trợ Website, thương mại điện tử và cộng tác tích hợp web: Application Server cung cấp hỗ trợ đáng tin cậy cho các dự án website, thương mại điện tử và tích hợp cộng tác trên nền tảng web.
Tập trung vào cấu hình: Ứng dụng có thể dễ dàng thay đổi cấu hình tùy theo nhu cầu sử dụng của người dùng, giúp tùy chỉnh và điều chỉnh hệ thống linh hoạt và dễ dàng.
Tái sử dụng thành phần hệ cơ sở dữ liệu: Application Server cho phép tái sử dụng các thành phần của hệ cơ sở dữ liệu, giúp tiết kiệm thời gian và công sức trong quá trình phát triển ứng dụng.
Tích hợp với hệ thống và cơ sở dữ liệu hiện có: Ưu điểm khác của Application Server là khả năng tích hợp với những hệ thống và cơ sở dữ liệu đã tồn tại, giúp tối ưu hóa sự tương tác giữa các ứng dụng và dữ liệu có sẵn.
5. Những phần mềm của máy chủ ứng dụng
Hiện nay, máy chủ ứng dụng (Application Server) đang cung cấp một loạt phần mềm đa dạng và hấp dẫn cho người dùng. Dưới đây, chúng ta sẽ tìm hiểu chi tiết về những phần mềm máy chủ ứng dụng, bao gồm cả phần mềm dành cho nền tảng Java và Microsoft, cùng với những phần các nhà cung cấp khác phát triển.
5.1. Phần mềm máy chủ ứng dụng Java
Trong lĩnh vực máy chủ ứng dụng Java, có một số phiên bản Enterprise phổ biến và được sử dụng rộng rãi như sau:
WebLogic Server (BEA)
JBoss (Red Hat)
WebSphere Application Server và WebSphere Application Server Community Edition (IBM)
JRun (Adobe)
Apache Geronimo (Apache Software Foundation)
Oracle OC4J (Oracle Corporation)
Sun Java System Application Server (Sun Microsystems)
SAP Web Application Server và Glassfish Application Server (dựa trên Java System Application Server của SUN).
Các phần mềm máy chủ ứng dụng Java hiện đang hoạt động dựa trên nền tảng Java™2, phiên bản doanh nghiệp (J2EE™) với mô hình phân tán nhiều tầng, giúp thực hiện các yêu cầu của người dùng một cách hiệu quả.
Mô hình máy chủ ứng dụng Java thường bao gồm:
Tầng hệ thống thông tin doanh nghiệp (EIS) bao gồm các ứng dụng, tệp và cơ sở dữ liệu hiện có.
Tầng giữa sử dụng nền tảng J2EE với một máy chủ web và một máy chủ EJB thực hiện các nhiệm vụ cấp phụ bổ sung ở tầng trung gian. Để sử dụng nền tảng J2EE, yêu cầu phải có một cơ sở dữ liệu có thể truy cập thông qua JDO API, SQLJ hoặc JDBC.
Tầng khách hàng có thể bao gồm một hoặc nhiều ứng dụng hoặc trình duyệt.
5.2. Phần mềm máy chủ ứng dụng Microsoft
Trong lĩnh vực máy chủ ứng dụng Microsoft, phần mềm máy chủ ứng dụng NET Framework bao gồm:
Windows Communication Foundatio
.NET Remoting
Microsoft Message Queuing
ASP.NET
ADO.NET
Internet Information Services (IIS)
Apache Server (cung cấp bởi bên thứ ba)
5.3. Các nền tảng khác
Ngoài hai phần mềm trên, còn có các phần mềm máy chủ ứng dụng mã nguồn mở do các nhà cung cấp khác phát triển, ví dụ như Zope, Base4, và Appserver.
Tùy thuộc vào yêu cầu cụ thể và tính chất dự án, người dùng có thể lựa chọn các phần mềm máy chủ ứng dụng phù hợp để triển khai ứng dụng và dịch vụ một cách hiệu quả. Việc sử dụng phần mềm máy chủ ứng dụng sẽ hỗ trợ việc xây dựng, quản lý và vận hành các ứng dụng và hệ thống trên mạng một cách hiệu quả và đáng tin cậy.
Một trong những điểm khác biệt đáng chú ý giữa Application Server và Web Server là khả năng của Application Server sử dụng nhiều nội dung do chính máy chủ tạo ra và được tích hợp chặt chẽ đến Database Server. Các phần mềm máy chủ ứng dụng thường được sử dụng trong các lĩnh vực trung gian (middleware) để hỗ trợ các ứng dụng giao tiếp với nhau. Ngoài ra, một số phần mềm Application Server còn cung cấp API (giao diện lập trình ứng dụng) cho phép chúng hoạt động độc lập với hệ điều hành.
Lời kết
Tóm lại, Application Server và Web Server phục vụ các mục đích khác nhau trong việc xử lý yêu cầu và phản hồi của ứng dụng web, với Application Server chịu trách nhiệm xử lý các giao dịch phức tạp và tương tác cơ sở dữ liệu, trong khi Web Server tập trung vào cung cấp các tệp tĩnh và phản hồi các yêu cầu HTTP từ trình duyệt.
Việc thay đổi mật khẩu là biện pháp quan trọng để tăng cường bảo mật và tránh được những rủi ro không mong muốn. Do đó, bước đầu tiên nên làm sau khi đăng ký dịch vụ là đổi mật khẩu. Bạn hãy làm theo hướng dẫn của TotHost để thay đổi mật khẩu trên server Linux nhé!
Ứng dụng Điện toán đám mây (Cloud Computing) là sử dụng công nghệ đám mây phục vụ cho nhiều công việc khác nhau, được kết nối qua internet. Đám mây mang lại lợi thế bao gồm khả năng mở rộng, tính linh hoạt, hiệu quả chi phí, bảo mật và đổi mới cho các tổ chức ở mọi quy mô và lĩnh vực. Do đó, nó được các tổ chức áp dụng để đạt được mục tiêu và giải quyết các vấn đề của họ.Dưới đây là Top 10 ứng dụng phổ biến nhất của điện toán đám mây.
Nếu bạn đang thắc mắc liệu có nên chuyển đổi sang Điện toán đám mây (Cloud Computing) hay vẫn nên chọn on-premise thì bài viết này sẽ giúp bạn hiểu rõ hơn về những lợi ích của việc chuyển đổi này.
Khi bạn kết nối máy tính hoặc thiết bị của mình với internet, bạn cần có địa chỉ IP. Địa chỉ IP có hai loại phân bổ: động và tĩnh. Tại bài viết này, TotHost sẽ hướng dẫn bạn Cách kiểm tra địa chỉ IP bạn đang sử dụng là động hay tĩnh.
cPanel là một control panel – hệ thống quản trị web hosting phổ biến và mạnh mẽ nhất hiện nay, hoạt động dựa trên nền tảng Linux. Nó có giao diện đơn giản, linh hoạt hỗ trợ quản trị hosting và website một cách dễ dàng. Tại đây, TotHost sẽ hướng dẫn bạn cách tạo Backup và Restore trên cPanel.
Hiện nay, công nghệ trí tuệ nhân tạo đang bùng nổ mạnh mẽ tạo ra những tiềm năng to lớn trong nhiều lĩnh vực trong cuộc sống. Để làm được điều đó thì không thể thiếu AI tạo sinh (Generative AI). Vậy, Gen AI là gì? Nó có đóng góp gì trong thực tiễn? Hãy cùng tìm hiểu qua bài viết này nhé!